diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.classpath b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.classpath
new file mode 100644
index 0000000..dc57898
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="generated"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.gitignore b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.gitignore
new file mode 100644
index 0000000..5e56e04
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.gitignore
@@ -0,0 +1 @@
+/bin
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.project b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.project
new file mode 100644
index 0000000..1578e3b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.egf.emf.pattern</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.egf.pattern.ui.PatternBuilder</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.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.egf.core.EGFNature</nature>
+	</natures>
+</projectDescription>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.settings/org.eclipse.jdt.core.prefs b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..db85bda
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Mon May 03 11:37:29 CEST 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/META-INF/MANIFEST.MF b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..112a63c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.egf.emf.pattern;singleton:=true
+Bundle-Version: 1.6.1.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: 
+ org.eclipse.egf.emf.pattern.edit,
+ org.eclipse.egf.emf.pattern.edit.call.ItemProvider,
+ org.eclipse.egf.emf.pattern.editor,
+ org.eclipse.egf.emf.pattern.editor.call.Editor,
+ org.eclipse.egf.emf.pattern.model,
+ org.eclipse.egf.emf.pattern.model.call.Class,
+ org.eclipse.egf.emf.pattern.model.call.Interface,
+ org.eclipse.egf.emf.pattern.model.call.ResourceFactoryClass,
+ org.eclipse.egf.emf.pattern.model.call.ValidatorClass,
+ org.eclipse.egf.emf.pattern.tests,
+ org.eclipse.egf.emf.pattern.tests.call.TestCase
+Require-Bundle: 
+ org.eclipse.egf.model.fprod,
+ org.eclipse.egf.pattern.jet,
+ org.eclipse.egf.emf.pattern.base;visibility:=reexport,
+ org.eclipse.egf.model.ftask;visibility:=reexport,
+ org.eclipse.egf.pattern;visibility:=reexport,
+ org.eclipse.egf.pattern.ftask;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/about.html b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/about.html
new file mode 100644
index 0000000..7e766fe
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/about.html
@@ -0,0 +1,26 @@
+<!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>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" 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 ("Redistributor") 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/platform_specific/2019-09/org.eclipse.egf.emf.pattern/about.ini b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/about.ini
new file mode 100644
index 0000000..46e430d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/about.ini
@@ -0,0 +1,30 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=EGF (Eclipse Generation Factories) is a software factory tool with the purpose to generate software artifacts, such as code or application, in order to automate software development.\n\
+\n\Copyright (c) 2009, 2019 Thales Global Services\n\.  All rights reserved.\n\n\
+Visit http://eclipse.org/egf
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=egf.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (not translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
+
+# Property "tipsAndTricksHref" contains the Help topic href to a tips and tricks page 
+# optional
+# tipsAndTricksHref=/org.eclipse.jdt.doc.user/tips/jdt_tips.html
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/build.properties b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/build.properties
new file mode 100644
index 0000000..dd0ef98
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/build.properties
@@ -0,0 +1,25 @@
+##
+#  Copyright (c) 2009-2019 Thales Corporate Services S.A.S.
+#
+#  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
+# 
+#  Contributors:
+#      Thales Corporate Services S.A.S - initial API and implementation
+##
+source.. = generated/
+output.. = bin/
+bin.includes = META-INF/,\
+               templates/,\
+               .,\
+               about.html,\
+               plugin.properties,\
+               plugin.xml,\
+               egf/,\
+               egf.png,\
+               about.ini
+src.includes = about.html
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/egf.png b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/egf.png
new file mode 100644
index 0000000..cf6a65c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/egf.png
Binary files differ
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore
new file mode 100644
index 0000000..5774790
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore
@@ -0,0 +1,6807 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:domain="http://www.eclipse.org/egf/1.0.0/domain"
+    xmlns:fcore="http://www.eclipse.org/egf/1.0.0/fcore" xmlns:fprod="http://www.eclipse.org/egf/1.0.0/fprod"
+    xmlns:ftask="http://www.eclipse.org/egf/1.0.0/ftask" xmlns:jetpattern="http://www.eclipse.org/egf/1.0.0/jetpattern"
+    xmlns:pattern="http://www.eclipse.org/egf/1.0.0/pattern" xmlns:types="http://www.eclipse.org/egf/1.0.0/types">
+  <fcore:FactoryComponent xmi:id="_Pcm9sDG0Ed-kc8dEZsdm2w" name="EMF Model Pattern">
+    <contractContainer xmi:id="_Prg8ZDG0Ed-kc8dEZsdm2w">
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Prg8ZTG0Ed-kc8dEZsdm2w"
+          description="EMF Model Pattern" name="genModel" mandatory="true" invocationContracts="#_tNEmwId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeDomain" xmi:id="_tOHvoId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_WRxYEFIIEd-eGOdO3WtsxA"
+          description="EMF Model Pattern" name="pattern.execution.reporter" invocationContracts="#_tO0TMId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tPhd0Id1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_TxwAHVkTEd-bv5aydwO2Qw"
+          description="EMF Model Pattern" name="pattern.ids" invocationContracts="#_tQPPgId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternList" xmi:id="_tQ7zEId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_OVsagFHVEd-dr9AWwNwIMQ"
+          description="EMF Model Pattern" name="pattern.substitutions" invocationContracts="#_tRl6YId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternSubstitution" xmi:id="_tSTsEId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_RcQCMPI7Ed-Pp8S8RvVOuQ"
+          description="EMF Model Pattern" name="usedGenPackages" invocationContracts="#_tS-acId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeGenPackages" xmi:id="_tTq-AId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_sluXsVLLEd-ZSLMRjxSbVQ"
+          description="EMF Model Pattern" name="mergeRulesURI" invocationContracts="#_tUW6gId1EemTGPCEQmMGWg">
+        <type xmi:type="types:TypeURI" xmi:id="_tVC3AId1EemTGPCEQmMGWg"/>
+      </contracts>
+    </contractContainer>
+    <viewpointContainer xmi:id="_Pcm9sTG0Ed-kc8dEZsdm2w">
+      <viewpoints xmi:type="pattern:PatternViewpoint" xmi:id="_Pcm9sjG0Ed-kc8dEZsdm2w">
+        <libraries xmi:id="_Pcm9szG0Ed-kc8dEZsdm2w" name="org.eclipse.egf.emf.pattern.model">
+          <elements xmi:id="_Pcm9tDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/build.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="BuildProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pcm9tjG0Ed-kc8dEZsdm2w" conditionMethod="#_8vBvNHLYEd-09ds9dfYpFw"
+              initMethod="#_Pcm9tzG0Ed-kc8dEZsdm2w" footerMethod="#_Pcm9uTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Slu7wId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pcm9tjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pcm9tzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_8vBvNHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._8vBvNHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pcm9uTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9uTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PcwusDG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Sq2-OGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Sq2-OGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_06ILSWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._06ILSWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PcwusjG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusjG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_So5kgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_SqHsgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_SquJcId1EemTGPCEQmMGWg"
+                called="#_PcwusjG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_SrBrcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_SrT_UId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PdDpoDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/manifest.mfjet&quot;&#xA;"
+              name="ManifestMF" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PdDpojG0Ed-kc8dEZsdm2w" conditionMethod="#_8qZt5HLYEd-09ds9dfYpFw"
+              initMethod="#_PdDpozG0Ed-kc8dEZsdm2w" footerMethod="#_PdDppTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_S53YsId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PdDpojG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpojG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdDpozG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpozG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_8qZt5HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._8qZt5HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PdDppTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdDppzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SrAvOGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._SrAvOGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_05rfVmKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._05rfVmKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PdDpqTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpqTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_S8yJ0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_S98ncId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_S-lgoId1EemTGPCEQmMGWg"
+                called="#_PdDpqTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_S-30gId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_S_LWgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PdNaoDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/plugin.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="PluginXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PdNaojG0Ed-kc8dEZsdm2w" conditionMethod="#_8mrriXLYEd-09ds9dfYpFw"
+              initMethod="#_PdNaozG0Ed-kc8dEZsdm2w" footerMethod="#_PdXLoTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_SsGCcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PdNaojG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaojG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdNaozG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaozG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_8mrriXLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._8mrriXLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PdXLoTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLoTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdXLozG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLozG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SqaSS2KPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._SqaSS2KPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_06R8SWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._06R8SWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PdXLpTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLpTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_SvJ9gId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_SwYFgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Sw97YId1EemTGPCEQmMGWg"
+                called="#_PdXLpTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_SxQ2UId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_SxjxQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PdgVkDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/plugin.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="PluginProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_xxtwkCg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PdgVkjG0Ed-kc8dEZsdm2w" conditionMethod="#_8zCshHLYEd-09ds9dfYpFw"
+              initMethod="#_PdgVkzG0Ed-kc8dEZsdm2w" footerMethod="#_PdgVlTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_S_69YId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PdgVkjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdgVkzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_8zCshHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._8zCshHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PdgVlTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdgVlzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SrTqKGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._SrTqKGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_06k3OWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._06k3OWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PdgVmTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVmTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TC1HcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TEGSwId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_pQ16sChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TErhkId1EemTGPCEQmMGWg"
+                called="#_PdgVmTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TE91cId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TFQJUId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PdzQgDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/PackageClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="PackageClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PdzQgjG0Ed-kc8dEZsdm2w" conditionMethod="#_89Lf9HLYEd-09ds9dfYpFw"
+              initMethod="#_PdzQgzG0Ed-kc8dEZsdm2w" footerMethod="#_PdzQhTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_T8ONkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PdzQgjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdzQgzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_89Lf9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._89Lf9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PdzQhTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PdzQhzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_StPj2GKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._StPj2GKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_09HN2WKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._09HN2WKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PdzQiTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQiTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_T_GicId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UAPx8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UA0ZsId1EemTGPCEQmMGWg"
+                called="#_PdzQiTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UBHUoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UBaPkId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PeP8cDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/XMLProcessorClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="XMLProcessorClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PeP8cjG0Ed-kc8dEZsdm2w" conditionMethod="#_9hr7NHLYEd-09ds9dfYpFw"
+              initMethod="#_PeP8czG0Ed-kc8dEZsdm2w" footerMethod="#_PeP8dTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_T2Ty0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PeP8cjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8cjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PeP8czG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8czG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9hr7NHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._9hr7NHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PeP8dTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PeP8dzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SspG4mKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._SspG4mKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0767AmKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._0767AmKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PeP8eTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8eTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_T5N84Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_T6XMYId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_T67NEId1EemTGPCEQmMGWg"
+                called="#_PeP8eTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_T7Ng8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_T7fNwId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PejecDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Plugin.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="Plugin" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PejecjG0Ed-kc8dEZsdm2w" conditionMethod="#_9fJklHLYEd-09ds9dfYpFw"
+              initMethod="#_PejeczG0Ed-kc8dEZsdm2w" footerMethod="#_PejedTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TR5eMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PejecjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejecjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PejeczG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeczG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9fJklHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._9fJklHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PejedTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PejedzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SsWL8WKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._SsWL8WKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_07nZCWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._07nZCWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PejeeTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeeTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TU02YId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TV-s8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TWj7wId1EemTGPCEQmMGWg"
+                called="#_PejeeTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TW2PoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TXJKkId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PesoYDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/ResourceFactoryClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.model.call.ResourceFactoryClass.ResourceFactoryClass.createResource.override&#xA;"
+              name="ResourceFactoryClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PesoYjG0Ed-kc8dEZsdm2w" conditionMethod="#_9AAxhHLYEd-09ds9dfYpFw"
+              initMethod="#_PesoYzG0Ed-kc8dEZsdm2w" footerMethod="#_PesoZTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TwPnEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PesoYjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PesoYzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9AAxhHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._9AAxhHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PesoZTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PesoZzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_StFy12KPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._StFy12KPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_063yImKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._063yImKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PesoaTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoaTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TzFfsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_T0U10Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_T05dkId1EemTGPCEQmMGWg"
+                called="#_PesoaTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_T1MYgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_T1fTcId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pe_jUDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.interface.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.declaredFieldGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.egfCustom.constructor.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicDelegation&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.reflectiveDelegation.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeatureReified.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.eUnset.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.eIsSet.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.insert&#xA;"
+              name="Class" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_hYG6UCg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pe_jUjG0Ed-kc8dEZsdm2w" conditionMethod="#_9DSvBHLYEd-09ds9dfYpFw"
+              initMethod="#_Pe_jUzG0Ed-kc8dEZsdm2w" footerMethod="#_Pe_jVTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TkHPkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pe_jUjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pe_jUzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9DSvBHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._9DSvBHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pe_jVTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pe_jVzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Sr5gCGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Sr5gCGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_08EE9mKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._08EE9mKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pe_jWTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jWTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TnBZoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ToOTgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ToyUMId1EemTGPCEQmMGWg"
+                called="#_Pe_jWTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TpGdQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TpZ_QId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PfcPQDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/FactoryClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="FactoryClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PfcPQjG0Ed-kc8dEZsdm2w" conditionMethod="#_9cLJFHLYEd-09ds9dfYpFw"
+              initMethod="#_PfcPQzG0Ed-kc8dEZsdm2w" footerMethod="#_PfcPRTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UCLEkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PfcPQjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PfcPQzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9cLJFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._9cLJFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PfcPRTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PfcPRzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_StZU2GKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._StZU2GKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_07LUKWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._07LUKWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PfmAQTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfmAQTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_UFGcwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UGVy4Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UG7BsId1EemTGPCEQmMGWg"
+                called="#_PfmAQTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UHN8oId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UHgQgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pf47MDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/EnumClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="EnumClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_txlYcCg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pf47MjG0Ed-kc8dEZsdm2w" conditionMethod="#_9QQM9HLYEd-09ds9dfYpFw"
+              initMethod="#_Pf47MzG0Ed-kc8dEZsdm2w" footerMethod="#_Pf47NTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UIP3YId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pf47MjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pf47MzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9QQM9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._9QQM9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pf47NTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pf47NzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SrwWGGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._SrwWGGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_07UeGWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._07UeGWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pf47OTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47OTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ULJaYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UMTQ8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UM5G0Id1EemTGPCEQmMGWg"
+                called="#_Pf47OTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UNLasId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UNeVoId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PgCsMDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/PackageClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="PackageInterface" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PgCsMjG0Ed-kc8dEZsdm2w" conditionMethod="#_9S7thHLYEd-09ds9dfYpFw"
+              initMethod="#_PgCsMzG0Ed-kc8dEZsdm2w" footerMethod="#_PgCsNTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TeBOoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PgCsMjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PgCsMzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9S7thHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._9S7thHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PgCsNTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsNTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PgL2IDG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Ssf88WKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._Ssf88WKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_08zr2WKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._08zr2WKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PgL2IjG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IjG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Tg_qIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TiKu0Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TiwksId1EemTGPCEQmMGWg"
+                called="#_PgL2IjG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TjC4kId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TjWakId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PgVnIDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/FactoryClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="FactoryInterface" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PgVnIjG0Ed-kc8dEZsdm2w" conditionMethod="#_9HAxZHLYEd-09ds9dfYpFw"
+              initMethod="#_PgVnIzG0Ed-kc8dEZsdm2w" footerMethod="#_PgVnJTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UOQYwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PgVnIjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PgVnIzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9HAxZHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._9HAxZHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PgVnJTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PgVnJzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_StsPyGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._StsPyGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_08N1-WKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._08N1-WKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PgVnKTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnKTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_URQpcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UScVMId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UTBkAId1EemTGPCEQmMGWg"
+                called="#_PgVnKTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UTVGAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UTooAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PgoiEDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/ResourceClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="ResourceClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PgoiEjG0Ed-kc8dEZsdm2w" conditionMethod="#_85wYhHLYEd-09ds9dfYpFw"
+              initMethod="#_PgoiEzG0Ed-kc8dEZsdm2w" footerMethod="#_PgoiFTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UUcgUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PgoiEjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PgoiEzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_85wYhHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._85wYhHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PgoiFTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PgoiFzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SsDRCGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._SsDRCGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_08qh6WKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._08qh6WKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PgoiGTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiGTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_UXaUwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UZ2kwId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UacaoId1EemTGPCEQmMGWg"
+                called="#_PgoiGTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UauugId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UbCQgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pg8EEDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.interface.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.declaredFieldGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.egfCustom.constructor.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicDelegation&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.reflectiveDelegation.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeatureReified.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.eUnset.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.eIsSet.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.insert&#xA;"
+              name="Interface" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_hYG6UCg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pg8EEjG0Ed-kc8dEZsdm2w" conditionMethod="#_9Kva1HLYEd-09ds9dfYpFw"
+              initMethod="#_Pg8EEzG0Ed-kc8dEZsdm2w" footerMethod="#_Pg8EFTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TGAXQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pg8EEjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pg8EEzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9Kva1HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._9Kva1HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pg8EFTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pg8EFzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SrmlGGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._SrmlGGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_08Xm-WKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._08Xm-WKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pg8EGTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EGTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TI5TMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TKCisId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TKl8UId1EemTGPCEQmMGWg"
+                called="#_Pg8EGTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TK3CEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TLJV8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PhO_ADG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/AdapterFactoryClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="AdapterFactoryClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PhO_AjG0Ed-kc8dEZsdm2w" conditionMethod="#_9Wzg5HLYEd-09ds9dfYpFw"
+              initMethod="#_PhO_AzG0Ed-kc8dEZsdm2w" footerMethod="#_PhO_BTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TqLbUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PhO_AjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PhO_AzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9Wzg5HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._9Wzg5HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PhO_BTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PhO_BzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Ssy372KPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._Ssy372KPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_089c2WKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._089c2WKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PhO_CTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_CTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TtGMcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TuSfQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Tu4VIId1EemTGPCEQmMGWg"
+                called="#_PhO_CTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TvLQEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TveyEId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Phh58DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/SwitchClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="SwitchClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Phh58jG0Ed-kc8dEZsdm2w" conditionMethod="#_82LgFHLYEd-09ds9dfYpFw"
+              initMethod="#_Phh58zG0Ed-kc8dEZsdm2w" footerMethod="#_Phh59TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TL8AIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Phh58jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Phh58zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_82LgFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._82LgFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Phh59TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Phh59zG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_StieyGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._StieyGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_07BjKWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._07BjKWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Phh5-TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh5-TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_TO2KMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TQAn0Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TQl2oId1EemTGPCEQmMGWg"
+                called="#_Phh5-TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_TQ3jcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TRKeYId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Ph004DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/ValidatorClass.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.model.call.ValidatorClass.ValidatorClass.insert&#xA;"
+              name="ValidatorClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Ph004jG0Ed-kc8dEZsdm2w" conditionMethod="#_9Nt2VHLYEd-09ds9dfYpFw"
+              initMethod="#_Ph004zG0Ed-kc8dEZsdm2w" footerMethod="#_Ph005TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_TX5YgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Ph004jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Ph004zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9Nt2VHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._9Nt2VHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Ph005TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Ph005zG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SspG8mKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._SspG8mKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_07ePGWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._07ePGWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Ph006TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph006TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Ta0wsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TcAccId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Tcm5YId1EemTGPCEQmMGWg"
+                called="#_Ph006TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Tc5NQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_TdK6EId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_QIGxoH7rEd-W9_ZFSEQEPg" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/module.gwt.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="ModuleGWTXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_QIGxon7rEd-W9_ZFSEQEPg" conditionMethod="#_QIGxpH7rEd-W9_ZFSEQEPg"
+              initMethod="#_QIGxo37rEd-W9_ZFSEQEPg" footerMethod="#_QIGxpn7rEd-W9_ZFSEQEPg">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_SyV0YId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_QIGxon7rEd-W9_ZFSEQEPg" name="header" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxon7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxo37rEd-W9_ZFSEQEPg" name="init" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxo37rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxpH7rEd-W9_ZFSEQEPg" name="preCondition" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxpn7rEd-W9_ZFSEQEPg" name="footer" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxqH7rEd-W9_ZFSEQEPg" name="setReporterVariables"
+                patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxqX7rEd-W9_ZFSEQEPg" name="setArgument" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqX7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxqn7rEd-W9_ZFSEQEPg" name="ensureProjectExists" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QIGxrH7rEd-W9_ZFSEQEPg" name="doGenerate" patternFilePath="templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxrH7rEd-W9_ZFSEQEPg.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_S2yPgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_S3_wcId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_S4k_QId1EemTGPCEQmMGWg"
+                called="#_QIGxrH7rEd-W9_ZFSEQEPg"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_S436MId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_S5I_8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_0uqqgGJ-Ed-FqczH3ESmRw" name="org.eclipse.egf.emf.pattern.model.call.ResourceFactoryClass">
+          <elements xmi:id="_0uqqgWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/ResourceFactoryClass.javajet&quot;&#xA;"
+              name="ResourceFactoryClass.createResource.override" headerMethod="#_0uqqg2J-Ed-FqczH3ESmRw"
+              conditionMethod="#_--X7pXLYEd-09ds9dfYpFw" initMethod="#_0uqqhGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0uqqhmJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_pe2BgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0uqqg2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqg2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uqqhGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_--X7pXLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._--X7pXLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0uqqhmJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uqqimJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqimJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_pilSAId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_pi7QQId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_pjScoId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_piRI8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_pkA1YId1EemTGPCEQmMGWg"
+                called="#_0uqqimJ-Ed-FqczH3ESmRw"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_0jpGTWJ-Ed-FqczH3ESmRw" name="org.eclipse.egf.emf.pattern.model.call.Class">
+          <elements xmi:id="_0jpGTmJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.declaredFieldGenFeature.insert&#xA;"
+              name="Class.declaredFieldGenFeature.override" headerMethod="#_0jpGUGJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__Dly1XLYEd-09ds9dfYpFw" initMethod="#_0jpGUWJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0jpGU2J-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_gqeo4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0jpGUGJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0jpGUWJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__Dly1XLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method.__Dly1XLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0jpGU2J-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGU2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0jpGYGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGYGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_gt_P4Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_guTY8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_guoJEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_gu8SIId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_gvRpUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gvlyYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gv57cId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gwNdcId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_gwhmgId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gw29sId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gxMU4Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gxi6MId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gx3DQId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_gyLzYId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gygjgId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gy0FgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gzI1oId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_gtqfwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_gzyV4Id1EemTGPCEQmMGWg"
+                called="#_0jpGYGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0jyQMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.declaredFieldGenFeature.insert" headerMethod="#_0jyQMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__Fq2dHLYEd-09ds9dfYpFw" initMethod="#_0jyQM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0jyQNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_g0guoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0jyQMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0jyQM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__Fq2dHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method.__Fq2dHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0jyQNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0jyQQmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQQmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_g3-5YId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_g4TCcId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_g4nLgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_g477oId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_g5QEsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_g5kNwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_g5494Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_g6NG8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_g6h3EId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_g63OQId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_g7OaoId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_g7jKwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_g74h8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_g8NSEId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_g8g0EId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_g8zvAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_g9HRAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_g3qwUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_g9u8EId1EemTGPCEQmMGWg"
+                called="#_0jyQQmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0kFyMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.reflectiveDelegation.override" headerMethod="#_0kFyMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__IDcFHLYEd-09ds9dfYpFw" initMethod="#_0kFyM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0kFyNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_hTfJoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0kFyMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kFyM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__IDcFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method.__IDcFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0kFyNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kFyQWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyQWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_hW8tUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_hXQPUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_hXjxUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_hX3TUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hYLcYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hYe-YId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hYzugId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_hZH3kId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hZcAoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hZwwwId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_haFg4Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_haZp8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_hatzAId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hbB8EId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hbWFIId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hbq1QId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_hWokQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_hcSgUId1EemTGPCEQmMGWg"
+                called="#_0kFyQWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0kO8IGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeature.insert&#xA;"
+              name="Class.genFeature.override" headerMethod="#_0kO8ImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__LCepHLYEd-09ds9dfYpFw" initMethod="#_0kO8I2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0kO8JWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_iQgLgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0kO8ImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8ImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kO8I2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8I2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__LCepHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method.__LCepHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0kO8JWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8JWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kO8MmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8MmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_iUGSEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_iUabIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_iUvyUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_iVFJgId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_iVZ5oId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iVupwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iWCy0Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iWWU0Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_iWqd4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iW-m8Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iXTXEId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iXm5EId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iX7pMId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_iYPyQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iYkiYId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iY5SgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iZOCoId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_iTvswId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_iZ4xAId1EemTGPCEQmMGWg"
+                called="#_0kO8MmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0kh3EGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.TODO.override&#xA;"
+              name="Class.getGenFeature.override" headerMethod="#_0kh3EmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__MrdZHLYEd-09ds9dfYpFw" initMethod="#_0kh3E2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0kh3FWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_iapmAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0kh3EmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3EmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kh3E2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3E2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__MrdZHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method.__MrdZHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0kh3FWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3FWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kh3ImJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3ImJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ieMpQId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_iegyUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ie0UUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ifIdYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ifcmcId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ifxWkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_igFfoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_igZosId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_igtKsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ihB60Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ihWq8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ihrbEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ih_kIId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_iiYlsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iiuj8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ijDUEId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ijYrQId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_id5HQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ikCykId1EemTGPCEQmMGWg"
+                called="#_0kh3ImJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0kroEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.javadoc.insert&#xA;"
+              name="Class.getGenFeature.javadoc.override" headerMethod="#_0kroEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__Nt_NHLYEd-09ds9dfYpFw" initMethod="#_0kroE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0kroFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ik3R8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0kroEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kroE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__Nt_NHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method.__Nt_NHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0kroFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0kroImJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroImJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_iocKYId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_iow6gId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ipFqoId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ipZzsId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ipt8wId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iqCF0Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iqWO4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iqqX8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_iq-hAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_irTRIId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iroBQId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ir8xYId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_isRhgId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ismRoId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_is_TMId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_itV4gId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_itrPsId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ioIoYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_iuUI4Id1EemTGPCEQmMGWg"
+                called="#_0kroImJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0lIUAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.getGenFeature.javadoc.insert" headerMethod="#_0lIUAmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__O6SBHLYEd-09ds9dfYpFw" initMethod="#_0lIUA2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0lIUBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ivEW0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0lIUAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lIUA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__O6SBHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method.__O6SBHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0lIUBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lIUEmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUEmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_iyp2UId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_iy9YUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_izRhYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_izlDYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_iz5McId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i0NVgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i0g3gId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i01noId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_i1JwsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i1d5wId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i1z4AId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_i2IBEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_i2cxMId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_i2w6QId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_i3EcQId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_i3YlUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_i3tVcId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_iyVtQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_i4WOoId1EemTGPCEQmMGWg"
+                called="#_0lIUEmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0lIUFGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.getGenFeature.annotations.insert" headerMethod="#_0lIUFmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__P9a5HLYEd-09ds9dfYpFw" initMethod="#_0lIUF2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0lIUGWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_hnXH4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0lIUFmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUFmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lIUF2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUF2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__P9a5HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method.__P9a5HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0lIUGWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUGWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lSFCmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lSFCmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_hq3H0Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_hrLQ4Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_hrgBAId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_hr0KEId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_hsITIId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hsccMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hsv-MId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_htEHQId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_htY3YId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_httAcId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_huBJgId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_huVSkId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_huqCsId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_hu9ksId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hvRtwId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hvlPwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hv5_4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_hqi-wId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_hwjgIId1EemTGPCEQmMGWg"
+                called="#_0lSFCmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0lSFDGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.getGenFeature.pre.insert" headerMethod="#_0lSFDmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__RvjlHLYEd-09ds9dfYpFw" initMethod="#_0lbO8GJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0lbO8mJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_hxSf8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0lSFDmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lSFDmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lbO8GJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8GJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__RvjlHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method.__RvjlHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0lbO8mJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lbO_2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO_2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_h06bsId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_h1RoEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_h1lxIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_h156MId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_h2OqUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_h2jacId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_h24KkId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_h3MToId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_h3fOkId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_h3zXoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_h4G5oId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_h4bCsId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_h4vLwId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_h5DU0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_h5W20Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_h5q_4Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_h6FPkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_h0j2YId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_h6uIwId1EemTGPCEQmMGWg"
+                called="#_0lbO_2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0lbPAWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.getGenFeature.TODO.override" headerMethod="#_0lbPA2J-Ed-FqczH3ESmRw"
+              conditionMethod="#__TiTVHLYEd-09ds9dfYpFw" initMethod="#_0lbPBGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0lbPBmJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_i5EnYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0lbPA2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lbPBGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__TiTVHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method.__TiTVHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0lbPBmJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lbPE2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPE2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_i8g88Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_i80e8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_i9IoAId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_i9bi8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_i9vsAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i-D1EId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i-X-IId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i-suQId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_i_CFcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i_YDsId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_i_sz0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jABj8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jAVtAId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_jAqdIId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jA_NQId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jBTWUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jBm4UId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_i8Mz4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_jCPKcId1EemTGPCEQmMGWg"
+                called="#_0lbPE2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0lk_8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.TODO.override&#xA;"
+              name="Class.basicGetGenFeature.override" headerMethod="#_0lk_8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__VBhFHLYEd-09ds9dfYpFw" initMethod="#_0lk_82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0lk_9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_jC__cId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0lk_8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0lk_82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__VBhFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method.__VBhFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0lk_9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0llAAmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0llAAmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_jGh0kId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_jG2ksId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_jHL74Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_jHk9cId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_jH67sId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jIPEwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jIlDAId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jI5zIId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_jJQ_gId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jJlvoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jJ54sId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jKOo0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jKix4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_jK3iAId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jLMSIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jM0p0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jNNEUId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_jGMdYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_jN19gId1EemTGPCEQmMGWg"
+                called="#_0llAAmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0l364GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicGetGenFeature.annotations.insert" headerMethod="#_0l364mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__XjQpHLYEd-09ds9dfYpFw" initMethod="#_0l3642J-Ed-FqczH3ESmRw"
+              footerMethod="#_0l365WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_jOlkYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0l364mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l364mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0l3642J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l3642J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__XjQpHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method.__XjQpHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0l365WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l365WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0l368mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l368mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_jSE9QId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_jSYfQId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_jSsoUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_jTAKUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_jTUTYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jTpDgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jT7-cId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jUQHgId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_jUk3oId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jU5AsId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jVMisId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jVhS0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jV000Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_jWIW0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jWe8IId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jWzsQId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jXH1UId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_jRw0MId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_jXvgYId1EemTGPCEQmMGWg"
+                called="#_0l368mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0mBr4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicGetGenFeature.pre.insert" headerMethod="#_0mBr4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__ZDFdHLYEd-09ds9dfYpFw" initMethod="#_0mBr42J-Ed-FqczH3ESmRw"
+              footerMethod="#_0mBr5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_jYfHQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0mBr4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mBr42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__ZDFdHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method.__ZDFdHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0mBr5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mBr8mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr8mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_jcCxkId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_jcXhsId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_jcsR0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_jdBB8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_jdVyEId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jdp7IId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jd-EMId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jeSNQId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_jemWUId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_je6fYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jfOocId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jfjYkId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jf26kId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_jgLqsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jgfMsId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jgyHoId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jhGQsId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_jbtaYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_jhtUsId1EemTGPCEQmMGWg"
+                called="#_0mBr8mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0mK10GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicGetGenFeature.TODO.override" headerMethod="#_0mK10mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__a1OJHLYEd-09ds9dfYpFw" initMethod="#_0mK102J-Ed-FqczH3ESmRw"
+              footerMethod="#_0mK11WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_jieJsId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0mK10mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK10mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mK102J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK102J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__a1OJHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method.__a1OJHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0mK11WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK11WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mK14mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK14mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_jmDCIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_jmYZUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_jmsiYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_jnArcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_jnU0gId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jnoWgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jn9GoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_joRPsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_jomm4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jo6v8Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jpOR8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jpjCEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jp4ZQId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_jqOXgId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jqjusId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jq6UAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jrOdEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_jlvgIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_jr5ygId1EemTGPCEQmMGWg"
+                called="#_0mK14mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0mUm0GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.TODO.override&#xA;"
+              name="Class.basicSetGenFeature.override" headerMethod="#_0mUm0mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__d9apHLYEd-09ds9dfYpFw" initMethod="#_0mUm02J-Ed-FqczH3ESmRw"
+              footerMethod="#_0mUm1WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_jsqngId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0mUm0mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm0mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mUm02J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm02J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__d9apHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method.__d9apHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0mUm1WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm1WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mUm4mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm4mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_jwQuEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_jwk3IId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_jw5nQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_jxOXYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_jxigcId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jx33oId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jyLZoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jyfisId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_jy0S0Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jzIb4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_jzfoQId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_jz0YYId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j0IhcId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_j0efsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j00d8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j1LqUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j1iPoId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_jv5hsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_j2OzMId1EemTGPCEQmMGWg"
+                called="#_0mUm4mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0mnhwGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicSetGenFeature.annotations.insert" headerMethod="#_0mnhwmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__fJtdHLYEd-09ds9dfYpFw" initMethod="#_0mnhw2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0mnhxWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_h7dIkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0mnhwmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhwmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mnhw2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhw2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__fJtdHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method.__fJtdHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0mnhxWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhxWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mnh0mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnh0mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_h-7TUId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_h_O1UId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_h_iXUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_h_15UId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_iAKCYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iAfZkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iA0JsId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iBISwId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_iBcb0Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iBxzAId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iCFVAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iCaFIId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iCtnIId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_iDBwMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iDWgUId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iDqpYId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iEAAkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_h-nxUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_iEwOgId1EemTGPCEQmMGWg"
+                called="#_0mnh0mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0mxSwGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicSetGenFeature.pre.insert" headerMethod="#_0mxSwmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__gDFVHLYEd-09ds9dfYpFw" initMethod="#_0mxSw2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0mxSxWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_j3A2UId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0mxSwmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSwmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mxSw2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSw2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__gDFVHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method.__gDFVHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0mxSxWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSxWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mxS0mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxS0mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_j6mV0Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_j67tAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_j7P2EId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_j7nCcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_j77ykId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_j8PUkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_j8kEsId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_j85b4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_j9OMAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_j9iVEId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_j93FMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j-ORkId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j-jBsId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_j-4Y4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j_Mh8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j_gD8Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_j_0NAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_j6SMwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_kAeUUId1EemTGPCEQmMGWg"
+                called="#_0mxS0mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0mxS1GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicSetGenFeature.post.insert" headerMethod="#_0mxS1mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__gysNHLYEd-09ds9dfYpFw" initMethod="#_0mxS12J-Ed-FqczH3ESmRw"
+              footerMethod="#_0m6csWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_kBOiQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0mxS1mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS1mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0mxS12J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS12J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__gysNHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method.__gysNHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0m6csWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6csWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0m6cvmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6cvmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_kEw-cId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_kFGVoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_kFbs0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_kFxEAId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_kGFNEId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kGZ9MId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kGutUId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kHFSoId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_kHZbsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kHuL0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kIC78Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kIXFAId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kIrOEId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_kJBMUId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kJZm0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kJtv4Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kKE8QId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_kEcOUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_kKwRsId1EemTGPCEQmMGWg"
+                called="#_0m6cvmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0m6cwGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicSetGenFeature.TODO.override" headerMethod="#_0m6cwmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__hsEFHLYEd-09ds9dfYpFw" initMethod="#_0m6cw2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0m6cxWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_kLi74Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0m6cwmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cwmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0m6cw2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cw2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__hsEFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method.__hsEFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0m6cxWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cxWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0m6c0mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6c0mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_kPIbYId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_kPdLgId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_kPxUkId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_kQE2kId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_kRfL0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kR1xIId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kSJ6MId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kSfRYId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_kS0okId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kTLN4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kThzMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kT2jUId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kUNIoId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_kUh4wId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kU2o4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kVKx8Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kVgJIId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_kO0SUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_kWH0MId1EemTGPCEQmMGWg"
+                called="#_0m6c0mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0nN-sGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.TODO.override&#xA;"
+              name="Class.setGenFeature.override" headerMethod="#_0nN-smJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__jLR1HLYEd-09ds9dfYpFw" initMethod="#_0nN-s2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0nN-tWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_kW4CIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0nN-smJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-smJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nN-s2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-s2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__jLR1HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method.__jLR1HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0nN-tWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-tWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nN-wmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-wmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_kahMAId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ka2jMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_kbL6YId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_kbfcYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_kby-YId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kcGgYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kcaCYId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kctkYId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_kdAfUId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kdUoYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kdoxcId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kd8TcId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_keQcgId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_keklkId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ke4HkId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kfLpkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kffyoId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_kaNC8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_kgJS4Id1EemTGPCEQmMGWg"
+                called="#_0nN-wmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0nXIoGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.javadoc.insert&#xA;"
+              name="Class.setGenFeature.javadoc.override" headerMethod="#_0nXIomJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__m57RHLYEd-09ds9dfYpFw" initMethod="#_0nXIo2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0nXIpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_kg45wId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0nXIomJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIomJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nXIo2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIo2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__m57RHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method.__m57RHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0nXIpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nXIsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_kkZgwId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_kktCwId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_klBy4Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_klVU4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_klo24Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kl8_8Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kmQh8Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kmlSEId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_km40EId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_knNkMId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_knqQIId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_koAOYId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_koVlkId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_korj0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kpCwMId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kpW5QId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kpsQcId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_kkFXsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_kqT7gId1EemTGPCEQmMGWg"
+                called="#_0nXIsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0ng5oGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.setGenFeature.javadoc.insert" headerMethod="#_0ng5omJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__oi6BHLYEd-09ds9dfYpFw" initMethod="#_0ng5o2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0ng5pWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_krDiYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0ng5omJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5omJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0ng5o2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5o2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__oi6BHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method.__oi6BHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0ng5pWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5pWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0ng5smJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5smJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_kuhGEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ku1PIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_kvJYMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_kvfWcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_kvy4cId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kwHBgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kwdm0Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kwxv4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_kxFR4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kxbQIId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_kxvZMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kyDiQId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kyaHkId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_kywF0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kzEO4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kzY_AId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_kztIEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_kuNkEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_k0X2cId1EemTGPCEQmMGWg"
+                called="#_0ng5smJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0nqqoGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.setGenFeature.annotations.insert" headerMethod="#_0nqqomJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__pvM1HLYEd-09ds9dfYpFw" initMethod="#_0nqqo2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0nqqpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_iFf1YId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0nqqomJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqomJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nqqo2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqo2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__pvM1HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method.__pvM1HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0nqqpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nqqsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_iJ_64Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_iKUrAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_iKo0EId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_iK89IId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_iLQfIId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iLkoMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iL4xQId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iMM6UId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_iMgcUId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iM0lYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_iNJVgId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iNf60Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iN0D4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_iOI0AId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iOdkIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iOyUQId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_iPGdUId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_iJp8oId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_iPv9kId1EemTGPCEQmMGWg"
+                called="#_0nqqsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0nz0kGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.setGenFeature.pre.insert" headerMethod="#_0nz0kmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__rEplHLYEd-09ds9dfYpFw" initMethod="#_0nz0k2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0nz0lWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_k1HdUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0nz0kmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0kmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nz0k2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0k2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__rEplHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method.__rEplHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0nz0lWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0lWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0nz0o2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0o2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_k4hWoId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_k42GwId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_k5MFAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_k5gOEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_k50XIId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_k6IgMId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_k6cpQId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_k6wyUId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_k7FicId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_k7a5oId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_k7wQ0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_k8EZ4Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_k8Yi8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_k8uhMId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_k9D4YId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_k9YBcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_k9sKgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_k-CIwId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_k4N0oId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_k-pz0Id1EemTGPCEQmMGWg"
+                called="#_0nz0o2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0qMaMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.setGenFeature.post.insert" headerMethod="#_0qMaMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__sQ8ZHLYEd-09ds9dfYpFw" initMethod="#_0qMaM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0qMaNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_lWAj4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0qMaMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qMaM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__sQ8ZHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method.__sQ8ZHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0qMaNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qMaQ2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaQ2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_lZn4kId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_lZ8osId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_laR_4Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_lamI8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_la6SAId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_lbPpMId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lblAYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lb6XkId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lcOgoId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_lcjQwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lc3Z0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ldLi4Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ldg6EId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ld1qMId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_leJzQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lefKcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_le1IsId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lfKf4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_lZR6UId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_lfyyAId1EemTGPCEQmMGWg"
+                called="#_0qMaQ2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0qMaRWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.setGenFeature.TODO.override" headerMethod="#_0qMaR2J-Ed-FqczH3ESmRw"
+              conditionMethod="#__tAjRHLYEd-09ds9dfYpFw" initMethod="#_0qMaSGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0qWLMWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_lgi_8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0qMaR2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaR2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qMaSGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaSGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__tAjRHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method.__tAjRHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0qWLMWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLMWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qWLP2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLP2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_lkK7sId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_lkfEwId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_lkz04Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_llJMEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_llejQId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_llz6cId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lmIqkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lmczoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lmxjwId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_lnFs0Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lnac8Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lnv0IId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_loEkQId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_loYGQId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_lotdcId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lpCNkId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lpVvkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lppRkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_lj0WYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_lqRjsId1EemTGPCEQmMGWg"
+                called="#_0qWLP2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0qfVIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.TODO.override&#xA;"
+              name="Class.basicUnsetGenFeature.override" headerMethod="#_0qfVImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__v101HLYEd-09ds9dfYpFw" initMethod="#_0qfVI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0qfVJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_lrAjgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0qfVImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qfVI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__v101HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method.__v101HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0qfVJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qfVMmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVMmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_luiYoId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_lu2hsId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_lvKqwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_lvez0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_lv0LAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lwJiMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lwe5YId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lwzCcId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_lxHykId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lxcisId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lxwrwId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lyE00Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lyY94Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_lytuAId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lzCeIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lzWnMId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lzqwQId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_luOPkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_l0U3kId1EemTGPCEQmMGWg"
+                called="#_0qfVMmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0qpGIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicUnsetGenFeature.annotations.insert" headerMethod="#_0qpGImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__xezlHLYEd-09ds9dfYpFw" initMethod="#_0qpGI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0qpGJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_l1FskId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0qpGImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qpGI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__xezlHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method.__xezlHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0qpGJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qpGMmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGMmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_l4rMEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_l4_VIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_l5TeMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_l5oOUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_l58-cId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_l6RHgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_l6kpgId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_l66AsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_l7SbMId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_l7qOoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_l8Az8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_l8VkEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_l8ptIId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_l8-dQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_l9SmUId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_l9nWcId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_l98toId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_l4XqEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_l-m08Id1EemTGPCEQmMGWg"
+                called="#_0qpGMmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0qy3IGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.basicUnsetGenFeature.TODO.override" headerMethod="#_0qy3ImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__yrGZHLYEd-09ds9dfYpFw" initMethod="#_0qy3I2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0qy3JWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_l_YRAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0qy3ImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3ImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qy3I2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3I2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__yrGZHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method.__yrGZHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0qy3JWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3JWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0qy3MmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3MmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_mDD3IId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_mDYnQId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_mDt-cId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_mECHgId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_mEXesId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mErnwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mFAX4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mFVIAId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_mFp4IId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mF_PUId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mGTYYId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mGnhcId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mG7qgId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_mHRBsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mHlx0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mH564Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mIPSEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_mCvHAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_mI6AcId1EemTGPCEQmMGWg"
+                called="#_0qy3MmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0q8BEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.TODO.override&#xA;"
+              name="Class.unsetGenFeature.override" headerMethod="#_0q8BEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__0BKNHLYEd-09ds9dfYpFw" initMethod="#_0q8BE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0q8BFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_mJq1cId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0q8BEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0q8BE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__0BKNHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method.__0BKNHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0q8BFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0q8BImJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BImJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_mNQU8Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_mNlFEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_mN51MId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_mOPMYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_mOkjkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mO56wId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mPOq4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mPjbAId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_mP4LIId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mQM7QId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mQi5gId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mQ43wId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mROO8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_mRkNMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mR49UId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mSNtcId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mSidkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_mM8L4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_mTKvsId1EemTGPCEQmMGWg"
+                called="#_0q8BImJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0rPjEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.javadoc.insert&#xA;"
+              name="Class.unsetGenFeature.javadoc.override" headerMethod="#_0rPjEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__1gX9HLYEd-09ds9dfYpFw" initMethod="#_0rPjE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0rPjFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_mT8y0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0rPjEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0rPjE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__1gX9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method.__1gX9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0rPjFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0rPjImJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjImJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_mYTuYId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_mYpFkId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_mY91sId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_mZTM4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_mZsOcId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_maBloId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_maYyAId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mauJMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_mbEHcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mbaswId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mbwrAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mcIecId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mccngId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_mcylwId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mdM1cId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mdhlkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_md2VsId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_mX--QId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_meo_4Id1EemTGPCEQmMGWg"
+                called="#_0rPjImJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0rieAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.unsetGenFeature.javadoc.insert" headerMethod="#_0rieAmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__349lHLYEd-09ds9dfYpFw" initMethod="#_0rieA2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0rieBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_mfdfQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0rieAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0rieA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__349lHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method.__349lHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0rieBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0rieEmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieEmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_mjFbAId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_mjayMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_mjwJYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_mkE5gId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_mkZCkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mktysId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mlDJ4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mlX6AId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_mltRMId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mmCBUId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mmWxcId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mmsIoId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mnA4wId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_mnVo4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mnpx8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mn-iEId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_moT5QId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_miwD0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_mo8ycId1EemTGPCEQmMGWg"
+                called="#_0rieEmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0rrn8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.unsetGenFeature.annotations.insert" headerMethod="#_0rrn8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__5rtVHLYEd-09ds9dfYpFw" initMethod="#_0rrn82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0rrn9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_mptncId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0rrn8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0rrn82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__5rtVHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method.__5rtVHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0rrn9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0rroAmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rroAmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_mtU8IId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_mtqTUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_mt_DcId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_muVBsId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_mupKwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mu-h8Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mvT5IId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mvpQUId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_mv_OkId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mwUlwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_mwrLEId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mxAiQId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mxZj0Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_mxu7AId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_myESMId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_myZCUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_mywOsId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_mtAMAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_mzdZUId1EemTGPCEQmMGWg"
+                called="#_0rroAmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0r_J8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.unsetGenFeature.TODO.override" headerMethod="#_0r_J8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__6keJHLYEd-09ds9dfYpFw" initMethod="#_0r_J82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0r_J9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_m0RRoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0r_J8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0r_J82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__6keJHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method.__6keJHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0r_J9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0r_KAmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_KAmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_m383wId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_m4S2AId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_m4pbUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_m5BOwId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_m5V-4Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_m5r9IId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_m6AtQId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_m6XSkId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_m6spwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_m7BZ4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_m7WxEId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_m7svUId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_m8CtkId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_m8YEwId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_m8s04Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_m9DaMId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_m9YKUId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_m3oHoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_m-CRoId1EemTGPCEQmMGWg"
+                called="#_0r_KAmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0sIT4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.TODO.override&#xA;"
+              name="Class.isSetGenFeature.override" headerMethod="#_0sIT4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__8ES9HLYEd-09ds9dfYpFw" initMethod="#_0sIT42J-Ed-FqczH3ESmRw"
+              footerMethod="#_0sIT5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_m-zGoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0sIT4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sIT42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__8ES9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method.__8ES9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0sIT5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sIT8mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT8mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_nCkMUId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_nC4VYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_nDNFgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_nDh1oId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_nD2lwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nELV4Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nEe34Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nEzA8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_nFHxEId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nFb6IId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nFwDMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nGEzUId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nGZjcId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_nGu6oId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nHCcoId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nHXMwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nHrV0Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_nCO1IId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_nIUPAId1EemTGPCEQmMGWg"
+                called="#_0sIT8mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0sSE4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.javadoc.insert&#xA;"
+              name="Class.isSetGenFeature.javadoc.override" headerMethod="#_0sSE4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__9sqpHLYEd-09ds9dfYpFw" initMethod="#_0sSE42J-Ed-FqczH3ESmRw"
+              footerMethod="#_0sSE5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_nJDO0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0sSE4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sSE42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__9sqpHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method.__9sqpHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0sSE5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sSE8mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE8mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_nMinsId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_nM2wwId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_nNK50Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_nNeb0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_nNyk4Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nOGG4Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nOZo4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nOtx8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_nPB7AId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nPVdAId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nPqNIId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nQAycId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nQXXwId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_nQsu8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nRDUQId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nRZSgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nRvQwId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_nMOeoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_nSZ_IId1EemTGPCEQmMGWg"
+                called="#_0sSE8mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0sb14GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.isSetGenFeature.javadoc.insert" headerMethod="#_0sb14mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#__-mChHLYEd-09ds9dfYpFw" initMethod="#_0sb142J-Ed-FqczH3ESmRw"
+              footerMethod="#_0sb15WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_nTLbMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0sb14mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb14mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sb142J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb142J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="__-mChHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method.__-mChHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0sb15WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb15WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sb18mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb18mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_nW42gId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_nXNmoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_nXi90Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_nX3G4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_nYL3AId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nYgAEId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nY0JIId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nZISMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_nZdCUId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_najOgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_na7B8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nbSOUId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nbnlgId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_nb9jwId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ncST4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ncmc8Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nc6mAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_nWjfUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ndjfMId1EemTGPCEQmMGWg"
+                called="#_0sb18mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0sk_0GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.isSetGenFeature.annotations.insert" headerMethod="#_0sk_0mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#___faZHLYEd-09ds9dfYpFw" initMethod="#_0sk_02J-Ed-FqczH3ESmRw"
+              footerMethod="#_0sk_1WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_neUUMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0sk_0mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_0mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sk_02J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_02J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="___faZHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method.___faZHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0sk_1WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_1WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0sk_4mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_4mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_nh8P8Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_niRAEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_nilJIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ni88kId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_njSTwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_njnq8Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nj9CIId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nkSZUId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_nknJcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nk75kId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nlQCoId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nlkLsId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nl6J8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_nmNr8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nmjDIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nm4aUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nnL8UId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_nhnf0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_nn0OcId1EemTGPCEQmMGWg"
+                called="#_0sk_4mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0suw0GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.isSetGenFeature.TODO.override" headerMethod="#_0suw0mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AAYyRHLZEd-09ds9dfYpFw" initMethod="#_0suw02J-Ed-FqczH3ESmRw"
+              footerMethod="#_0suw1WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_noj1UId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0suw0mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw0mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0suw02J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw02J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AAYyRHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._AAYyRHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0suw1WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw1WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0suw4mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw4mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_nsO0YId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_nsjkgId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ns6J0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ntO58Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ntkRIId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nt5oUId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nuPmkId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nuk9wId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_nu5t4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nvQTMId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_nvlDUId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nv5MYId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nwNVcId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_nwhegId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nw21sId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nxMz8Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_nxiyMId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_nr6EQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_nyM5gId1EemTGPCEQmMGWg"
+                called="#_0suw4mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0s36wGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.genFeature.insert" headerMethod="#_0s36wmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_ADOD1HLZEd-09ds9dfYpFw" initMethod="#_0s36w2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0s36xWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ny9ugId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0s36wmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36wmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0s36w2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36w2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_ADOD1HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._ADOD1HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0s36xWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36xWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0s360mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s360mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_n2rw4Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_n3AhAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_n3WfQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_n3rPYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_n3__gId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_n4cEYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_n4yCoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_n5HZ0Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_n5bi4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_n5yvQId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_n6JUkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_n6fS0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_n60C8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_n7KBMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_n7fYYId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_n70IgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_n8I4oId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_n2WZsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_n85toId1EemTGPCEQmMGWg"
+                called="#_0s360mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0tBrwGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.implementedGenOperation.TODO.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.insert&#xA;"
+              name="Class.genOperation.override" headerMethod="#_0tLcwGJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AD9qtHLZEd-09ds9dfYpFw" initMethod="#_0tLcwWJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0tLcw2J-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_n9tl8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0tLcwGJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0tLcwWJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AD9qtHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._AD9qtHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0tLcw2J-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcw2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0tLc0GJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLc0GJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_oBbBQId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_oBxmkId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_oCG9wId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_oCc8AId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_oCzhUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oDKGoId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oDePsId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oD01AId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_oEKzQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oEm4IId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oE8PUId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oFS0oId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oFoy4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_oF-xIId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oGUvYId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oGqGkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oHAr4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_oBEb8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_oHtPcId1EemTGPCEQmMGWg"
+                called="#_0tLc0GJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0tUmsGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.javadoc.insert&#xA;"
+              name="Class.genOperation.javadoc.override" headerMethod="#_0tUmsmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AFJ9hHLZEd-09ds9dfYpFw" initMethod="#_0tUms2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0tUmtWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_oJFIcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0tUmsmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmsmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0tUms2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUms2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AFJ9hHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._AFJ9hHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0tUmtWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmtWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0tUmwmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmwmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_oM870Id1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_oNRr8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_oNnqMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_oN-PgId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_oOXREId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oOraIId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oPAKQId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oPWIgId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_oPq4oId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oQAP0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oQVnAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oQpwEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oQ95IId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_oRSCMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oRoAcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oR8JgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oSQSkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_oMlvcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_oS7A8Id1EemTGPCEQmMGWg"
+                called="#_0tUmwmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0toIsGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.genOperation.javadoc.insert" headerMethod="#_0toIsmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AG8GNHLZEd-09ds9dfYpFw" initMethod="#_0toIs2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0toItWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_oTsdAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0toIsmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIsmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0toIs2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIs2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AG8GNHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._AG8GNHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0toItWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toItWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0toIwmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIwmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_oXh0IId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_oX3LUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_oYNwoId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_oYigwId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_oY4fAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oZN2MId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oZimUId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oZ4kkId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_oaNUsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oaiE0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oa4qIId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_obOoYId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_objYgId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ob4vsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ocOG4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_odWIQId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_odq4YId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_oXL14Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_oeW04Id1EemTGPCEQmMGWg"
+                called="#_0toIwmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0txSoGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.genOperation.annotations.insert" headerMethod="#_0txSomJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AIbT9HLZEd-09ds9dfYpFw" initMethod="#_0txSo2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0txSpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ofJfEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0txSomJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSomJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0txSo2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSo2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AIbT9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._AIbT9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0txSpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0txSsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_oi3hcId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_ojMRkId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ojhBsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_oj2Y4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_okNlQId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_oknN4Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ok8lEId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_olRVMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_olleQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ol6OYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_omPlkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_omonIId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_om9-UId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_onSucId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_onm3gId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_on7noId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ooQ-0Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_oijYYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_oo6fEId1EemTGPCEQmMGWg"
+                called="#_0txSsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0t7DoGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.implementedGenOperation.TODO.override" headerMethod="#_0t7DomJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AKODtHLZEd-09ds9dfYpFw" initMethod="#_0t7Do2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0t7DpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_optJQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0t7DomJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DomJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0t7Do2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7Do2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AKODtHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._AKODtHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0t7DpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0t7DsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_otZ9gId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_otutoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ouC2sId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ouYN4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ouwBUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ovFYgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ovavsId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ovvf0Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_owFeEId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_owbcUId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_owwMcId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oxGxwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oxcwAId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_oxzVUId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oyJTkId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oyeqwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_oy1QEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_otD_QId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ozkP4Id1EemTGPCEQmMGWg"
+                called="#_0t7DsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0uENkGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.genOperation.insert" headerMethod="#_0uENkmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_ALaWhHLZEd-09ds9dfYpFw" initMethod="#_0uENk2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0uENlWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_o0Vr8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0uENkmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENkmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uENk2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENk2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_ALaWhHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._ALaWhHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0uENlWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENlWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uENomJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENomJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_o4H_wId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_o4d-AId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_o41KYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_o5KhkId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_o5hG4Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_o54TQId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_o6NDYId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_o6josId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_o65m8Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_o7O-IId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_o7ljcId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_o766oId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_o8Q44Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_o8neMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_o89ccId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_o9UBwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_o9qAAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_o3wzYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_o-V8gId1EemTGPCEQmMGWg"
+                called="#_0uENomJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0uN-kGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.eUnset.override" headerMethod="#_0uN-kmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AMmpVHLZEd-09ds9dfYpFw" initMethod="#_0uN-k2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0uN-lWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_o_LC8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0uN-kmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-kmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uN-k2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-k2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AMmpVHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._AMmpVHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0uN-lWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-lWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uN-oWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-oWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_pCv7YId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_pDErgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_pDZboId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_pDtksId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pECU0Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pEV20Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pEqm8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_pE-wAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pFTgIId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pFo3UId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pF-1kId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pGS-oId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_pGoV0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pG9F8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pHRPAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pHl_IId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_pCbyUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_pIRUkId1EemTGPCEQmMGWg"
+                called="#_0uN-oWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0uXvkGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.eIsSet.override" headerMethod="#_0uXvkmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AN8tJHLZEd-09ds9dfYpFw" initMethod="#_0uXvk2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0uXvlWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_pJD-wId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0uXvkmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvkmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uXvk2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvk2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AN8tJHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._AN8tJHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0uXvlWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvlWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0uXvoWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvoWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_pMu90Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_pNFjIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_pNa6UId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_pNw4kId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pOGPwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pOc1EId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pOxlMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_pPG8YId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pPc6oId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pPyR0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pQI3IId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pQeOUId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_pQ1asId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pRKx4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pRfiAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pR05MId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_pMZmoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_pSfnkId1EemTGPCEQmMGWg"
+                called="#_0uXvoWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0ug5gGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.insert" headerMethod="#_0ug5gmJ-Ed-FqczH3ESmRw" conditionMethod="#_AO_O9HLZEd-09ds9dfYpFw"
+              initMethod="#_0ug5g2J-Ed-FqczH3ESmRw" footerMethod="#_0ug5hWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_pTV8IId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0ug5gmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5gmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0ug5g2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5g2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AO_O9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._AO_O9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0ug5hWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5hWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0ug5kWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5kWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_pXD-gId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_pXZVsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_pXvT8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_pYDdAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pYaCUId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pYvZgId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pZGl4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_pZb9EId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_pZyiYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_paIgoId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pafF8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pa2SUId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_pbMQkId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pbiO0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pb4NEId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_pcQAgId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_pWsyIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_pc7V8Id1EemTGPCEQmMGWg"
+                called="#_0ug5kWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_JLBM0HroEeC0XN9kbwkPYQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.egfCustom.constructor.override" headerMethod="#_JLBM0nroEeC0XN9kbwkPYQ"
+              conditionMethod="#_JLBM1HroEeC0XN9kbwkPYQ" initMethod="#_JLBM03roEeC0XN9kbwkPYQ"
+              footerMethod="#_JLBM1nroEeC0XN9kbwkPYQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_g-ei8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_JLBM0nroEeC0XN9kbwkPYQ" name="header" patternFilePath="templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM0nroEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_JLBM03roEeC0XN9kbwkPYQ" name="init" patternFilePath="templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM03roEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_JLBM1HroEeC0XN9kbwkPYQ" name="preCondition" patternFilePath="templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1HroEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_JLBM1nroEeC0XN9kbwkPYQ" name="footer" patternFilePath="templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1nroEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_JLBM4XroEeC0XN9kbwkPYQ" name="doGenerate" patternFilePath="templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM4XroEeC0XN9kbwkPYQ.pt"/>
+            <parameters xmi:id="_hDK1sId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_hDe-wId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_hD4AUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_hESQAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hErRkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hFAowId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hFZDQId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_hFvokId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hGJ4QId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hGeBUId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hGyxcId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hHG6gId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_hHbDkId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hHvzsId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hID8wId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hIaiEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_hC2FkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_hJHssId1EemTGPCEQmMGWg"
+                called="#_JLBM4XroEeC0XN9kbwkPYQ"/>
+          </elements>
+          <elements xmi:id="_C2iO4eXDEeCxnsoQRwU99Q" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.interface.javadoc.override" headerMethod="#_C2iO4-XDEeCxnsoQRwU99Q"
+              conditionMethod="#_C2iO5eXDEeCxnsoQRwU99Q" initMethod="#_C2iO5OXDEeCxnsoQRwU99Q"
+              footerMethod="#_C2iO5-XDEeCxnsoQRwU99Q">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_gg6dMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_C2iO4-XDEeCxnsoQRwU99Q" name="header" patternFilePath="templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO4-XDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_C2iO5OXDEeCxnsoQRwU99Q" name="init" patternFilePath="templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5OXDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_C2iO5eXDEeCxnsoQRwU99Q" name="preCondition" patternFilePath="templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5eXDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_C2iO5-XDEeCxnsoQRwU99Q" name="footer" patternFilePath="templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5-XDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_C2iO9uXDEeCxnsoQRwU99Q" name="doGenerate" patternFilePath="templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO9uXDEeCxnsoQRwU99Q.pt"/>
+            <parameters xmi:id="_gkVkoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_gkptsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_gk9PsId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_glR_0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gln-EId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gl8uMId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gmSFYId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_gmmOcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gm6XgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gnPHoId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gnj3wId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gn3ZwId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_goLi0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gofr4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gozN4Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gpH-AId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_gkBbkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_gpwQIId1EemTGPCEQmMGWg"
+                called="#_C2iO9uXDEeCxnsoQRwU99Q"/>
+          </elements>
+          <elements xmi:id="_odzp0LM-EeKd56X4hcZPSw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.annotations.insert&#xA;"
+              name="Class.genFeatureReified.override" headerMethod="#_odzp0rM-EeKd56X4hcZPSw"
+              conditionMethod="#_odzp1LM-EeKd56X4hcZPSw" initMethod="#_odzp07M-EeKd56X4hcZPSw"
+              footerMethod="#_odzp1rM-EeKd56X4hcZPSw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_hdASAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_odzp0rM-EeKd56X4hcZPSw" name="header" patternFilePath="templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp0rM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_odzp07M-EeKd56X4hcZPSw" name="init" patternFilePath="templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp07M-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_odzp1LM-EeKd56X4hcZPSw" name="preCondition" patternFilePath="templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1LM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_odzp1rM-EeKd56X4hcZPSw" name="footer" patternFilePath="templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1rM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_odzp6LM-EeKd56X4hcZPSw" name="doGenerate" patternFilePath="templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp6LM-EeKd56X4hcZPSw.pt"/>
+            <parameters xmi:id="_hgZkQId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_hgtGQId1EemTGPCEQmMGWg" name="classExtendsGenClass"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_hhAoQId1EemTGPCEQmMGWg" name="classExtendsAllGenFeatures"
+                type="java.util.List"/>
+            <parameters xmi:id="_hhTjMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_hhnFMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_hh71UId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_hiP-YId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hikugId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hi5eoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hjNnsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_hjhwwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hj150Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hkINsId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hkbvsId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hkxG4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_hlEB0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hlYK4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hls7AId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hl_18Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_hgGCQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_hmm58Id1EemTGPCEQmMGWg"
+                called="#_odzp6LM-EeKd56X4hcZPSw"/>
+          </elements>
+          <elements xmi:id="_WUeasCSWEemxeP6B0lLOpA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.dynamicDelegation" headerMethod="#_WU7GoCSWEemxeP6B0lLOpA"
+              conditionMethod="#_WVqtgCSWEemxeP6B0lLOpA" initMethod="#_WVOBkCSWEemxeP6B0lLOpA"
+              footerMethod="#_WWQjYCSWEemxeP6B0lLOpA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_hJ36oId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_WU7GoCSWEemxeP6B0lLOpA" name="header" patternFilePath="templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WU7GoCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_WVOBkCSWEemxeP6B0lLOpA" name="init" patternFilePath="templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVOBkCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_WVqtgCSWEemxeP6B0lLOpA" name="preCondition" patternFilePath="templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVqtgCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_WWQjYCSWEemxeP6B0lLOpA" name="footer" patternFilePath="templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WWQjYCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_WZig4CSWEemxeP6B0lLOpA" name="doGenerate" patternFilePath="templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WZig4CSWEemxeP6B0lLOpA.pt"/>
+            <parameters xmi:id="_hNa94Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_hNvG8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_hODQAId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_hOWK8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hOq7EId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hO_EIId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hPT0QId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_hPnWQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hP8GYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_hQPoYId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hQjxcId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hQ36gId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_hRMqoId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hRgzsId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hR08wId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_hSIewId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_hNHb4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_hSwJ0Id1EemTGPCEQmMGWg"
+                called="#_WZig4CSWEemxeP6B0lLOpA"/>
+          </elements>
+          <elements xmi:id="_Y__lwCSWEemxeP6B0lLOpA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.dynamicSetGenFeature.pre.insert" headerMethod="#_ZAcRsCSWEemxeP6B0lLOpA"
+              conditionMethod="#_ZBVCgCSWEemxeP6B0lLOpA" initMethod="#_ZA4WkCSWEemxeP6B0lLOpA"
+              footerMethod="#_ZB7fcCSWEemxeP6B0lLOpA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_k_b28Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_ZAcRsCSWEemxeP6B0lLOpA" name="header" patternFilePath="templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZAcRsCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZA4WkCSWEemxeP6B0lLOpA" name="init" patternFilePath="templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZA4WkCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZBVCgCSWEemxeP6B0lLOpA" name="preCondition" patternFilePath="templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZBVCgCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZB7fcCSWEemxeP6B0lLOpA" name="footer" patternFilePath="templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZB7fcCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZFqI4CSWEemxeP6B0lLOpA" name="doGenerate" patternFilePath="templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZFqI4CSWEemxeP6B0lLOpA.pt"/>
+            <parameters xmi:id="_lDB9gId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_lDWGkId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_lDpokId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_lD-_wId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_lETI0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_lEmq0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lE8CAId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lFQLEId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lFk7MId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_lF5EQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lGNNUId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lGhWYId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lG04YId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lHJBcId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_lHdKgId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lHx6oId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lIGqwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lIcB8Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_lCtNYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_lJFiMId1EemTGPCEQmMGWg"
+                called="#_ZFqI4CSWEemxeP6B0lLOpA"/>
+          </elements>
+          <elements xmi:id="_ZGGNwCSWEemxeP6B0lLOpA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Class.dynamicSetGenFeature.post.insert" headerMethod="#_ZGZvwCSWEemxeP6B0lLOpA"
+              conditionMethod="#_ZHSgkCSWEemxeP6B0lLOpA" initMethod="#_ZG2bsCSWEemxeP6B0lLOpA"
+              footerMethod="#_ZHvMgCSWEemxeP6B0lLOpA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_lJ1wIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_ZGZvwCSWEemxeP6B0lLOpA" name="header" patternFilePath="templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZGZvwCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZG2bsCSWEemxeP6B0lLOpA" name="init" patternFilePath="templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZG2bsCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZHSgkCSWEemxeP6B0lLOpA" name="preCondition" patternFilePath="templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHSgkCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZHvMgCSWEemxeP6B0lLOpA" name="footer" patternFilePath="templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHvMgCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ZLd18CSWEemxeP6B0lLOpA" name="doGenerate" patternFilePath="templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZLd18CSWEemxeP6B0lLOpA.pt"/>
+            <parameters xmi:id="_lNb2sId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_lNv_wId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_lOFW8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_lOauIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_lOveQId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_lPHRsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lPfsMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lP1DYId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lQJMcId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_lQejoId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lQzTwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_lRJSAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lRfQQId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lRzZUId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_lSIJcId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lScSgId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lSwbkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_lTFywId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_lNHGkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_lVQV8Id1EemTGPCEQmMGWg"
+                called="#_ZLd18CSWEemxeP6B0lLOpA"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_0u0bgGJ-Ed-FqczH3ESmRw" name="org.eclipse.egf.emf.pattern.model.call.Interface">
+          <elements xmi:id="_0u0bgWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.declaredFieldGenFeature.insert&#xA;"
+              name="Interface.declaredFieldGenFeature.override" headerMethod="#_0u0bg2J-Ed-FqczH3ESmRw"
+              conditionMethod="#_AQBwxXLZEd-09ds9dfYpFw" initMethod="#_0u0bhGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0u0bhmJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_YArhgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0u0bg2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bg2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0u0bhGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AQBwxXLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._AQBwxXLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0u0bhmJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0u0bk2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bk2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_YD_7QId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_YESPIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_YEkjAId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_YE2P0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_YFIjsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YFa3kId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YF2VYId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YGJQUId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_YGcyUId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YGvGMId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YHCoMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YHU8EId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YHnP8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_YH6K4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YIMewId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YIgAwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YIy7sId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_YDtnYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_YJYxkId1EemTGPCEQmMGWg"
+                called="#_0u0bk2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0vHWcGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.declaredFieldGenFeature.insert" headerMethod="#_0vHWcmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_ARX0lHLZEd-09ds9dfYpFw" initMethod="#_0vHWc2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0vHWdWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_YKHxYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0vHWcmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWcmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vHWc2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWc2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_ARX0lHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._ARX0lHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0vHWdWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWdWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vHWgmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWgmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_YNUPUId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_YNnKQId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_YN6sQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_YONAIId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_YOgiIId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YO0EIId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YPG_EId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YPZ6AId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_YPs08Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YP_v4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YQTR4Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YQna8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YQ688Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_YROe8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YRkdMId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YR3YIId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YSK6IId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_YNBUYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_YSxXEId1EemTGPCEQmMGWg"
+                called="#_0vHWgmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0vQgYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.reflectiveDelegation.override" headerMethod="#_0vQgYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_ASkHZHLZEd-09ds9dfYpFw" initMethod="#_0vQgY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0vQgZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_YmdvIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0vQgYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vQgY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_ASkHZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._ASkHZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0vQgZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vQgcWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgcWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_YpvsoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_YqCAgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_YqVigId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_Yqn2YId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Yq6KQId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YrNFMId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YrgAIId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_Yry7EId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YsF2AId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YsZYAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YssS8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Ys_N4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_YtSI0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Ytlq0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Yt5M0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YuNV4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_YpcKoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_YuzLwId1EemTGPCEQmMGWg"
+                called="#_0vQgcWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0vaRYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeature.insert&#xA;"
+              name="Interface.genFeature.override" headerMethod="#_0vaRYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AUpyFHLZEd-09ds9dfYpFw" initMethod="#_0vaRY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0vaRZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Zf0ZAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0vaRYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vaRY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AUpyFHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._AUpyFHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0vaRZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vaRcmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRcmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ZjMdIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ZjexAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ZjxE4Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ZkEm4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ZkW6wId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZkqcwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Zk9XsId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZlPrkId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZlimgId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Zl06YId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZmOjAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZmgP0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Zm0_8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ZnH64Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Zna10Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZntwwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZoBSwId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Zi5iMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Zoo90Id1EemTGPCEQmMGWg"
+                called="#_0vaRcmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0vkCYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.TODO.override&#xA;"
+              name="Interface.getGenFeature.override" headerMethod="#_0vkCYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AWlrxHLZEd-09ds9dfYpFw" initMethod="#_0vkCY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0vkCZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ZpXWkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0vkCYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vkCY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AWlrxHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._AWlrxHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0vkCZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vkCcmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCcmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ZsxP4Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ZtGAAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ZtaJEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ZtxVcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ZuE3cId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZuegEId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZuypIId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZvGLIId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZvZGEId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZvvrYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZwEbgId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZwZysId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Zwt7wId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ZxDS8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZxafUId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZxvPcId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZyDYgId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ZsaqkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Zyp1cId1EemTGPCEQmMGWg"
+                called="#_0vkCcmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0vtMUGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.javadoc.insert&#xA;"
+              name="Interface.getGenFeature.javadoc.override" headerMethod="#_0vtMUmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AXx-lHLZEd-09ds9dfYpFw" initMethod="#_0vtMU2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0vtMVWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ZzXnIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0vtMUmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMUmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vtMU2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMU2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AXx-lHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._AXx-lHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0vtMVWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMVWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0vtMYmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMYmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_Z2sn8Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_Z3AJ8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_Z3Tr8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_Z4R8UId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_Z5DYYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Z5WTUId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Z5pOQId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Z57iIId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_Z6QSQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Z6j0QId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Z62IIId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Z7JDEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Z7bW8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_Z7tq0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Z7_-sId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Z8SSkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Z8l0kId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Z2ZtAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Z9OGsId1EemTGPCEQmMGWg"
+                called="#_0vtMYmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0wJ4QGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.getGenFeature.javadoc.insert" headerMethod="#_0wJ4QmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AZkHRHLZEd-09ds9dfYpFw" initMethod="#_0wJ4Q2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0wJ4RWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Z974YId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0wJ4QmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4QmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wJ4Q2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4Q2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AZkHRHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._AZkHRHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0wJ4RWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4RWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wJ4UmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4UmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_aBT8gId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_aBm3cId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_aB5yYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_aCMtUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_aCfoQId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aC0YYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aDH6YId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aDa1UId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_aDtwQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aEB5UId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aEVbUId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aEo9UId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aE9tcId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_aFRPcId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aFkxcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aF3sYId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aGL1cId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_aBBBkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_aGy5cId1EemTGPCEQmMGWg"
+                called="#_0wJ4UmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0wTpQGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.getGenFeature.annotations.insert" headerMethod="#_0wTpQmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AawaFHLZEd-09ds9dfYpFw" initMethod="#_0wTpQ2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0wTpRWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Y5yTwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0wTpQmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wTpQ2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQ2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AawaFHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._AawaFHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0wTpRWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpRWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wTpUmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpUmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_Y9E4UId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_Y9YaUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_Y9rVQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_Y9-QMId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_Y-QkEId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y-lUMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y-4PIId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y_MYMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y_esEId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y_yOEId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZAEh8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZAW10Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZAqX0Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ZA_H8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZBSp8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZBmzAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZB7jIId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Y8xWUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ZCiAEId1EemTGPCEQmMGWg"
+                called="#_0wTpUmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0wczMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.getGenFeature.pre.insert" headerMethod="#_0wczMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Ab8s5HLZEd-09ds9dfYpFw" initMethod="#_0wczM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0wczNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ZDQY0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0wczMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wczM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Ab8s5HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._Ab8s5HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0wczNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wczQmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczQmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ZG0qMId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ZHHlIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ZHagEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ZHtbAId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ZIAV8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZISp0Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZImy4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZI5GwId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZJMBsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZJfjsId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZJx3kId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZKEygId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZKXGYId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ZKqoYId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZK-xcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZLRFUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZLiyIId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ZGghIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ZMJ2IId1EemTGPCEQmMGWg"
+                called="#_0wczQmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0wmkMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.getGenFeature.TODO.override" headerMethod="#_0wmkMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AdvcpHLZEd-09ds9dfYpFw" initMethod="#_0wmkM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0wmkNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_aHhSMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0wmkMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wmkM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AdvcpHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._AdvcpHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0wmkNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wmkQmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkQmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_aK2TAId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_aLJN8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_aLcI4Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_aLwR8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_aMDM4Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aMWu4Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aMrfAId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aNFusId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_aNZQsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aNtZwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aOAUsId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aOTPoId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aOmxoId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_aO6ToId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aPN1oId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aPh-sId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aP0SkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_aKiJ8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_aQZhYId1EemTGPCEQmMGWg"
+                called="#_0wmkQmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0wwVMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.TODO.override&#xA;"
+              name="Interface.basicGetGenFeature.override" headerMethod="#_0wwVMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AfhlVHLZEd-09ds9dfYpFw" initMethod="#_0wwVM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0wwVNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_aRH6IId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0wwVMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wwVM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AfhlVHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._AfhlVHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0wwVNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0wwVQmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVQmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_aUZ3oId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_aUsLgId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_aU_tgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_aVSBYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_aVljYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aV5scId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aWMAUId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aWfiUId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_aWzEUId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aXK3wId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aXdysId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aXyi0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aYGE0Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_aYZm0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aYtv4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aZB48Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aZWCAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_aUGVoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_aZ-UIId1EemTGPCEQmMGWg"
+                called="#_0wwVQmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0w5fIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicGetGenFeature.annotations.insert" headerMethod="#_0w5fImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Ag3pJHLZEd-09ds9dfYpFw" initMethod="#_0w5fI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0w5fJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_aauiEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0w5fImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0w5fI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Ag3pJHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._Ag3pJHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0w5fJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0w5fMmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fMmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_aeH0UId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_aedLgId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_aewtgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_afEPgId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_afd4IId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_afxaIId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_agDuAId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_agXQAId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_agsAIId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ahB-YId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ahWugId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ahq3kId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ah_nsId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_aiUX0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_aipvAId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ai_GMId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ajVEcId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_adzrQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_aj_LwId1EemTGPCEQmMGWg"
+                called="#_0w5fMmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0xDQIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicGetGenFeature.pre.insert" headerMethod="#_0xDQImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Ah6K9HLZEd-09ds9dfYpFw" initMethod="#_0xDQI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0xDQJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_akx18Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0xDQImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xDQI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Ah6K9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._Ah6K9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0xDQJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xDQMmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQMmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_aoWuYId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_aoqQYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ao9yYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_apR7cId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_apmEgId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ap6NkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aqOWoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_aqifsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_aq2owId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_arKKwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_arilQId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ar2uUId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_asLecId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_asgOkId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_as0-sId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_atJu0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_atgUIId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_aoClUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_auJNUId1EemTGPCEQmMGWg"
+                called="#_0xDQMmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0xNBIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicGetGenFeature.TODO.override" headerMethod="#_0xNBImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Aizi1HLZEd-09ds9dfYpFw" initMethod="#_0xNBI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0xNBJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_au5bQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0xNBImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xNBI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Aizi1HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._Aizi1HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0xNBJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xNBMmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBMmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ayfh0Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ayzq4Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_azHM4Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_azbV8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_azvfAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a0E2MId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a0Y_QId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a0shQId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_a1ADQId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a1UMUId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a1oVYId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a18ecId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a2PZYId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_a2jicId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a23EcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a3KmcId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a3eIcId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ayKKoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_a4ElYId1EemTGPCEQmMGWg"
+                called="#_0xNBMmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0xWLEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.TODO.override&#xA;"
+              name="Interface.basicSetGenFeature.override" headerMethod="#_0xWLEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Aj_1pHLZEd-09ds9dfYpFw" initMethod="#_0xWLE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0xWLFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_a4yXEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0xWLEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xWLE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Aj_1pHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._Aj_1pHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0xWLFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xWLImJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLImJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_a8Gw0Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_a8a54Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_a8vC8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_a9Ck8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_a9WG8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a9qQAId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a99K8Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a-Qs8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_a-jn4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a-3J4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_a_LS8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a_gDEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_a_zlEId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_bAHuIId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bAb3MId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bAzDkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bBHzsId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_a7zO0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_bBwF0Id1EemTGPCEQmMGWg"
+                called="#_0xWLImJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0xpGAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicSetGenFeature.annotations.insert" headerMethod="#_0xpGAmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AmYbRHLZEd-09ds9dfYpFw" initMethod="#_0xpGA2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0xpGBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ZM2ZsId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0xpGAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xpGA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AmYbRHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._AmYbRHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0xpGBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xpGEmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGEmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ZQTWUId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ZQlqMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ZQ5MMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ZRLgEId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ZRebAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZRx9AId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZSEQ4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZSXy4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZSrU4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZS-24Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZTS_8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZTplQId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZT9uUId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ZUQCMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZUi9IId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZU2fIId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZVJaEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ZQAbYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ZVweEId1EemTGPCEQmMGWg"
+                called="#_0xpGEmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0xy3AGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicSetGenFeature.pre.insert" headerMethod="#_0xy3AmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AsC-ZHLZEd-09ds9dfYpFw" initMethod="#_0xy3A2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0xy3BWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_bCfFoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0xy3AmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3AmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xy3A2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3A2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AsC-ZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._AsC-ZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0xy3BWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3BWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0xy3EmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3EmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_bF7bMId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_bGOWIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_bGjGQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_bG32YId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_bHN0oId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bHikwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bH4jAId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bIPIUId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_bIj4cId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bKS90Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bKnt8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bK8eEId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bLPZAId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_bLiT8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bL2dAId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bMJ_AId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bMdhAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_bFn5MId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_bNIPYId1EemTGPCEQmMGWg"
+                called="#_0xy3EmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0x8oAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicSetGenFeature.post.insert" headerMethod="#_0x8oAmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AtPRNHLZEd-09ds9dfYpFw" initMethod="#_0x8oA2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0x8oBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_bN65kId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0x8oAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0x8oA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AtPRNHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._AtPRNHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0x8oBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0x8oEmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oEmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_bRdVwId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_bRys8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_bSIEIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_bSeCYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_bS0nsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bTJX0Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bTevAId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bT0GMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_bUHoMId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bUdmcId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bUyWkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bVHGsId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bVdE8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_bVwm8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bWEI8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bWYSAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bWsbEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_bRKa0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_bXTfEId1EemTGPCEQmMGWg"
+                called="#_0x8oEmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0x8oFGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicSetGenFeature.TODO.override" headerMethod="#_0x8oFmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Aukt9HLZEd-09ds9dfYpFw" initMethod="#_0x8oF2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0x8oGWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_bYACoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0x8oFmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oFmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0x8oF2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oF2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Aukt9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._Aukt9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0x8oGWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oGWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yFx-2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0yFx-2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_bbSAIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_bbjs8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_bb1ZwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_bcIUsId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_bccdwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bcv_wId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bdCToId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bdVOkId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_bdm7YId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bd7EcId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_beN_YId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_beg6UId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_be1DYId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_bfHXQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bfbgUId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bfubQId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bgAvIId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ba_sQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_bgl98Id1EemTGPCEQmMGWg"
+                called="#_0yFx-2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0yPi8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicSetGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicSetGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.post.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.TODO.override&#xA;"
+              name="Interface.setGenFeature.override" headerMethod="#_0yPi8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_AvxAxHLZEd-09ds9dfYpFw" initMethod="#_0yPi82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0yPi9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_bhShgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0yPi8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yPi82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_AvxAxHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._AvxAxHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0yPi9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yPjAmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPjAmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_bkniUId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_bk7EUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_blOmUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_blg6MId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_bl0cMId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bmHXIId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bmYc4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bmrX0Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_bm-SwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bnSb0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bnlWwId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bn5f0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_boNB0Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_bofVsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bozewId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bpIO4Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bpbw4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_bkVOcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_bqC04Id1EemTGPCEQmMGWg"
+                called="#_0yPjAmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0yZT8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.javadoc.insert&#xA;"
+              name="Interface.setGenFeature.javadoc.override" headerMethod="#_0yZT8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BAT-NHLZEd-09ds9dfYpFw" initMethod="#_0yZT82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0yZT9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_bqybwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0yZT8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yZT82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BAT-NHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._BAT-NHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0yZT9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yZUAmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZUAmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_buLuAId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_bugeIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_bu0nMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_bvIwQId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_bvdgYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bvxpcId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bwFLcId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bwZUgId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_bwtdkId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bxBmoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_bxUhkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bxoDkId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bx8MoId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_byQVsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_byj3sId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_by3ZsId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_bzKUoId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_bt294Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_bzx_sId1EemTGPCEQmMGWg"
+                called="#_0yZUAmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0yid4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.setGenFeature.javadoc.insert" headerMethod="#_0yid4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BGamNHLZEd-09ds9dfYpFw" initMethod="#_0yid42J-Ed-FqczH3ESmRw"
+              footerMethod="#_0yid5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_b0gYcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0yid4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yid42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BGamNHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._BGamNHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0yid5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0yid8mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid8mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_b4CNkId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_b4WWoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_b4p4oId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_b49aoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_b5QVkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_b5jQgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_b52ygId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_b6K7kId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_b6edkId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_b6xYgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_b7GIoId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_b7ZqoId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_b7tzsId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_b8BVsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_b8U3sId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_b8pAwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_b877sId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_b3tdcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_b9i_sId1EemTGPCEQmMGWg"
+                called="#_0yid8mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0ysO4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.setGenFeature.annotations.insert" headerMethod="#_0ysO4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BH6bBHLZEd-09ds9dfYpFw" initMethod="#_0ysO42J-Ed-FqczH3ESmRw"
+              footerMethod="#_0ysO5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ZWePwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0ysO4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0ysO42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BH6bBHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._BH6bBHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0ysO5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0ysO8mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO8mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ZZsi4Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ZaBTAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ZaTm4Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_Zamh0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_Za5cwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZbMXsId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZbfSoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZbxmgId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZcEhcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZcXcYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ZcpwQId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Zc8rMId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZdQ0QId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_ZdkWQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Zd34QId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZeKMIId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ZeeVMId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ZZZn8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ZfGAQId1EemTGPCEQmMGWg"
+                called="#_0ysO8mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0y1Y0GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.setGenFeature.pre.insert" headerMethod="#_0y1Y0mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BI881HLZEd-09ds9dfYpFw" initMethod="#_0y1Y02J-Ed-FqczH3ESmRw"
+              footerMethod="#_0y1Y1WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_b-SmkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0y1Y0mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y0mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0y1Y02J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y02J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BI881HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._BI881HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0y1Y1WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y1WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0y1Y42J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y42J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_cBzNkId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_cCGvkId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_cCa4oId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_cCw24Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_cDE_8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_cDcMUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cDw8cId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cEFFgId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cEacsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_cEt-sId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cFCHwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cFW34Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cFrA8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cF_KAId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_cGSsAId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cGmOAId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cG5wAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cHN5EId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_cBedcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_cH09EId1EemTGPCEQmMGWg"
+                called="#_0y1Y42J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0y_J0GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.setGenFeature.post.insert" headerMethod="#_0y_J0mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BKJPpHLZEd-09ds9dfYpFw" initMethod="#_0y_J02J-Ed-FqczH3ESmRw"
+              footerMethod="#_0y_J1WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ceNcwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0y_J0mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J0mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0y_J02J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J02J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BKJPpHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._BKJPpHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0y_J1WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J1WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0y_J42J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J42J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_chpyUId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_ch97YId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ciRdYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_cim0kId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ci6WkId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_cjOfoId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cjiBoId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cj2xwId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ckKTwId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ckd1wId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ckxXwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_clE5wId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_clYbwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_clr9wId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_cl_fwId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cmSasId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cmmjwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cm7T4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_chWQUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_cnjmAId1EemTGPCEQmMGWg"
+                called="#_0y_J42J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0y_J5WJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.setGenFeature.TODO.override" headerMethod="#_0y_J52J-Ed-FqczH3ESmRw"
+              conditionMethod="#_BQGttHLZEd-09ds9dfYpFw" initMethod="#_0y_J6GJ-Ed-FqczH3ESmRw"
+              footerMethod="#_0zI60GJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_coRXsId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0y_J52J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J52J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0y_J6GJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J6GJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BQGttHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._BQGttHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0zI60GJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI60GJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zI63mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI63mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_cr3eQId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_csNcgId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_csiMoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_cs1uoId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ctJQoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_cten0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ctyJ0Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cuG58Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cuab8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_cuulAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cvDVIId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cvW3IId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cvrAMId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cv-iMId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_cwVukId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cwqesId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cxDgQId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cxXCQId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_crjVMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_cyAigId1EemTGPCEQmMGWg"
+                called="#_0zI63mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0zSEwGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.TODO.override&#xA;"
+              name="Interface.basicUnsetGenFeature.override" headerMethod="#_0zSEwmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BR5ddHLZEd-09ds9dfYpFw" initMethod="#_0zSEw2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0zSExWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_cyuUMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0zSEwmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEwmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zSEw2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEw2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BR5ddHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._BR5ddHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0zSExWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSExWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zSE0mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSE0mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_c2EjIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_c2YsMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_c2s1QId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_c3A-UId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_c3UgUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_c3opYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_c38ycId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_c4Q7gId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_c4kdgId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_c45NoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_c5NWsId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_c5g4sId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_c5zzoId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_c6H8sId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_c6cs0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_c6vnwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_c7Dw0Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_c1xBIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_c7qNwId1EemTGPCEQmMGWg"
+                called="#_0zSE0mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0zb1wGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicUnsetGenFeature.annotations.insert" headerMethod="#_0zb1wmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BS7_RHLZEd-09ds9dfYpFw" initMethod="#_0zb1w2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0zb1xWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_c8Z0oId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0zb1wmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1wmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zb1w2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1w2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BS7_RHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._BS7_RHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0zb1xWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1xWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zb10mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb10mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_c_2KMId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_dAJsMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_dAhfoId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_dA1BoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_dBJKsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dBd60Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dBw1wId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dCE-0Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_dCaWAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dCufEId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dDDPMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dDWxMId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dDsIYId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_dEARcId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dEUagId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dEojkId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dE8FkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_c_iBIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_dFjwoId1EemTGPCEQmMGWg"
+                called="#_0zb10mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0zlmwGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.basicUnsetGenFeature.TODO.override" headerMethod="#_0zlmwmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BUISFHLZEd-09ds9dfYpFw" initMethod="#_0zlmw2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0zlmxWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_dGQUMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0zlmwmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmwmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zlmw2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmw2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BUISFHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._BUISFHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0zlmxWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmxWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0zlm0mJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlm0mJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_dJhqoId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_dJ0lkId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_dKIHkId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_dKcQoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_dKvLkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dLDUoId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dLXdsId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dLq_sId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_dL_IwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dMTR0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dMmz0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dM7j8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dNPtAId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_dNjPAId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dN5NQId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dOOkcId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dOjUkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_dJPWwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_dPM00Id1EemTGPCEQmMGWg"
+                called="#_0zlm0mJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0z4hsGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.TODO.override&#xA;"
+              name="Interface.unsetGenFeature.override" headerMethod="#_0z4hsmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BVnf1HLZEd-09ds9dfYpFw" initMethod="#_0z4hs2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0z4htWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_dP-Q4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0z4hsmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hsmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0z4hs2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hs2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BVnf1HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._BVnf1HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0z4htWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4htWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0z4hwmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hwmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_dTfe8Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_dT0PEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_dUIYIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_dUchMId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_dUwDMId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dVGBcId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dVZjcId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dVtFcId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_dWDqwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dWXMwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dWrV0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dXAF8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dXUPAId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_dXo_IId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dX8hIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dYR4UId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dYmBYId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_dTLV4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_dZOTgId1EemTGPCEQmMGWg"
+                called="#_0z4hwmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_00BroGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.javadoc.insert&#xA;"
+              name="Interface.unsetGenFeature.javadoc.override" headerMethod="#_00BromJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BW9jpHLZEd-09ds9dfYpFw" initMethod="#_00Bro2J-Ed-FqczH3ESmRw"
+              footerMethod="#_00BrpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_dZ8sQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_00BromJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BromJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00Bro2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00Bro2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BW9jpHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._BW9jpHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_00BrpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00BrsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ddcFIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ddwOMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_deDwMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_deX5QId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_derbQId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dfAycId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dfU7gId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dfodgId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_df8mkId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dgPhgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dgjqkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dg3MkId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dhQOIId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_dhllUId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dh6VcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_diN3cId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_digyYId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ddHVAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_djJEgId1EemTGPCEQmMGWg"
+                called="#_00BrsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_00LcoGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.unsetGenFeature.javadoc.insert" headerMethod="#_00LcomJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BX27hHLZEd-09ds9dfYpFw" initMethod="#_00Lco2J-Ed-FqczH3ESmRw"
+              footerMethod="#_00LcpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_dj4EUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_00LcomJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcomJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00Lco2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00Lco2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BX27hHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._BX27hHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_00LcpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00LcsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_doWUoId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_dopPkId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_do-mwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_dpSIwId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_dplDsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dp5MwId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dqMuwId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dqg30Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_dq0Z0Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_drIi4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_drehIId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dryDIId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dsGzQId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_dsaVQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dsvFYId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dtCnYId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_dtX-kId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_doCyoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_dt_poId1EemTGPCEQmMGWg"
+                called="#_00LcsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_00VNoGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.unsetGenFeature.annotations.insert" headerMethod="#_00VNomJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BY5dVHLZEd-09ds9dfYpFw" initMethod="#_00VNo2J-Ed-FqczH3ESmRw"
+              footerMethod="#_00VNpWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_duuCYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_00VNomJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNomJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00VNo2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNo2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BY5dVHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._BY5dVHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_00VNpWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNpWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00VNsmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNsmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_dyMNIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_dyfvIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_dy0fQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_dzIBQId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_dza8MId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_dzvFQId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d0DOUId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d0WwUId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_d0sHgId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d0_pgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d1TLgId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d1mGcId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d15ocId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_d2MjYId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d2gFYId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d20OcId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d3HwcId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_dx4rIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_d3vbgId1EemTGPCEQmMGWg"
+                called="#_00VNsmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_00eXkGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.unsetGenFeature.TODO.override" headerMethod="#_00eXkmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BZy1NHLZEd-09ds9dfYpFw" initMethod="#_00eXk2J-Ed-FqczH3ESmRw"
+              footerMethod="#_00eXlWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_d4dNMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_00eXkmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXkmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00eXk2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXk2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BZy1NHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._BZy1NHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_00eXlWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXlWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00eXomJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXomJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_d77_AId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_d8QIEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_d8kRIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_d83zIId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_d9LVIId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d9feMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d9znQId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d-HJQId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_d-cgcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d-wCcId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_d_ELgId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d_ZisId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_d_u54Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_eADC8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eAV94Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eApf4Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eA9B4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_d7odAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_eBkF4Id1EemTGPCEQmMGWg"
+                called="#_00eXomJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_00oIkGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.TODO.override&#xA;"
+              name="Interface.isSetGenFeature.override" headerMethod="#_00oIkmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BaPhJHLZEd-09ds9dfYpFw" initMethod="#_00oIk2J-Ed-FqczH3ESmRw"
+              footerMethod="#_00oIlWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_eCTFsId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_00oIkmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIkmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00oIk2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIk2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BaPhJHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._BaPhJHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_00oIlWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIlWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00oIomJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIomJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_eFtmEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_eGBvIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_eGV4MId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_eGqoUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_eG-KUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eHS6cId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eHnDgId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eH7MkId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_eIPVoId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eIi3oId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eI3AsId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eJLJwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eJeEsId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_eJy00Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eKGW0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eKZRwId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eKrloId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_eFaEEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_eLT3wId1EemTGPCEQmMGWg"
+                called="#_00oIomJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_00x5kGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.javadoc.insert&#xA;"
+              name="Interface.isSetGenFeature.javadoc.override" headerMethod="#_00x5kmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BbSC9HLZEd-09ds9dfYpFw" initMethod="#_00x5k2J-Ed-FqczH3ESmRw"
+              footerMethod="#_00x5lWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_eMBCYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_00x5kmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5kmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00x5k2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5k2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BbSC9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._BbSC9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_00x5lWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5lWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_00x5omJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5omJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ePcw4Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ePyIEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_eQGRIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_eQbBQId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_eQvxYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eRIy8Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eReKIId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eRy6QId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_eSJfkId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eSfd0Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eS0N8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eTJlIId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eTdHIId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_eTyeUId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eUGAUId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eUZiUId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eUuScId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ePHZsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_eVXLoId1EemTGPCEQmMGWg"
+                called="#_00x5omJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_01N-cGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.isSetGenFeature.javadoc.insert" headerMethod="#_01N-cmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BcoGxHLZEd-09ds9dfYpFw" initMethod="#_01N-c2J-Ed-FqczH3ESmRw"
+              footerMethod="#_01N-dWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_eWGygId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_01N-cmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-cmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01N-c2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-c2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BcoGxHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._BcoGxHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_01N-dWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-dWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01N-gmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-gmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_eZmLYId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_eZ5tYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_eaOdgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_eaj0sId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ea39wId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ebMt4Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ebgP4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eb2OIId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ecMzcId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_eciKoId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ec1soId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_edKcwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_edfM4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_edyu4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eeHfAId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eeZy4Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eetU4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_eZSCUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_efTx0Id1EemTGPCEQmMGWg"
+                called="#_01N-gmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_01hgcGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.isSetGenFeature.annotations.insert" headerMethod="#_01hgcmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Bd9jhHLZEd-09ds9dfYpFw" initMethod="#_01hgc2J-Ed-FqczH3ESmRw"
+              footerMethod="#_01hgdWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_egJfUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_01hgcmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgcmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01hgc2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgc2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Bd9jhHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._Bd9jhHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_01hgdWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgdWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01hggmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hggmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_ejj_sId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ej4IwId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_ekLqwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_ekfz0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ekyuwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_elHe4Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_elbA4Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_elvJ8Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_emDTAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_emWN8Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_empv8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_em95AId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_enUeUId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_enpOcId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_en8wcId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eoPrYId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eoimUId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ejREwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_epKRYId1EemTGPCEQmMGWg"
+                called="#_01hggmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_01qqYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.isSetGenFeature.TODO.override" headerMethod="#_01qqYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BfAsZHLZEd-09ds9dfYpFw" initMethod="#_01qqY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_01qqZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_ep5RMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_01qqYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01qqY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BfAsZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._BfAsZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_01qqZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01qqcmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqcmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_etYqEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_etszIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_euA8MId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_euVsUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_eupOUId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ewHN8Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ewb-EId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ewu5AId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_exDpIId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_exXLIId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_expfAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ex-PIId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_eyTmUId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_eyrZwId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ezDNMId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ezWvMId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ezq4QId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_etEhAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_e0UYgId1EemTGPCEQmMGWg"
+                called="#_01qqcmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_010bYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.genFeature.insert" headerMethod="#_010bYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BgWJJHLZEd-09ds9dfYpFw" initMethod="#_010bY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_010bZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_e1D_YId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_010bYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_010bY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BgWJJHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._BgWJJHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_010bZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_010bcmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bcmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_e5AEMId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_e5S_IId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_e5l6EId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_e58fYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_e6QBYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_e6kxgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_e646kId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_e7MckId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_e7f-kId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_e7zgkId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_e8I3wId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_e8dA0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_e8v7wId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_e9Er4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_e9YN4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_e9s-AId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_e-AgAId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_e4r7IId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_e-oLEId1EemTGPCEQmMGWg"
+                called="#_010bcmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_01-MYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.javadoc.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.implementedGenOperation.TODO.override&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.insert&#xA;"
+              name="Interface.genOperation.override" headerMethod="#_01-MYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BiI45HLZEd-09ds9dfYpFw" initMethod="#_01-MY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_01-MZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_e_XK4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_01-MYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01-MY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BiI45HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._BiI45HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_01-MZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_01-McmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-McmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_fCy5YId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_fDGbYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_fDakcId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_fDuGcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_fEBocId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fEWYkId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fEsW0Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fFAf4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_fFUB4Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fFnj4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fF6e0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fGOn4Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fGiJ4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_fG26AId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fHLqIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fHgaQId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fHz8QId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_fCewUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_fIc1cId1EemTGPCEQmMGWg"
+                called="#_01-McmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_02HWUGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.javadoc.insert&#xA;"
+              name="Interface.genOperation.javadoc.override" headerMethod="#_02HWUmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Bjx3pHLZEd-09ds9dfYpFw" initMethod="#_02HWU2J-Ed-FqczH3ESmRw"
+              footerMethod="#_02HWVWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_fJKnIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_02HWUmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWUmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_02HWU2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWU2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Bjx3pHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._Bjx3pHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_02HWVWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWVWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_02HWYmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWYmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_fMm8sId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_fM7s0Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_fNPO0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_fNjX4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_fN254Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fOLC8Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fOd94Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fOxf4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_fPDzwId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fPZyAId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fPtUAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fQA2AId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fQTw8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_fQn6AId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fQ8qIId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fRQzMId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fRk8QId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_fMSMkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_fSMnUId1EemTGPCEQmMGWg"
+                called="#_02HWYmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_02kCQGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.genOperation.javadoc.insert" headerMethod="#_02kCQmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BlkAVHLZEd-09ds9dfYpFw" initMethod="#_02kCQ2J-Ed-FqczH3ESmRw"
+              footerMethod="#_02kCRWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_fS6ZAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_02kCQmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_02kCQ2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQ2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BlkAVHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._BlkAVHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_02kCRWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCRWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_02kCUmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCUmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_fWhtsId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_fW1PsId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_fXJYwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_fXeI4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_fXy5AId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fYLTgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fYe1gId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fY0MsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_fZI80Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fZds8Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fZxO8Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_faFYAId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_faZhEId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_fau4QId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fbE2gId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fbY_kId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fbuWwId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_fWM9kId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_fcaTQId1EemTGPCEQmMGWg"
+                called="#_02kCUmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_02tzQGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.genOperation.annotations.insert" headerMethod="#_02tzQmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BnDOFHLZEd-09ds9dfYpFw" initMethod="#_02tzQ2J-Ed-FqczH3ESmRw"
+              footerMethod="#_02tzRWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_fdLvUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_02tzQmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_02tzQ2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQ2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BnDOFHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._BnDOFHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_02tzRWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzRWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_02tzUmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzUmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_fgtkcId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_fhC7oId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_fhXEsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_fhr00Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_fh_94Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fiWjMId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fitIgId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fjEU4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_fjZsEId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fjucMId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fkDMUId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fkWuUId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fksskId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_flA1oId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_flU-sId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_flpu0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fl-e8Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_fgY0UId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_fmpNUId1EemTGPCEQmMGWg"
+                called="#_02tzUmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0229MGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.implementedGenOperation.TODO.override" headerMethod="#_0229MmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Bn8l9HLZEd-09ds9dfYpFw" initMethod="#_0229M2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0229NWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_fnapYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0229MmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229MmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0229M2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229M2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Bn8l9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._Bn8l9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0229NWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229NWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0229QmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229QmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_frAv8Id1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_frVgEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_frq3QId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_fr_nYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_fsUXgId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fspHoId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fs8poId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ftQysId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_ftkUsId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ft4dwId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_fuMm0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fufhwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fuzDwId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_fvGlwId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fvau0Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fvuQ0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_fwDA8Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_fqsm4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_fwr6IId1EemTGPCEQmMGWg"
+                called="#_0229QmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_03AuMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.genOperation.insert" headerMethod="#_03AuMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BpSpxHLZEd-09ds9dfYpFw" initMethod="#_03AuM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_03AuNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_fxd9QId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_03AuMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03AuM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BpSpxHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._BpSpxHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_03AuNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03AuQmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuQmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_f02ocId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_f1N00Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_f1hW0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_f12G8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_f2KQAId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_f2eZEId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_f2zJMId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_f3GrMId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_f3a0QId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_f3wLcId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_f4DtcId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_f5epwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_f5zZ4Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_f6Hi8Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_f6bsAId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_f6wcIId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_f7FzUId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_f0ifYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_f7s3UId1EemTGPCEQmMGWg"
+                called="#_03AuQmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_03KfMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.eUnset.override" headerMethod="#_03KfMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BqoGhHLZEd-09ds9dfYpFw" initMethod="#_03KfM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_03KfNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_f8uyEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_03KfMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03KfM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BqoGhHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._BqoGhHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_03KfNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03KfQWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfQWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_gAFoEId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_gAZxIId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_gAssEId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_gA-_8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gBTJAId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gBnSEId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gB6NAId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_gCNvAId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gCifIId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gC6SkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gDOboId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gDh9oId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_gD2GsId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gEK20Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gEgOAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gE0XEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_f_wQ4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_gFdQQId1EemTGPCEQmMGWg"
+                called="#_03KfQWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_03TpIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.eIsSet.override" headerMethod="#_03TpImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BsH7VHLZEd-09ds9dfYpFw" initMethod="#_03TpI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_03TpJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_gGM3IId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_03TpImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03TpI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BsH7VHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._BsH7VHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_03TpJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03TpMWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpMWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_gJsQAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_gKAZEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_gKVJMId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_gKp5UId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gK-CYId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gLSLcId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gLm7kId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_gL7EoId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gMPNsId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gMivsId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gM2RsId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gNJzsId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_gNd8wId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gNys4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gOFn0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gOZJ0Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_gJYG8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_gPBb8Id1EemTGPCEQmMGWg"
+                called="#_03TpMWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_03daIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.insert" headerMethod="#_03daImJ-Ed-FqczH3ESmRw" conditionMethod="#_BtAsJHLZEd-09ds9dfYpFw"
+              initMethod="#_03daI2J-Ed-FqczH3ESmRw" footerMethod="#_03daJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_gPxp4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_03daImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03daI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BtAsJHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._BtAsJHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_03daJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03daMWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daMWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_gTV7QId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_gTqEUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_gT9mUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_gUSWcId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gUmfgId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gU7PoId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gVPYsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_gVi6sId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gV2csId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_gWLM0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gWeHwId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gWxpwId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_gXGZ4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gXai8Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gXusAId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_gYDcIId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_gTByMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_gYruQId1EemTGPCEQmMGWg"
+                called="#_03daMWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_K9da0HroEeC0XN9kbwkPYQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.egfCustom.constructor.override" headerMethod="#_K9da0nroEeC0XN9kbwkPYQ"
+              conditionMethod="#_K9da1HroEeC0XN9kbwkPYQ" initMethod="#_K9da03roEeC0XN9kbwkPYQ"
+              footerMethod="#_K9da1nroEeC0XN9kbwkPYQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_YTcsgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_K9da0nroEeC0XN9kbwkPYQ" name="header" patternFilePath="templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da0nroEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_K9da03roEeC0XN9kbwkPYQ" name="init" patternFilePath="templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da03roEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_K9da1HroEeC0XN9kbwkPYQ" name="preCondition" patternFilePath="templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1HroEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_K9da1nroEeC0XN9kbwkPYQ" name="footer" patternFilePath="templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1nroEeC0XN9kbwkPYQ.pt"/>
+            <methods xmi:id="_K9da4XroEeC0XN9kbwkPYQ" name="doGenerate" patternFilePath="templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da4XroEeC0XN9kbwkPYQ.pt"/>
+            <parameters xmi:id="_YWq_oId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_YW_vwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_YXTRwId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_YXmMsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YX5HoId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YYLbgId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YYeWcId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_YYyfgId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YZEzYId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YZWgMId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YZo0EId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YZ7H8Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_YaNb0Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YafvsId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YayqoId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YbE-gId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_YWXdoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Ybq0YId1EemTGPCEQmMGWg"
+                called="#_K9da4XroEeC0XN9kbwkPYQ"/>
+          </elements>
+          <elements xmi:id="_BsLUkeXDEeCxnsoQRwU99Q" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.interface.javadoc.override" headerMethod="#_BsLUk-XDEeCxnsoQRwU99Q"
+              conditionMethod="#_BsVFkeXDEeCxnsoQRwU99Q" initMethod="#_BsVFkOXDEeCxnsoQRwU99Q"
+              footerMethod="#_BsVFk-XDEeCxnsoQRwU99Q">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_X3fwUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_BsLUk-XDEeCxnsoQRwU99Q" name="header" patternFilePath="templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsLUk-XDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_BsVFkOXDEeCxnsoQRwU99Q" name="init" patternFilePath="templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkOXDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_BsVFkeXDEeCxnsoQRwU99Q" name="preCondition" patternFilePath="templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkeXDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_BsVFk-XDEeCxnsoQRwU99Q" name="footer" patternFilePath="templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFk-XDEeCxnsoQRwU99Q.pt"/>
+            <methods xmi:id="_BsVFouXDEeCxnsoQRwU99Q" name="doGenerate" patternFilePath="templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFouXDEeCxnsoQRwU99Q.pt"/>
+            <parameters xmi:id="_X6xGwId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_X7EBsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_X7W8oId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_X7s64Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_X7_10Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_X8SwwId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_X8lrsId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_X84moId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_X9PzAId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_X9jVAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_X92P8Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_X-Ij0Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_X-a3sId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_X-uZsId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_X_B7sId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_X_UPkId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_X6eL0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_X_5eYId1EemTGPCEQmMGWg"
+                called="#_BsVFouXDEeCxnsoQRwU99Q"/>
+          </elements>
+          <elements xmi:id="_onysQLM-EeKd56X4hcZPSw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.pre.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.annotations.insert&#xA;"
+              name="Interface.genFeatureReified.override" headerMethod="#_onysQrM-EeKd56X4hcZPSw"
+              conditionMethod="#_onysRLM-EeKd56X4hcZPSw" initMethod="#_onysQ7M-EeKd56X4hcZPSw"
+              footerMethod="#_onysRrM-EeKd56X4hcZPSw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_YvfIQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_onysQrM-EeKd56X4hcZPSw" name="header" patternFilePath="templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQrM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_onysQ7M-EeKd56X4hcZPSw" name="init" patternFilePath="templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQ7M-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_onysRLM-EeKd56X4hcZPSw" name="preCondition" patternFilePath="templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRLM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_onysRrM-EeKd56X4hcZPSw" name="footer" patternFilePath="templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRrM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_onysWLM-EeKd56X4hcZPSw" name="doGenerate" patternFilePath="templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysWLM-EeKd56X4hcZPSw.pt"/>
+            <parameters xmi:id="_Yy7d0Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_YzOYwId1EemTGPCEQmMGWg" name="classExtendsGenClass"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_YzgsoId1EemTGPCEQmMGWg" name="classExtendsAllGenFeatures"
+                type="java.util.List"/>
+            <parameters xmi:id="_Yz1cwId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_Y0HwoId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_Y0aEgId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_Y0s_cId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y0_6YId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y1RnMId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y1j7EId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y122AId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y2NbUId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Y2lOwId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Y25X0Id1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Y3M50Id1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_Y3hC4Id1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Y30k4Id1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Y4Hf0Id1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Y4bo4Id1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Yyn70Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Y5CF0Id1EemTGPCEQmMGWg"
+                called="#_onysWLM-EeKd56X4hcZPSw"/>
+          </elements>
+          <elements xmi:id="_cAErkCSWEemxeP6B0lLOpA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.dynamicDelegation" headerMethod="#_cAhXgCSWEemxeP6B0lLOpA"
+              conditionMethod="#_cBQ-YCSWEemxeP6B0lLOpA" initMethod="#_cA-DcCSWEemxeP6B0lLOpA"
+              footerMethod="#_cB3bUCSWEemxeP6B0lLOpA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_YcX_AId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_cAhXgCSWEemxeP6B0lLOpA" name="header" patternFilePath="templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cAhXgCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_cA-DcCSWEemxeP6B0lLOpA" name="init" patternFilePath="templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cA-DcCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_cBQ-YCSWEemxeP6B0lLOpA" name="preCondition" patternFilePath="templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cBQ-YCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_cB3bUCSWEemxeP6B0lLOpA" name="footer" patternFilePath="templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cB3bUCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_cFSiwCSWEemxeP6B0lLOpA" name="doGenerate" patternFilePath="templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cFSiwCSWEemxeP6B0lLOpA.pt"/>
+            <parameters xmi:id="_YfouYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_Yf83cId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_YgPyYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_YgiGQId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Yg1oQId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YhH8IId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_Yha3EId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_YhtK8Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YiAF4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_YiTn4Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YjwZYId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YkCtQId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_YkVoMId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YkpKMId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_Yk8sMId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_YlPAEId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_YfXBkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_YlyZsId1EemTGPCEQmMGWg"
+                called="#_cFSiwCSWEemxeP6B0lLOpA"/>
+          </elements>
+          <elements xmi:id="_eTdDcCSWEemxeP6B0lLOpA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.dynamicSetGenFeature.pre.insert" headerMethod="#_eT5vYCSWEemxeP6B0lLOpA"
+              conditionMethod="#_eUpWQCSWEemxeP6B0lLOpA" initMethod="#_eUMqUCSWEemxeP6B0lLOpA"
+              footerMethod="#_eVPMICSWEemxeP6B0lLOpA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_cIjV0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_eT5vYCSWEemxeP6B0lLOpA" name="header" patternFilePath="templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eT5vYCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_eUMqUCSWEemxeP6B0lLOpA" name="init" patternFilePath="templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUMqUCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_eUpWQCSWEemxeP6B0lLOpA" name="preCondition" patternFilePath="templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUpWQCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_eVPMICSWEemxeP6B0lLOpA" name="footer" patternFilePath="templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eVPMICSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_eY91kCSWEemxeP6B0lLOpA" name="doGenerate" patternFilePath="templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eY91kCSWEemxeP6B0lLOpA.pt"/>
+            <parameters xmi:id="_cMDVwId1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_cMW3wId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_cMpLoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_cM9UsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_cNQPoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_cNkYsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cN3ToId1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cOK1oId1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cOdwkId1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_cOwrgId1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cPENgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cPXvgId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cPqqcId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cP8-UId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_cQRucId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cQl3gId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cQ5ZgId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cRLtYId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_cLvzwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_cRzYcId1EemTGPCEQmMGWg"
+                called="#_eY91kCSWEemxeP6B0lLOpA"/>
+          </elements>
+          <elements xmi:id="_eZahgCSWEemxeP6B0lLOpA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/Class.javajet&quot;&#xA;"
+              name="Interface.dynamicSetGenFeature.post.insert" headerMethod="#_eZ3NcCSWEemxeP6B0lLOpA"
+              conditionMethod="#_eam0UCSWEemxeP6B0lLOpA" initMethod="#_eaTSUCSWEemxeP6B0lLOpA"
+              footerMethod="#_ebMqMCSWEemxeP6B0lLOpA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_cSiYQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_eZ3NcCSWEemxeP6B0lLOpA" name="header" patternFilePath="templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eZ3NcCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_eaTSUCSWEemxeP6B0lLOpA" name="init" patternFilePath="templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eaTSUCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_eam0UCSWEemxeP6B0lLOpA" name="preCondition" patternFilePath="templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eam0UCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_ebMqMCSWEemxeP6B0lLOpA" name="footer" patternFilePath="templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._ebMqMCSWEemxeP6B0lLOpA.pt"/>
+            <methods xmi:id="_efOOkCSWEemxeP6B0lLOpA" name="doGenerate" patternFilePath="templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._efOOkCSWEemxeP6B0lLOpA.pt"/>
+            <parameters xmi:id="_cWJF4Id1EemTGPCEQmMGWg" name="setAccessorOperation"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_cWd2AId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_cWymIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_cXGvMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_cXa4QId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_cXuaQId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cZVj0Id1EemTGPCEQmMGWg" name="isInterface" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cZpF0Id1EemTGPCEQmMGWg" name="isImplementation" type="java.lang.Boolean"/>
+            <parameters xmi:id="_cZ9O4Id1EemTGPCEQmMGWg" name="useInterfaceOverrideAnnotation"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_caRX8Id1EemTGPCEQmMGWg" name="isGWT" type="java.lang.Boolean"/>
+            <parameters xmi:id="_calhAId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_ca5DAId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cbOaMId1EemTGPCEQmMGWg" name="publicStaticFinalFlag"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cbh8MId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_cb2FQId1EemTGPCEQmMGWg" name="negativeOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_ccK1YId1EemTGPCEQmMGWg" name="positiveOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cceXYId1EemTGPCEQmMGWg" name="negativeOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <parameters xmi:id="_cczHgId1EemTGPCEQmMGWg" name="positiveOperationOffsetCorrection"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_cVzHoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_cddO0Id1EemTGPCEQmMGWg"
+                called="#_efOOkCSWEemxeP6B0lLOpA"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_omcocLM-EeKd56X4hcZPSw" name="org.eclipse.egf.emf.pattern.model.call.ValidatorClass">
+          <elements xmi:id="_omcocbM-EeKd56X4hcZPSw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model/ValidatorClass.javajet&quot;&#xA;"
+              name="ValidatorClass.insert" headerMethod="#_omcoc7M-EeKd56X4hcZPSw"
+              conditionMethod="#_omcodbM-EeKd56X4hcZPSw" initMethod="#_omcodLM-EeKd56X4hcZPSw"
+              footerMethod="#_omcod7M-EeKd56X4hcZPSw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_gZtpAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_omcoc7M-EeKd56X4hcZPSw" name="header" patternFilePath="templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcoc7M-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_omcodLM-EeKd56X4hcZPSw" name="init" patternFilePath="templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodLM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_omcodbM-EeKd56X4hcZPSw" name="preCondition" patternFilePath="templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodbM-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_omcod7M-EeKd56X4hcZPSw" name="footer" patternFilePath="templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcod7M-EeKd56X4hcZPSw.pt"/>
+            <methods xmi:id="_omcof7M-EeKd56X4hcZPSw" name="doGenerate" patternFilePath="templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcof7M-EeKd56X4hcZPSw.pt"/>
+            <parameters xmi:id="_gdYBAId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_gdvNYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_geEkkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_geYGkId1EemTGPCEQmMGWg" name="singleWildcard" type="java.lang.String"/>
+            <parameters xmi:id="_gerokId1EemTGPCEQmMGWg" name="_Map" type="java.lang.String"/>
+            <parameters xmi:id="_ge-jgId1EemTGPCEQmMGWg" name="objectArgument" type="java.lang.String"/>
+            <parameters xmi:id="_gfSFgId1EemTGPCEQmMGWg" name="count" type="java.lang.Integer"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_gdD38Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_gf37YId1EemTGPCEQmMGWg"
+                called="#_omcof7M-EeKd56X4hcZPSw"/>
+          </elements>
+        </libraries>
+      </viewpoints>
+    </viewpointContainer>
+    <orchestration xmi:type="fprod:ProductionPlan" xmi:id="_Prg8YDG0Ed-kc8dEZsdm2w">
+      <invocations xmi:id="_tLstwId1EemTGPCEQmMGWg" name="EMF Model Pattern" invokedActivity="ftask:Task platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_jT-SgD1hEd-m5uHrCQ1Jew">
+        <invocationContractContainer xmi:id="_tMZ4YId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_tNEmwId1EemTGPCEQmMGWg" factoryComponentContract="#_Prg8ZTG0Ed-kc8dEZsdm2w"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_DgB2IP6fEd64XaYPo3s6sPg"/>
+          <invocationContracts xmi:id="_tO0TMId1EemTGPCEQmMGWg" factoryComponentContract="#_WRxYEFIIEd-eGOdO3WtsxA"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_L6JSwAHAEd-4faJMEplCjxw">
+            <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tPJqYId1EemTGPCEQmMGWg"
+                value="org.eclipse.egf.emf.pattern.base.ContentTypePatternExecutionReporter"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tQPPgId1EemTGPCEQmMGWg" factoryComponentContract="#_TxwAHVkTEd-bv5aydwO2Qw"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_nz1HkSCaEd-Sse0r9LJWbA">
+            <type xmi:type="pattern:TypePatternList" xmi:id="_tQl00Id1EemTGPCEQmMGWg"
+                elements="#_Pcm9szG0Ed-kc8dEZsdm2w"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tRl6YId1EemTGPCEQmMGWg" factoryComponentContract="#_OVsagFHVEd-dr9AWwNwIMQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_NFhJ4UMgEd-Ixul1H5ANhg"/>
+          <invocationContracts xmi:id="_tS-acId1EemTGPCEQmMGWg" factoryComponentContract="#_RcQCMPI7Ed-Pp8S8RvVOuQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_JWI2sPI7Ed-Pp8S8RvVOuQ"/>
+          <invocationContracts xmi:id="_tUW6gId1EemTGPCEQmMGWg" factoryComponentContract="#_sluXsVLLEd-ZSLMRjxSbVQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_vtlEAFLMEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+    </orchestration>
+  </fcore:FactoryComponent>
+  <fcore:FactoryComponent xmi:id="_PiIW4DG0Ed-kc8dEZsdm2w" name="EMF Edit Pattern">
+    <contractContainer xmi:id="_Prg8bzG0Ed-kc8dEZsdm2w">
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Prg8cDG0Ed-kc8dEZsdm2w"
+          description="EMF Edit Pattern" name="genModel" mandatory="true" invocationContracts="#_tXP2cId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeDomain" xmi:id="_tYIAMId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_jzYi8FIIEd-eGOdO3WtsxA"
+          description="EMF Edit Pattern" name="pattern.execution.reporter" invocationContracts="#_tYwSUId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tZWIMId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Tx5xHVkTEd-bv5aydwO2Qw"
+          description="EMF Edit Pattern" name="pattern.ids" invocationContracts="#_tZ_BYId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternList" xmi:id="_tanTgId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_UCnhEFHVEd-dr9AWwNwIMQ"
+          description="EMF Edit Pattern" name="pattern.substitutions" invocationContracts="#_tcMn4Id1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternSubstitution" xmi:id="_tc1hEId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_dgkvsPI7Ed-Pp8S8RvVOuQ"
+          description="EMF Edit Pattern" name="usedGenPackages" invocationContracts="#_tdbW8Id1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeGenPackages" xmi:id="_teBz4Id1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_9wHxsFLMEd-ZSLMRjxSbVQ"
+          description="EMF Edit Pattern" name="mergeRulesURI" invocationContracts="#_tenpwId1EemTGPCEQmMGWg">
+        <type xmi:type="types:TypeURI" xmi:id="_tfPU0Id1EemTGPCEQmMGWg"/>
+      </contracts>
+    </contractContainer>
+    <viewpointContainer xmi:id="_PiIW4TG0Ed-kc8dEZsdm2w">
+      <viewpoints xmi:type="pattern:PatternViewpoint" xmi:id="_PiIW4jG0Ed-kc8dEZsdm2w">
+        <libraries xmi:id="_PiIW4zG0Ed-kc8dEZsdm2w" name="org.eclipse.egf.emf.pattern.edit">
+          <elements xmi:id="_PiIW5DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/plugin.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="PluginXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PiIW5jG0Ed-kc8dEZsdm2w" conditionMethod="#_9qU51HLYEd-09ds9dfYpFw"
+              initMethod="#_PiIW5zG0Ed-kc8dEZsdm2w" footerMethod="#_PiIW6TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UbzFgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PiIW5jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PiIW5zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9qU51HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._9qU51HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PiIW6TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PiIW6zG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SuSFqGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._SuSFqGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_09tDuWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._09tDuWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PiIW7TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW7TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_UevEwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Uf47UId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UgeKIId1EemTGPCEQmMGWg"
+                called="#_PiIW7TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UgxFEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UhDY8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PibR0DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/build.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="BuildProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PibR0jG0Ed-kc8dEZsdm2w" conditionMethod="#_9kEg2HLYEd-09ds9dfYpFw"
+              initMethod="#_PibR0zG0Ed-kc8dEZsdm2w" footerMethod="#_PibR1TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Uhzm4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PibR0jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PibR0zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9kEg2HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._9kEg2HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PibR1TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PibR1zG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_St_KvGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._St_KvGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_09QXzWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._09QXzWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PibR2TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR2TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_UktJ4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Ul3AcId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UmaaEId1EemTGPCEQmMGWg"
+                called="#_PibR2TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_UmsG4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Um9MoId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PiuMwDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/manifest.mfjet&quot;&#xA;"
+              name="ManifestMF" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PiuMwjG0Ed-kc8dEZsdm2w" conditionMethod="#_9nWeVHLYEd-09ds9dfYpFw"
+              initMethod="#_PiuMwzG0Ed-kc8dEZsdm2w" footerMethod="#_PiuMxTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UnqXQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PiuMwjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PiuMwzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9nWeVHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._9nWeVHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PiuMxTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PiuMxzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SuI7uGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._SuI7uGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_09j5yWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._09j5yWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PiuMyTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMyTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_UqjTMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UruX4Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UsWqAId1EemTGPCEQmMGWg"
+                called="#_PiuMyTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Uspk8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Us7RwId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pi39wDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/plugin.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="PluginProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_xxtwkCg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pi39wjG0Ed-kc8dEZsdm2w" conditionMethod="#_9tdGVHLYEd-09ds9dfYpFw"
+              initMethod="#_Pi39wzG0Ed-kc8dEZsdm2w" footerMethod="#_Pi39xTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_UznvoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pi39wjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pi39wzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9tdGVHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._9tdGVHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pi39xTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pi39xzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Sub2qGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Sub2qGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0920uWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._0920uWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pi39yTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39yTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_U2ak8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_U3lpoId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_pQ16sChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_U4JDQId1EemTGPCEQmMGWg"
+                called="#_Pi39yTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_U4b-MId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_U4uSEId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PjK4sDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProvider.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.addPropertyDescriptor.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.getText.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.getStyledText.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.insert&#xA;"
+              name="ItemProvider" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_hYG6UCg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PjK4sjG0Ed-kc8dEZsdm2w" conditionMethod="#_9wJN9HLYEd-09ds9dfYpFw"
+              initMethod="#_PjK4szG0Ed-kc8dEZsdm2w" footerMethod="#_PjK4tTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_VLjHcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PjK4sjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4sjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PjK4szG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4szG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9wJN9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._9wJN9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PjK4tTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PjK4tzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SuuxqGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._SuuxqGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0-TgqWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._0-TgqWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PjK4uTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4uTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_VOnCgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VP7RIId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VQgf8Id1EemTGPCEQmMGWg"
+                called="#_PjK4uTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_VQza4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VRFuwId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PjdzoDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override&#xA;"
+              name="ItemProviderAdapterFactory" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PjdzojG0Ed-kc8dEZsdm2w" conditionMethod="#_92_c1HLYEd-09ds9dfYpFw"
+              initMethod="#_PjdzozG0Ed-kc8dEZsdm2w" footerMethod="#_PjdzpTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_VFhX8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PjdzojG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzojG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PjdzozG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzozG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_92_c1HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._92_c1HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PjdzpTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PjdzpzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SulnpGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._SulnpGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_09_-qWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._09_-qWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PjdzqTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzqTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_VIbiAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VJkxgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VKQuAId1EemTGPCEQmMGWg"
+                called="#_PjdzqTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_VKia0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VK0usId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PjwukDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/Plugin.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="Plugin" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PjwukjG0Ed-kc8dEZsdm2w" conditionMethod="#_9y-fhHLYEd-09ds9dfYpFw"
+              initMethod="#_PjwukzG0Ed-kc8dEZsdm2w" footerMethod="#_PjwulTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_U5g8QId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PjwukjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PjwukzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9y-fhHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._9y-fhHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PjwulTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PjwulzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SuuxmGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._SuuxmGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0-JvqWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._0-JvqWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PjwumTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwumTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_U8YDAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_U9jHsId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_U-IWgId1EemTGPCEQmMGWg"
+                called="#_PjwumTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_U-aqYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_U-sXMId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pj6fkDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * &#xA;"
+              name="CreateChildIconsForGenPackage" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_HODPICrVEd-81OQ8yF10Og"
+              headerMethod="#_PkEQkDG0Ed-kc8dEZsdm2w" conditionMethod="#_97KyNHLYEd-09ds9dfYpFw"
+              initMethod="#_PkEQkTG0Ed-kc8dEZsdm2w" footerMethod="#_PkEQkzG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_VXjjIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PkEQkDG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PkEQkTG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_97KyNHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._97KyNHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PkEQkzG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_0-wMmGKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._0-wMmGKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PkEQlzG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQlzG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_VaeUQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VbBt4Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_yLcWwCt-Ed-D6YqMf1n1Bg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VblHgId1EemTGPCEQmMGWg"
+                called="#_PkEQlzG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Vb20UId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VcJIMId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_0yyMcCt-Ed-D6YqMf1n1Bg"/>
+          </elements>
+          <elements xmi:id="_PkNagDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * &#xA;"
+              name="ItemIcon" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_IzJSwCrXEd-81OQ8yF10Og"
+              headerMethod="#_PkNagjG0Ed-kc8dEZsdm2w" conditionMethod="#_99Zm1HLYEd-09ds9dfYpFw"
+              initMethod="#_PkNagzG0Ed-kc8dEZsdm2w" footerMethod="#_PkNahTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Vh-DYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PkNagjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PkNagzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_99Zm1HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._99Zm1HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PkNahTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNahTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_0-mbmGKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._0-mbmGKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PkNaiTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNaiTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_VkvqkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VlTrQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Vl3E4Id1EemTGPCEQmMGWg"
+                called="#_PkNaiTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_VmIKoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VmZ3cId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pkg8gDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * &#xA;"
+              name="CreateChildIconsForGenClass" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_IzJSwCrXEd-81OQ8yF10Og"
+              headerMethod="#_Pkg8gjG0Ed-kc8dEZsdm2w" conditionMethod="#_9_MWlHLYEd-09ds9dfYpFw"
+              initMethod="#_Pkg8gzG0Ed-kc8dEZsdm2w" footerMethod="#_Pkg8hTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Vc1rwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pkg8gjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pkg8gzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_9_MWlHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._9_MWlHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pkg8hTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8hTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_0-cqmGKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._0-cqmGKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pkg8iTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8iTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Vfn6AId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VgL6sId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VgvUUId1EemTGPCEQmMGWg"
+                called="#_Pkg8iTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_VhBoMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VhSt8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_QPtOcH7rEd-W9_ZFSEQEPg" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/module.gwt.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="ModuleGWTXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_QPtOcn7rEd-W9_ZFSEQEPg" conditionMethod="#_QPtOdH7rEd-W9_ZFSEQEPg"
+              initMethod="#_QPtOc37rEd-W9_ZFSEQEPg" footerMethod="#_QPtOdn7rEd-W9_ZFSEQEPg">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Utq4oId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_QPtOcn7rEd-W9_ZFSEQEPg" name="header" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOcn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QPtOc37rEd-W9_ZFSEQEPg" name="init" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOc37rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QPtOdH7rEd-W9_ZFSEQEPg" name="preCondition" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QPtOdn7rEd-W9_ZFSEQEPg" name="footer" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QP2YYH7rEd-W9_ZFSEQEPg" name="setReporterVariables"
+                patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QP2YYX7rEd-W9_ZFSEQEPg" name="setArgument" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYX7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QP2YYn7rEd-W9_ZFSEQEPg" name="ensureProjectExists" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QP2YZH7rEd-W9_ZFSEQEPg" name="doGenerate" patternFilePath="templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YZH7rEd-W9_ZFSEQEPg.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Uwh_YId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Uxr18Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_UyREwId1EemTGPCEQmMGWg"
+                called="#_QP2YZH7rEd-W9_ZFSEQEPg"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Uyj_sId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Uy1sgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_QRpIIH7rEd-W9_ZFSEQEPg" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/Images.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="Images" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_QRpIIn7rEd-W9_ZFSEQEPg" conditionMethod="#_QRpIJH7rEd-W9_ZFSEQEPg"
+              initMethod="#_QRpII37rEd-W9_ZFSEQEPg" footerMethod="#_QRpIJn7rEd-W9_ZFSEQEPg">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_U_bXAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_QRpIIn7rEd-W9_ZFSEQEPg" name="header" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIIn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpII37rEd-W9_ZFSEQEPg" name="init" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpII37rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpIJH7rEd-W9_ZFSEQEPg" name="preCondition" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpIJn7rEd-W9_ZFSEQEPg" name="footer" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpIKH7rEd-W9_ZFSEQEPg" name="setReporterVariables"
+                patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpIKX7rEd-W9_ZFSEQEPg" name="setArgument" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKX7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpIKn7rEd-W9_ZFSEQEPg" name="ensureProjectExists" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QRpILH7rEd-W9_ZFSEQEPg" name="doGenerate" patternFilePath="templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpILH7rEd-W9_ZFSEQEPg.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_VCZLcId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VDnTcId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VEL7MId1EemTGPCEQmMGWg"
+                called="#_QRpILH7rEd-W9_ZFSEQEPg"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_VEe2IId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VExKAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_QR8DEH7rEd-W9_ZFSEQEPg" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/Properties.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="Properties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_QR8DEn7rEd-W9_ZFSEQEPg" conditionMethod="#_QR8DFH7rEd-W9_ZFSEQEPg"
+              initMethod="#_QR8DE37rEd-W9_ZFSEQEPg" footerMethod="#_QR8DFn7rEd-W9_ZFSEQEPg">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_VR1VoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_QR8DEn7rEd-W9_ZFSEQEPg" name="header" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DEn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DE37rEd-W9_ZFSEQEPg" name="init" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DE37rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DFH7rEd-W9_ZFSEQEPg" name="preCondition" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DFn7rEd-W9_ZFSEQEPg" name="footer" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DGH7rEd-W9_ZFSEQEPg" name="setReporterVariables"
+                patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGH7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DGX7rEd-W9_ZFSEQEPg" name="setArgument" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGX7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DGn7rEd-W9_ZFSEQEPg" name="ensureProjectExists" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGn7rEd-W9_ZFSEQEPg.pt"/>
+            <methods xmi:id="_QR8DHH7rEd-W9_ZFSEQEPg" name="doGenerate" patternFilePath="templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DHH7rEd-W9_ZFSEQEPg.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_VUnj4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VVuXIId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VWRwwId1EemTGPCEQmMGWg"
+                called="#_QR8DHH7rEd-W9_ZFSEQEPg"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_VWjdkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VW1KYId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_03mkEGJ-Ed-FqczH3ESmRw" name="org.eclipse.egf.emf.pattern.edit.call.ItemProvider">
+          <elements xmi:id="_03mkEWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProvider.javajet&quot;&#xA;"
+              name="ItemProvider.addPropertyDescriptor.override" headerMethod="#_03mkE2J-Ed-FqczH3ESmRw"
+              conditionMethod="#_BuWv9XLZEd-09ds9dfYpFw" initMethod="#_03mkFGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_03mkFmJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qfFWgId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_03mkE2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03mkFGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BuWv9XLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._BuWv9XLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_03mkFmJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03mkHWJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkHWJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_qi1OEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qjLMUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qjf8cId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qj1ToId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qkKq0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_qkez4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_qk0LEId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_qlJiQId1EemTGPCEQmMGWg" name="_List" type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qif24Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qlzpkId1EemTGPCEQmMGWg"
+                called="#_03mkHWJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_03wVEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProvider.javajet&quot;&#xA;"
+              name="ItemProvider.getText.override" headerMethod="#_03wVEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_BvZRxHLZEd-09ds9dfYpFw" initMethod="#_03wVE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_03wVFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qmj3gId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_03wVEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03wVE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_BvZRxHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._BvZRxHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_03wVFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_03wVG2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVG2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_qp_mAId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qqU9MId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qqn4IId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qq_EgId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_qrUbsId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_qrpL0Id1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_qr-jAId1EemTGPCEQmMGWg" name="_List" type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qpq14Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qsncMId1EemTGPCEQmMGWg"
+                called="#_03wVG2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_036GEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.insert&#xA;"
+              name="ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override"
+              headerMethod="#_036GEmJ-Ed-FqczH3ESmRw" conditionMethod="#_Bx7oZHLZEd-09ds9dfYpFw"
+              initMethod="#_036GE2J-Ed-FqczH3ESmRw" footerMethod="#_036GFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_plHooId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_036GEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_036GE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Bx7oZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._Bx7oZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_036GFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_036GIGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GIGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_polzYId1EemTGPCEQmMGWg" name="createClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_po5VYId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ppQhwId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_ppkDwId1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_pp3lwId1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_pqLu0Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_pqepwId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_pqyLwId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_prG74Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_poS4cId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_prv1EId1EemTGPCEQmMGWg"
+                called="#_036GIGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_04NBAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;"
+              name="ItemProvider.newChildDescriptorsReferenceDelegatedFeature.insert"
+              headerMethod="#_04NBAmJ-Ed-FqczH3ESmRw" conditionMethod="#_B2Z4tHLZEd-09ds9dfYpFw"
+              initMethod="#_04NBA2J-Ed-FqczH3ESmRw" footerMethod="#_04NBBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_psdmwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_04NBAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04NBA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_B2Z4tHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._B2Z4tHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_04NBBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04NBEGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBEGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_pv-00Id1EemTGPCEQmMGWg" name="createClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_pwRIsId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_pwjckId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_pw6o8Id1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_pxOK8Id1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_pxjiIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_px2dEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_pyLNMId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_pyevMId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_pvr54Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_pzGaQId1EemTGPCEQmMGWg"
+                called="#_04NBEGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_04WyAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.insert&#xA;"
+              name="ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override"
+              headerMethod="#_04WyAmJ-Ed-FqczH3ESmRw" conditionMethod="#_B3vVdHLZEd-09ds9dfYpFw"
+              initMethod="#_04WyA2J-Ed-FqczH3ESmRw" footerMethod="#_04WyBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_pz2BIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_04WyAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04WyA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_B3vVdHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._B3vVdHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_04WyBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04WyEGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyEGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_p3SWsId1EemTGPCEQmMGWg" name="createDataType" type="org.eclipse.emf.codegen.ecore.genmodel.GenDataType"/>
+            <parameters xmi:id="_p3l4sId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_p36BwId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_p4NjwId1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_p4iT4Id1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_p44SIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_p5L0IId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_p5eIAId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_p5xC8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_p2_bwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_p6ajMId1EemTGPCEQmMGWg"
+                called="#_04WyEGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_04f78GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;"
+              name="ItemProvider.newChildDescriptorsAttributeDelegatedFeature.insert"
+              headerMethod="#_04f78mJ-Ed-FqczH3ESmRw" conditionMethod="#_B4yeVHLZEd-09ds9dfYpFw"
+              initMethod="#_04f782J-Ed-FqczH3ESmRw" footerMethod="#_04f79WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_p7Ht0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_04f78mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f78mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04f782J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f782J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_B4yeVHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._B4yeVHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_04f79WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f79WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04f8AGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f8AGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_p-cuoId1EemTGPCEQmMGWg" name="createDataType" type="org.eclipse.emf.codegen.ecore.genmodel.GenDataType"/>
+            <parameters xmi:id="_p-vpkId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_p_DLkId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_p_X7sId1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_p_sEwId1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_qAAN0Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qATv0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qAnR0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qA6z0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_p-KawId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qBgpsId1EemTGPCEQmMGWg"
+                called="#_04f8AGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_04ps8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.insert&#xA;"
+              name="ItemProvider.newChildDescriptorsReferenceFeature.override" headerMethod="#_04ps8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_B63h9HLZEd-09ds9dfYpFw" initMethod="#_04ps82J-Ed-FqczH3ESmRw"
+              footerMethod="#_04ps9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qCSs0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_04ps8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04ps82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_B63h9HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._B63h9HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_04ps9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04ptAGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ptAGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_qFntoId1EemTGPCEQmMGWg" name="createClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qF6BgId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qGMVYId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qGfQUId1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_qGxkMId1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_qHGUUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qHadYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qHt_YId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qIA6UId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qFULoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qImJIId1EemTGPCEQmMGWg"
+                called="#_04ptAGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_04y24GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;"
+              name="ItemProvider.newChildDescriptorsReferenceFeature.insert" headerMethod="#_04y24mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_B-caZHLZEd-09ds9dfYpFw" initMethod="#_04y242J-Ed-FqczH3ESmRw"
+              footerMethod="#_04y25WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qJW-IId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_04y24mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y24mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04y242J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y242J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_B-caZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._B-caZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_04y25WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y25WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_04y28GJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y28GJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_qMsmAId1EemTGPCEQmMGWg" name="createClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qM_g8Id1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qNR00Id1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qNl94Id1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_qN440Id1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_qONo8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qOhK8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qO0F4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qPHA0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qMZrEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qPs2sId1EemTGPCEQmMGWg"
+                called="#_04y28GJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_048n4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.insert&#xA;"
+              name="ItemProvider.newChildDescriptorsAttributeFeature.override" headerMethod="#_048n4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_B_otNHLZEd-09ds9dfYpFw" initMethod="#_048n42J-Ed-FqczH3ESmRw"
+              footerMethod="#_048n5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qQaBUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_048n4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_048n42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_B_otNHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._B_otNHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_048n5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_048n8GJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n8GJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_qT0hsId1EemTGPCEQmMGWg" name="createDataType" type="org.eclipse.emf.codegen.ecore.genmodel.GenDataType"/>
+            <parameters xmi:id="_qUIDsId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qUZwgId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qUzZIId1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_qVGUEId1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_qVdgcId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qVxpgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qWGZoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qWaisId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qTg_sId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qXCNwId1EemTGPCEQmMGWg"
+                called="#_048n8GJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_05ZT0GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProviderAdapterFactory.javajet&quot;&#xA;"
+              name="ItemProvider.newChildDescriptorsAttributeFeature.insert" headerMethod="#_05ZT0mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CBIiBHLZEd-09ds9dfYpFw" initMethod="#_05ZT02J-Ed-FqczH3ESmRw"
+              footerMethod="#_05ZT1WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qXuxUId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_05ZT0mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT0mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_05ZT02J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT02J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CBIiBHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._CBIiBHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_05ZT1WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT1WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_05ZT4GJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT4GJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_qbFnUId1EemTGPCEQmMGWg" name="createDataType" type="org.eclipse.emf.codegen.ecore.genmodel.GenDataType"/>
+            <parameters xmi:id="_qbblkId1EemTGPCEQmMGWg" name="createFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qbwVsId1EemTGPCEQmMGWg" name="delegatedFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_qcDQoId1EemTGPCEQmMGWg" name="createClassifier" type="org.eclipse.emf.codegen.ecore.genmodel.GenClassifier"/>
+            <parameters xmi:id="_qcbrIId1EemTGPCEQmMGWg" name="childCreationData"
+                type="org.eclipse.emf.codegen.ecore.genmodel.GenClass$ChildCreationData"/>
+            <parameters xmi:id="_qcv0MId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qdFycId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qdZUcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qds2cId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qaysYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_qeTTYId1EemTGPCEQmMGWg"
+                called="#_05ZT4GJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_051_wGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProvider.javajet&quot;&#xA;"
+              name="ItemProvider.insert" headerMethod="#_051_wmJ-Ed-FqczH3ESmRw" conditionMethod="#_CCU01HLZEd-09ds9dfYpFw"
+              initMethod="#_051_w2J-Ed-FqczH3ESmRw" footerMethod="#_051_xWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_q1UFMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_051_wmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_wmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_051_w2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_w2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CCU01HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._CCU01HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_051_xWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_xWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_051_y2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_y2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_q4tXcId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_q5ASYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_q5VCgId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_q5okgId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_q58GgId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_q6QPkId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_q6jKgId1EemTGPCEQmMGWg" name="_List" type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_q4Z1cId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_q7MDsId1EemTGPCEQmMGWg"
+                called="#_051_y2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_sd5EMKoMEeOCpsO1cKKCxA" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/edit/ItemProvider.javajet&quot;&#xA;"
+              name="ItemProvider.getStyledText.override" headerMethod="#_sd5EMqoMEeOCpsO1cKKCxA"
+              conditionMethod="#_sd5ENKoMEeOCpsO1cKKCxA" initMethod="#_sd5EM6oMEeOCpsO1cKKCxA"
+              footerMethod="#_sd5ENqoMEeOCpsO1cKKCxA">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_qtXqIId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_sd5EMqoMEeOCpsO1cKKCxA" name="header" patternFilePath="templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EMqoMEeOCpsO1cKKCxA.pt"/>
+            <methods xmi:id="_sd5EM6oMEeOCpsO1cKKCxA" name="init" patternFilePath="templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EM6oMEeOCpsO1cKKCxA.pt"/>
+            <methods xmi:id="_sd5ENKoMEeOCpsO1cKKCxA" name="preCondition" patternFilePath="templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENKoMEeOCpsO1cKKCxA.pt"/>
+            <methods xmi:id="_sd5ENqoMEeOCpsO1cKKCxA" name="footer" patternFilePath="templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENqoMEeOCpsO1cKKCxA.pt"/>
+            <methods xmi:id="_sd5EPKoMEeOCpsO1cKKCxA" name="doGenerate" patternFilePath="templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EPKoMEeOCpsO1cKKCxA.pt"/>
+            <parameters xmi:id="_qxCCIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_qxWyQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_qyn9kId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_qy8tsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_qzSE4Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_qzm1AId1EemTGPCEQmMGWg" name="indentDefaultCase"
+                type="java.lang.String"/>
+            <parameters xmi:id="_qz7lIId1EemTGPCEQmMGWg" name="_List" type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_qwsD4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_q0j3QId1EemTGPCEQmMGWg"
+                called="#_sd5EPKoMEeOCpsO1cKKCxA"/>
+          </elements>
+        </libraries>
+      </viewpoints>
+    </viewpointContainer>
+    <orchestration xmi:type="fprod:ProductionPlan" xmi:id="_Prg8azG0Ed-kc8dEZsdm2w">
+      <invocations xmi:id="_tWBHYId1EemTGPCEQmMGWg" name="EMF Edit Pattern" invokedActivity="ftask:Task platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_jT-SgD1hEd-m5uHrCQ1Jew">
+        <invocationContractContainer xmi:id="_tWpZgId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_tXP2cId1EemTGPCEQmMGWg" factoryComponentContract="#_Prg8cDG0Ed-kc8dEZsdm2w"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_DgB2IP6fEd64XaYPo3s6sPg"/>
+          <invocationContracts xmi:id="_tYwSUId1EemTGPCEQmMGWg" factoryComponentContract="#_jzYi8FIIEd-eGOdO3WtsxA"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_L6JSwAHAEd-4faJMEplCjxw">
+            <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tZDNQId1EemTGPCEQmMGWg"
+                value="org.eclipse.egf.emf.pattern.base.ContentTypePatternExecutionReporter"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tZ_BYId1EemTGPCEQmMGWg" factoryComponentContract="#_Tx5xHVkTEd-bv5aydwO2Qw"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_nz1HkSCaEd-Sse0r9LJWbA">
+            <type xmi:type="pattern:TypePatternList" xmi:id="_taTxgId1EemTGPCEQmMGWg"
+                elements="#_PiIW4zG0Ed-kc8dEZsdm2w"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tcMn4Id1EemTGPCEQmMGWg" factoryComponentContract="#_UCnhEFHVEd-dr9AWwNwIMQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_NFhJ4UMgEd-Ixul1H5ANhg"/>
+          <invocationContracts xmi:id="_tdbW8Id1EemTGPCEQmMGWg" factoryComponentContract="#_dgkvsPI7Ed-Pp8S8RvVOuQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_JWI2sPI7Ed-Pp8S8RvVOuQ"/>
+          <invocationContracts xmi:id="_tenpwId1EemTGPCEQmMGWg" factoryComponentContract="#_9wHxsFLMEd-ZSLMRjxSbVQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_vtlEAFLMEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+    </orchestration>
+  </fcore:FactoryComponent>
+  <fcore:FactoryComponent xmi:id="_PkqGcDG0Ed-kc8dEZsdm2w" name="EMF Editor Pattern">
+    <contractContainer xmi:id="_Prg8ejG0Ed-kc8dEZsdm2w">
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Prg8ezG0Ed-kc8dEZsdm2w"
+          description="EMF Editor Pattern" name="genModel" mandatory="true" invocationContracts="#_thUYcId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeDomain" xmi:id="_tiL7IId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_pCqEMFIIEd-eGOdO3WtsxA"
+          description="EMF Editor Pattern" name="pattern.execution.reporter" invocationContracts="#_tiv70Id1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tjVKoId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Tx5xMlkTEd-bv5aydwO2Qw"
+          description="EMF Editor Pattern" name="pattern.ids" invocationContracts="#_tj6ZcId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternList" xmi:id="_tkgPUId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Y3EukFHVEd-dr9AWwNwIMQ"
+          description="EMF Editor Pattern" name="pattern.substitutions" invocationContracts="#_tlGsQId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternSubstitution" xmi:id="_tltwQId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_NcZ6I_MqEd-6tr0C8ZV8Ew"
+          description="EMF Editor Pattern" name="usedGenPackages" invocationContracts="#_tmS_EId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeGenPackages" xmi:id="_tm2YsId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_FqdyEFLNEd-ZSLMRjxSbVQ"
+          description="EMF Editor Pattern" name="mergeRulesURI" invocationContracts="#_tnf48Id1EemTGPCEQmMGWg">
+        <type xmi:type="types:TypeURI" xmi:id="_toHkAId1EemTGPCEQmMGWg"/>
+      </contracts>
+    </contractContainer>
+    <viewpointContainer xmi:id="_PkqGcTG0Ed-kc8dEZsdm2w">
+      <viewpoints xmi:type="pattern:PatternViewpoint" xmi:id="_PkqGcjG0Ed-kc8dEZsdm2w">
+        <libraries xmi:id="_PkqGczG0Ed-kc8dEZsdm2w" name="org.eclipse.egf.emf.pattern.editor">
+          <elements xmi:id="_PkqGdDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/plugin.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="PluginXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PkqGdjG0Ed-kc8dEZsdm2w" conditionMethod="#_-G79VHLYEd-09ds9dfYpFw"
+              initMethod="#_PkqGdzG0Ed-kc8dEZsdm2w" footerMethod="#_PkqGeTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_V0QGMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PkqGdjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PkqGdzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-G79VHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._-G79VHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PkqGeTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGeTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pkz3cDG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SvoJeGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._SvoJeGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0_MReWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._0_MReWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pkz3cjG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cjG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_V3RlAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_V4d30Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_V5DGoId1EemTGPCEQmMGWg"
+                called="#_Pkz3cjG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_V5WooId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_V5o8gId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pk9BYDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/manifest.mfjet&quot;&#xA;"
+              name="ManifestMF" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pk9BYjG0Ed-kc8dEZsdm2w" conditionMethod="#_-A1VWHLYEd-09ds9dfYpFw"
+              initMethod="#_Pk9BYzG0Ed-kc8dEZsdm2w" footerMethod="#_Pk9BZTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WGJugId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pk9BYjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pk9BYzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-A1VWHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._-A1VWHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pk9BZTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pk9BZzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SveYeGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._SveYeGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0_DHiWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._0_DHiWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pk9BaTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BaTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WI7VsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WKA60Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WKk7gId1EemTGPCEQmMGWg"
+                called="#_Pk9BaTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WK3PYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WLI8MId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PlQjYDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/build.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="BuildProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PlQjYjG0Ed-kc8dEZsdm2w" conditionMethod="#_-DEJ9HLYEd-09ds9dfYpFw"
+              initMethod="#_PlQjYzG0Ed-kc8dEZsdm2w" footerMethod="#_PlQjZTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Vs9ycId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PlQjYjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PlQjYzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-DEJ9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._-DEJ9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PlQjZTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PlQjZzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SvVOjGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._SvVOjGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0-5WjWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._0-5WjWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PlQjaTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjaTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Vv05MId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Vw-vwId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VxiwcId1EemTGPCEQmMGWg"
+                called="#_PlQjaTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Vx1rYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VyH_QId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PljeUDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/plugin.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="PluginProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_xxtwkCg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PljeUjG0Ed-kc8dEZsdm2w" conditionMethod="#_-K9htHLYEd-09ds9dfYpFw"
+              initMethod="#_PljeUzG0Ed-kc8dEZsdm2w" footerMethod="#_PljeVTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WRusYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PljeUjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PljeUzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-K9htHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._-K9htHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PljeVTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PljeVzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Svx6eGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._Svx6eGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0_WCeWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._0_WCeWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PljeWTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeWTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WUrSsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WVyF8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_pQ16sChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WWWtsId1EemTGPCEQmMGWg"
+                called="#_PljeWTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WWpBkId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WW6uYId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PltPUDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/ActionBarContributor.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="ActionBarContributor" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PltPUjG0Ed-kc8dEZsdm2w" conditionMethod="#_-VjBFHLYEd-09ds9dfYpFw"
+              initMethod="#_PltPUzG0Ed-kc8dEZsdm2w" footerMethod="#_PltPVTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Wdf3gId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PltPUjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PltPUzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-VjBFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._-VjBFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PltPVTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPVTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pl2ZQDG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SwhhWGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._SwhhWGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1AFpWWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._1AFpWWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pl2ZQjG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQjG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WgaooId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WhlGQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WiIf4Id1EemTGPCEQmMGWg"
+                called="#_Pl2ZQjG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WiaMsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Wiu80Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pmc2MDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/Editor.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.editor.call.Editor.Editor.addItemProviderFactories.override&#xA;"
+              name="Editor" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PmmAIDG0Ed-kc8dEZsdm2w" conditionMethod="#_-SaNhHLYEd-09ds9dfYpFw"
+              initMethod="#_PmmAITG0Ed-kc8dEZsdm2w" footerMethod="#_PmmAIzG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WjcugId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PmmAIDG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PmmAITG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAITG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-SaNhHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._-SaNhHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PmmAIzG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PmmAJTG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SwqrSGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._SwqrSGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1APaWWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._1APaWWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PmmAJzG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJzG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WmPj0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WnYMQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Wn8M8Id1EemTGPCEQmMGWg"
+                called="#_PmmAJzG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WoOg0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WoiC0Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PmvxIDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/ModelWizard.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="ModelWizard" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PmvxIjG0Ed-kc8dEZsdm2w" conditionMethod="#_-Y0XhHLYEd-09ds9dfYpFw"
+              initMethod="#_PmvxIzG0Ed-kc8dEZsdm2w" footerMethod="#_PmvxJTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WXqVQId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PmvxIjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PmvxIzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-Y0XhHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._-Y0XhHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PmvxJTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxJTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pm5iIDG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SwN_WGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._SwN_WGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0_yuaWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._0_yuaWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pm5iIjG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIjG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WagN4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WboPQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WcLo4Id1EemTGPCEQmMGWg"
+                called="#_Pm5iIjG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WcdVsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Wcw3sId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PnCsEDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/Plugin.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="Plugin" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PnCsEjG0Ed-kc8dEZsdm2w" conditionMethod="#_-NpCRHLYEd-09ds9dfYpFw"
+              initMethod="#_PnCsEzG0Ed-kc8dEZsdm2w" footerMethod="#_PnCsFTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WvHzAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PnCsEjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PnCsEzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-NpCRHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._-NpCRHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PnCsFTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PnCsFzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SwE1aGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._SwE1aGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0_fzeWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._0_fzeWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PnCsGTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsGTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WyHcoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WzQFEId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Wz0s0Id1EemTGPCEQmMGWg"
+                called="#_PnCsGTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_W0HAsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_W0aisId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PnVnADG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/Advisor.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="Advisor" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PnVnAjG0Ed-kc8dEZsdm2w" conditionMethod="#_-P4d9HLYEd-09ds9dfYpFw"
+              initMethod="#_PnVnAzG0Ed-kc8dEZsdm2w" footerMethod="#_PnVnBTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_W1KJkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PnVnAjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PnVnAzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-P4d9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._-P4d9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PnVnBTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PnVnBzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Sv7EaGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._Sv7EaGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_0_o9aWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._0_o9aWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PnVnCTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnCTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_W4Gv4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_W5QmcId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_W53DYId1EemTGPCEQmMGWg"
+                called="#_PnVnCTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_W6KlYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_W6dgUId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PnpJADG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * &#xA;"
+              name="ModelWizardIcon" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_HODPICrVEd-81OQ8yF10Og"
+              headerMethod="#_PnpJAjG0Ed-kc8dEZsdm2w" conditionMethod="#_-bppFHLYEd-09ds9dfYpFw"
+              initMethod="#_PnpJAzG0Ed-kc8dEZsdm2w" footerMethod="#_PnpJBTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XAvHcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PnpJAjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PnpJAzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-bppFHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._-bppFHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PnpJBTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJBTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_1AiVSGKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._1AiVSGKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PnpJCTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJCTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_XDm1QId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XELdAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_yLcWwCt-Ed-D6YqMf1n1Bg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XExS4Id1EemTGPCEQmMGWg"
+                called="#_PnpJCTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_XFE04Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XFZlAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_0yyMcCt-Ed-D6YqMf1n1Bg"/>
+          </elements>
+          <elements xmi:id="_Pn8D8DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * &#xA;"
+              name="ModelIcon" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_HODPICrVEd-81OQ8yF10Og"
+              headerMethod="#_Pn8D8jG0Ed-kc8dEZsdm2w" conditionMethod="#_-dcY1HLYEd-09ds9dfYpFw"
+              initMethod="#_Pn8D8zG0Ed-kc8dEZsdm2w" footerMethod="#_Pn8D9TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_W7R_sId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pn8D8jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pn8D8zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-dcY1HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._-dcY1HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pn8D9TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D9TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_1AYkSGKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._1AYkSGKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pn8D-TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D-TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_W-SQYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_W-4GQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_yLcWwCt-Ed-D6YqMf1n1Bg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_W_d8IId1EemTGPCEQmMGWg"
+                called="#_Pn8D-TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_W_w3EId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XADK8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_0yyMcCt-Ed-D6YqMf1n1Bg"/>
+          </elements>
+          <elements xmi:id="__H8bZBmtEeCMbfVQrOfmzQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/appengine-web.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="AppEngineWebXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#__H8bZhmtEeCMbfVQrOfmzQ" conditionMethod="#__H8baBmtEeCMbfVQrOfmzQ"
+              initMethod="#__H8bZxmtEeCMbfVQrOfmzQ" footerMethod="#__H8bahmtEeCMbfVQrOfmzQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WL7mYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="__H8bZhmtEeCMbfVQrOfmzQ" name="header" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8bZxmtEeCMbfVQrOfmzQ" name="init" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZxmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8baBmtEeCMbfVQrOfmzQ" name="preCondition" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8baBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8bahmtEeCMbfVQrOfmzQ" name="footer" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bahmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8bbBmtEeCMbfVQrOfmzQ" name="setReporterVariables"
+                patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8bbRmtEeCMbfVQrOfmzQ" name="setArgument" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbRmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8bbhmtEeCMbfVQrOfmzQ" name="ensureProjectExists" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__H8bcBmtEeCMbfVQrOfmzQ" name="doGenerate" patternFilePath="templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bcBmtEeCMbfVQrOfmzQ.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WOxfAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WP5gYId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WQc6AId1EemTGPCEQmMGWg"
+                called="#__H8bcBmtEeCMbfVQrOfmzQ"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WQum0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WRAToId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="__I1zQBmtEeCMbfVQrOfmzQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/home.htmljet&quot;&#xA;"
+              name="HomeHTML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#__I1zQhmtEeCMbfVQrOfmzQ" conditionMethod="#__I1zRBmtEeCMbfVQrOfmzQ"
+              initMethod="#__I1zQxmtEeCMbfVQrOfmzQ" footerMethod="#__I1zRhmtEeCMbfVQrOfmzQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_VnL6kId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="__I1zQhmtEeCMbfVQrOfmzQ" name="header" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zQxmtEeCMbfVQrOfmzQ" name="init" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQxmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zRBmtEeCMbfVQrOfmzQ" name="preCondition" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zRhmtEeCMbfVQrOfmzQ" name="footer" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zSBmtEeCMbfVQrOfmzQ" name="setReporterVariables"
+                patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zSRmtEeCMbfVQrOfmzQ" name="setArgument" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSRmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zShmtEeCMbfVQrOfmzQ" name="ensureProjectExists" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zShmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__I1zTBmtEeCMbfVQrOfmzQ" name="doGenerate" patternFilePath="templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zTBmtEeCMbfVQrOfmzQ.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Vp9hwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VrE8EId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Vrqx8Id1EemTGPCEQmMGWg"
+                called="#__I1zTBmtEeCMbfVQrOfmzQ"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Vr9s4Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_VsPZsId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="__KLQABmtEeCMbfVQrOfmzQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/module.gwt.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="ModuleGWTXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#__KLQAhmtEeCMbfVQrOfmzQ" conditionMethod="#__KLQBBmtEeCMbfVQrOfmzQ"
+              initMethod="#__KLQAxmtEeCMbfVQrOfmzQ" footerMethod="#__KLQBhmtEeCMbfVQrOfmzQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_V6X8UId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="__KLQAhmtEeCMbfVQrOfmzQ" name="header" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQAxmtEeCMbfVQrOfmzQ" name="init" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAxmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQBBmtEeCMbfVQrOfmzQ" name="preCondition" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQBhmtEeCMbfVQrOfmzQ" name="footer" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQCBmtEeCMbfVQrOfmzQ" name="setReporterVariables"
+                patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQCRmtEeCMbfVQrOfmzQ" name="setArgument" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCRmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQChmtEeCMbfVQrOfmzQ" name="ensureProjectExists" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQChmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__KLQDBmtEeCMbfVQrOfmzQ" name="doGenerate" patternFilePath="templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQDBmtEeCMbfVQrOfmzQ.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_V9OcAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_V-XrgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_V-7sMId1EemTGPCEQmMGWg"
+                called="#__KLQDBmtEeCMbfVQrOfmzQ"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_V_OAEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_V_gT8Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="__gO_kBmtEeCMbfVQrOfmzQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/web.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="WebXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#__gO_khmtEeCMbfVQrOfmzQ" conditionMethod="#__gO_lBmtEeCMbfVQrOfmzQ"
+              initMethod="#__gO_kxmtEeCMbfVQrOfmzQ" footerMethod="#__gO_lhmtEeCMbfVQrOfmzQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WAPTwId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="__gO_khmtEeCMbfVQrOfmzQ" name="header" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_khmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_kxmtEeCMbfVQrOfmzQ" name="init" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_kxmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_lBmtEeCMbfVQrOfmzQ" name="preCondition" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_lhmtEeCMbfVQrOfmzQ" name="footer" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_mBmtEeCMbfVQrOfmzQ" name="setReporterVariables"
+                patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mBmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_mRmtEeCMbfVQrOfmzQ" name="setArgument" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mRmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_mhmtEeCMbfVQrOfmzQ" name="ensureProjectExists" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mhmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__gO_nBmtEeCMbfVQrOfmzQ" name="doGenerate" patternFilePath="templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_nBmtEeCMbfVQrOfmzQ.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WDCJEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WEKxgId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WEtkEId1EemTGPCEQmMGWg"
+                called="#__gO_nBmtEeCMbfVQrOfmzQ"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WFC7QId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WFUBAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="__9b48BmtEeCMbfVQrOfmzQ" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/EntryPoint.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="EntryPoint" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#__9b48hmtEeCMbfVQrOfmzQ" conditionMethod="#__9b49BmtEeCMbfVQrOfmzQ"
+              initMethod="#__9b48xmtEeCMbfVQrOfmzQ" footerMethod="#__9b49hmtEeCMbfVQrOfmzQ">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_WpS30Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="__9b48hmtEeCMbfVQrOfmzQ" name="header" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48hmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b48xmtEeCMbfVQrOfmzQ" name="init" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48xmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b49BmtEeCMbfVQrOfmzQ" name="preCondition" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49BmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b49hmtEeCMbfVQrOfmzQ" name="footer" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49hmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b4-BmtEeCMbfVQrOfmzQ" name="setReporterVariables"
+                patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-BmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b4-RmtEeCMbfVQrOfmzQ" name="setArgument" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-RmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b4-hmtEeCMbfVQrOfmzQ" name="ensureProjectExists" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-hmtEeCMbfVQrOfmzQ.pt"/>
+            <methods xmi:id="__9b4_BmtEeCMbfVQrOfmzQ" name="doGenerate" patternFilePath="templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4_BmtEeCMbfVQrOfmzQ.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_WsGUMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WtQx0Id1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Wt0LcId1EemTGPCEQmMGWg"
+                called="#__9b4_BmtEeCMbfVQrOfmzQ"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_WuF4QId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_WuYMIId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_08-MQGJ-Ed-FqczH3ESmRw" name="org.eclipse.egf.emf.pattern.editor.call.Editor">
+          <elements xmi:id="_08-MQWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/Editor.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.editor.call.Editor.Editor.addItemProviderFactories.insert&#xA;"
+              name="Editor.addItemProviderFactories.override" headerMethod="#_08-MQ2J-Ed-FqczH3ESmRw"
+              conditionMethod="#_CC6qtXLZEd-09ds9dfYpFw" initMethod="#_08-MRGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_08-MRmJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_q8N-cId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_08-MQ2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MQ2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_08-MRGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CC6qtXLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._CC6qtXLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_08-MRmJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_08-MXGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MXGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_q_nQsId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_q_6LoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_rANGkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_rAgokId1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_rA0KkId1EemTGPCEQmMGWg" name="importedOperationClassName"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rBHskId1EemTGPCEQmMGWg" name="operationMethodName"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rBccsId1EemTGPCEQmMGWg" name="_ArrayListOfObject"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rBv-sId1EemTGPCEQmMGWg" name="_ArrayListOfSelectionChangedListener"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rCDgsId1EemTGPCEQmMGWg" name="_CollectionOfSelectionChangedListener"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rCXpwId1EemTGPCEQmMGWg" name="_ListOfResource" type="java.lang.String"/>
+            <parameters xmi:id="_rCrLwId1EemTGPCEQmMGWg" name="_ArrayListOfResource"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rC-twId1EemTGPCEQmMGWg" name="_CollectionOfResource"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rDSPwId1EemTGPCEQmMGWg" name="_MapOfResourceToDiagnostic"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rDm_4Id1EemTGPCEQmMGWg" name="_HashMapOfResourceToBoolean"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rD6h4Id1EemTGPCEQmMGWg" name="_MapOfObjectToObject"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rEQgIId1EemTGPCEQmMGWg" name="_HashMapOfObjectToObject"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rEkCIId1EemTGPCEQmMGWg" name="_LinkedHashMapOfResourceToDiagnostic"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rE4LMId1EemTGPCEQmMGWg" name="_CollectionOfAnything"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rFLtMId1EemTGPCEQmMGWg" name="_ListOfAnything" type="java.lang.String"/>
+            <parameters xmi:id="_rFf2QId1EemTGPCEQmMGWg" name="useExtendedLabelProvider"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_rF0mYId1EemTGPCEQmMGWg" name="useStyledLabelProvider"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_rGJ9kId1EemTGPCEQmMGWg" name="_AdapterFactoryLabelProvider"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rGdfkId1EemTGPCEQmMGWg" name="_DelegatingAdapterFactoryLabelProvider"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rGwagId1EemTGPCEQmMGWg" name="_DecoratingColumLabelProvider"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rHFKoId1EemTGPCEQmMGWg" name="_DiagnosticDecorator"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rHYsoId1EemTGPCEQmMGWg" name="_ArrayListOfString"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rHrAgId1EemTGPCEQmMGWg" name="_ListOfString" type="java.lang.String"/>
+            <parameters xmi:id="_rH-igId1EemTGPCEQmMGWg" name="_ListOfPropertySheetPage"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rIQ2YId1EemTGPCEQmMGWg" name="_ArrayListOfPropertySheetPage"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_q_UVwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_rI2FMId1EemTGPCEQmMGWg"
+                called="#_08-MXGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_09RHMGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/editor/Editor.javajet&quot;&#xA;"
+              name="Editor.addItemProviderFactories.insert" headerMethod="#_09RHMmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CHY7BHLZEd-09ds9dfYpFw" initMethod="#_09RHM2J-Ed-FqczH3ESmRw"
+              footerMethod="#_09RHNWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_rJj24Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_09RHMmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHMmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_09RHM2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHM2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CHY7BHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._CHY7BHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_09RHNWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHNWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_09RHS2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHS2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_rM43sId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_rNQrIId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_rNjmEId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <parameters xmi:id="_rN158Id1EemTGPCEQmMGWg" name="forceDefaultCase" type="java.lang.Boolean"/>
+            <parameters xmi:id="_rOI04Id1EemTGPCEQmMGWg" name="importedOperationClassName"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rOcW4Id1EemTGPCEQmMGWg" name="operationMethodName"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rOvR0Id1EemTGPCEQmMGWg" name="_ArrayListOfObject"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rPDa4Id1EemTGPCEQmMGWg" name="_ArrayListOfSelectionChangedListener"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rPW84Id1EemTGPCEQmMGWg" name="_CollectionOfSelectionChangedListener"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rPp30Id1EemTGPCEQmMGWg" name="_ListOfResource" type="java.lang.String"/>
+            <parameters xmi:id="_rP8ywId1EemTGPCEQmMGWg" name="_ArrayListOfResource"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rQQUwId1EemTGPCEQmMGWg" name="_CollectionOfResource"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rQjPsId1EemTGPCEQmMGWg" name="_MapOfResourceToDiagnostic"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rQ4m4Id1EemTGPCEQmMGWg" name="_HashMapOfResourceToBoolean"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rRMI4Id1EemTGPCEQmMGWg" name="_MapOfObjectToObject"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rRfD0Id1EemTGPCEQmMGWg" name="_HashMapOfObjectToObject"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rRyl0Id1EemTGPCEQmMGWg" name="_LinkedHashMapOfResourceToDiagnostic"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rSHV8Id1EemTGPCEQmMGWg" name="_CollectionOfAnything"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rSa38Id1EemTGPCEQmMGWg" name="_ListOfAnything" type="java.lang.String"/>
+            <parameters xmi:id="_rSvBAId1EemTGPCEQmMGWg" name="useExtendedLabelProvider"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_rTDKEId1EemTGPCEQmMGWg" name="useStyledLabelProvider"
+                type="java.lang.Boolean"/>
+            <parameters xmi:id="_rTXTIId1EemTGPCEQmMGWg" name="_AdapterFactoryLabelProvider"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rTrcMId1EemTGPCEQmMGWg" name="_DelegatingAdapterFactoryLabelProvider"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rT_lQId1EemTGPCEQmMGWg" name="_DecoratingColumLabelProvider"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rUTuUId1EemTGPCEQmMGWg" name="_DiagnosticDecorator"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rUoecId1EemTGPCEQmMGWg" name="_ArrayListOfString"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rU_DwId1EemTGPCEQmMGWg" name="_ListOfString" type="java.lang.String"/>
+            <parameters xmi:id="_rVVpEId1EemTGPCEQmMGWg" name="_ListOfPropertySheetPage"
+                type="java.lang.String"/>
+            <parameters xmi:id="_rVwf0Id1EemTGPCEQmMGWg" name="_ArrayListOfPropertySheetPage"
+                type="java.lang.String"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_rMjggId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_rWW8wId1EemTGPCEQmMGWg"
+                called="#_09RHS2J-Ed-FqczH3ESmRw"/>
+          </elements>
+        </libraries>
+      </viewpoints>
+    </viewpointContainer>
+    <orchestration xmi:type="fprod:ProductionPlan" xmi:id="_Prg8djG0Ed-kc8dEZsdm2w">
+      <invocations xmi:id="_tgJ60Id1EemTGPCEQmMGWg" name="EMF Editor Pattern" invokedActivity="ftask:Task platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_jT-SgD1hEd-m5uHrCQ1Jew">
+        <invocationContractContainer xmi:id="_tgvwsId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_thUYcId1EemTGPCEQmMGWg" factoryComponentContract="#_Prg8ezG0Ed-kc8dEZsdm2w"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_DgB2IP6fEd64XaYPo3s6sPg"/>
+          <invocationContracts xmi:id="_tiv70Id1EemTGPCEQmMGWg" factoryComponentContract="#_pCqEMFIIEd-eGOdO3WtsxA"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_L6JSwAHAEd-4faJMEplCjxw">
+            <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tjCPsId1EemTGPCEQmMGWg"
+                value="org.eclipse.egf.emf.pattern.base.ContentTypePatternExecutionReporter"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tj6ZcId1EemTGPCEQmMGWg" factoryComponentContract="#_Tx5xMlkTEd-bv5aydwO2Qw"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_nz1HkSCaEd-Sse0r9LJWbA">
+            <type xmi:type="pattern:TypePatternList" xmi:id="_tkNUYId1EemTGPCEQmMGWg"
+                elements="#_PkqGczG0Ed-kc8dEZsdm2w"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tlGsQId1EemTGPCEQmMGWg" factoryComponentContract="#_Y3EukFHVEd-dr9AWwNwIMQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_NFhJ4UMgEd-Ixul1H5ANhg"/>
+          <invocationContracts xmi:id="_tmS_EId1EemTGPCEQmMGWg" factoryComponentContract="#_NcZ6I_MqEd-6tr0C8ZV8Ew"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_JWI2sPI7Ed-Pp8S8RvVOuQ"/>
+          <invocationContracts xmi:id="_tnf48Id1EemTGPCEQmMGWg" factoryComponentContract="#_FqdyEFLNEd-ZSLMRjxSbVQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_vtlEAFLMEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+    </orchestration>
+  </fcore:FactoryComponent>
+  <fcore:FactoryComponent xmi:id="_PoF08DG0Ed-kc8dEZsdm2w" name="EMF Tests Pattern">
+    <contractContainer xmi:id="_Prg8hTG0Ed-kc8dEZsdm2w">
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Prg8hjG0Ed-kc8dEZsdm2w"
+          description="EMF Tests Pattern" name="genModel" mandatory="true" invocationContracts="#_tqaDAId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeDomain" xmi:id="_trSMwId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_tvg04FIIEd-eGOdO3WtsxA"
+          description="EMF Tests Pattern" name="pattern.execution.reporter" invocationContracts="#_tr2NcId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tscqYId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Tx5xR1kTEd-bv5aydwO2Qw"
+          description="EMF Tests Pattern" name="pattern.ids" invocationContracts="#_ttDuYId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternList" xmi:id="_ttpkQId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_eYFgEFHVEd-dr9AWwNwIMQ"
+          description="EMF Tests Pattern" name="pattern.substitutions" invocationContracts="#_tuQoQId1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternSubstitution" xmi:id="_tu7WoId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_NcjD0vMqEd-6tr0C8ZV8Ew"
+          description="EMF Tests Pattern" name="usedGenPackages" invocationContracts="#_tvhMgId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeGenPackages" xmi:id="_twHCYId1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_LnCeMFLNEd-ZSLMRjxSbVQ"
+          description="EMF Tests Pattern" name="mergeRulesURI" invocationContracts="#_tws4QId1EemTGPCEQmMGWg">
+        <type xmi:type="types:TypeURI" xmi:id="_txSHEId1EemTGPCEQmMGWg"/>
+      </contracts>
+    </contractContainer>
+    <viewpointContainer xmi:id="_PoO-4DG0Ed-kc8dEZsdm2w">
+      <viewpoints xmi:type="pattern:PatternViewpoint" xmi:id="_PoO-4TG0Ed-kc8dEZsdm2w">
+        <libraries xmi:id="_PoO-4jG0Ed-kc8dEZsdm2w" name="org.eclipse.egf.emf.pattern.tests">
+          <elements xmi:id="_PoO-4zG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/plugin.xmljet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderXml&#xA;"
+              name="PluginXML" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PoO-5TG0Ed-kc8dEZsdm2w" conditionMethod="#_-pXU9HLYEd-09ds9dfYpFw"
+              initMethod="#_PoO-5jG0Ed-kc8dEZsdm2w" footerMethod="#_PoO-6DG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XGGvoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PoO-5TG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PoO-5jG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-pXU9HLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._-pXU9HLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PoO-6DG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6DG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PoO-6jG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SxaSKGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._SxaSKGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1A1QOWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._1A1QOWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PoO-7DG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-7DG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_XI_EgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XKJiIId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XKti0Id1EemTGPCEQmMGWg"
+                called="#_PoO-7DG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_XLAdwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XLSxoId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PoYv4DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/build.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="BuildProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PoYv4jG0Ed-kc8dEZsdm2w" conditionMethod="#_-iWuBHLYEd-09ds9dfYpFw"
+              initMethod="#_PoYv4zG0Ed-kc8dEZsdm2w" footerMethod="#_PoYv5TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XMBxcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PoYv4jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PoYv4zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-iWuBHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._-iWuBHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PoYv5TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PoYv5zG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SxHXPGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._SxHXPGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1AsGTWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._1AsGTWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PoYv6TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv6TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_XQJccId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XRWWUId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XR8MMId1EemTGPCEQmMGWg"
+                called="#_PoYv6TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_XSPHIId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XShbAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Po1b0DG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/manifest.mfjet&quot;&#xA;"
+              name="ManifestMF" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_ZTUvECg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_Po1b0jG0Ed-kc8dEZsdm2w" conditionMethod="#_-e7mmHLYEd-09ds9dfYpFw"
+              initMethod="#_Po1b0zG0Ed-kc8dEZsdm2w" footerMethod="#_Po1b1TG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XTRo8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Po1b0jG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0jG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Po1b0zG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-e7mmHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._-e7mmHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Po1b1TG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1TG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Po1b1zG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1zG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SxRIOGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._SxRIOGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1BIyOWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._1BIyOWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Po1b2TG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b2TG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_XWOPQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XXW3sId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_mwzm4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XX7fcId1EemTGPCEQmMGWg"
+                called="#_Po1b2TG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_XYNzUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XYgHMId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PplCsDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/plugin.propertiesjet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderProperties&#xA;"
+              name="PluginProperties" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_xxtwkCg7Ed-ROrlGa8LEeQ"
+              headerMethod="#_PplCsjG0Ed-kc8dEZsdm2w" conditionMethod="#_-uRqJHLYEd-09ds9dfYpFw"
+              initMethod="#_PplCszG0Ed-kc8dEZsdm2w" footerMethod="#_PplCtTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XZN44Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PplCsjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCsjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PplCszG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCszG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-uRqJHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._-uRqJHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PplCtTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PplCtzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SxkDKGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._SxkDKGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1BR8KWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._1BR8KWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PplCuTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCuTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_XcFmsId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XdNBAId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_pQ16sChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XdyP0Id1EemTGPCEQmMGWg"
+                called="#_PplCuTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_XeFKwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XeXeoId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pp39oDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.insert&#xA;"
+              name="TestCase" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_hYG6UCg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pp39ojG0Ed-kc8dEZsdm2w" conditionMethod="#_-w9xxHLYEd-09ds9dfYpFw"
+              initMethod="#_Pp39ozG0Ed-kc8dEZsdm2w" footerMethod="#_Pp39pTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_Xq--UId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pp39ojG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ojG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pp39ozG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ozG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-w9xxHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._-w9xxHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pp39pTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39pTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PqBuoDG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuoDG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Sx2-GGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Sx2-GGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1BuoGWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._1BuoGWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PqBuojG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuojG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Xt_2EId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XvJFkId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_Chxo4ChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XvuUYId1EemTGPCEQmMGWg"
+                called="#_PqBuojG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_XwBPUId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XwUKQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PqeakDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/PackageExample.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="PackageExample" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PqeakjG0Ed-kc8dEZsdm2w" conditionMethod="#_-0r0JHLYEd-09ds9dfYpFw"
+              initMethod="#_PqeakzG0Ed-kc8dEZsdm2w" footerMethod="#_PqealTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XfHskId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PqeakjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PqeakzG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-0r0JHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._-0r0JHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PqealTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PqealzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Sxt0KGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._Sxt0KGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1Bk3GWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._1Bk3GWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PqeamTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeamTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Xh8-IId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XjE_gId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_Xjt4sId1EemTGPCEQmMGWg"
+                called="#_PqeamTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Xj_lgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XkR5YId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_Pq6fcDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/ModelTestSuite.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="ModelTestSuite" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_F0In8Cg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_Pq6fcjG0Ed-kc8dEZsdm2w" conditionMethod="#_-7Y5FHLYEd-09ds9dfYpFw"
+              initMethod="#_Pq6fczG0Ed-kc8dEZsdm2w" footerMethod="#_Pq6fdTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XlA5MId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_Pq6fcjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fcjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pq6fczG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fczG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-7Y5FHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._-7Y5FHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_Pq6fdTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_Pq6fdzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SyAvGGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._SyAvGGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1BbtKWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._1BbtKWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_Pq6feTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6feTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_Xn2x0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XpDEoId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_cjQNwChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XpoTcId1EemTGPCEQmMGWg"
+                called="#_Pq6feTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_Xp7OYId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_XqNiQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_DrPLUChGEd-zj5CV40Ozyg"/>
+          </elements>
+          <elements xmi:id="_PrOBcDG0Ed-kc8dEZsdm2w" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/PackageTestSuite.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.base.HeaderJava&#xA;"
+              name="PackageTestSuite" superPattern="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_VlOiICg6Ed-ROrlGa8LEeQ"
+              headerMethod="#_PrOBcjG0Ed-kc8dEZsdm2w" conditionMethod="#_-5ATdHLYEd-09ds9dfYpFw"
+              initMethod="#_PrOBczG0Ed-kc8dEZsdm2w" footerMethod="#_PrOBdTG0Ed-kc8dEZsdm2w">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_XxAt0Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_PrOBcjG0Ed-kc8dEZsdm2w" name="header" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBcjG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PrOBczG0Ed-kc8dEZsdm2w" name="init" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBczG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_-5ATdHLYEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._-5ATdHLYEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_PrOBdTG0Ed-kc8dEZsdm2w" name="footer" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdTG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_PrOBdzG0Ed-kc8dEZsdm2w" name="setReporterVariables"
+                patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdzG0Ed-kc8dEZsdm2w.pt"/>
+            <methods xmi:id="_SyKgGGKPEd-2a5uccsiuZA" name="setArgument" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._SyKgGGKPEd-2a5uccsiuZA.pt"/>
+            <methods xmi:id="_1B4ZGWKMEd-_wNQtGaQ-lw" name="ensureProjectExists" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._1B4ZGWKMEd-_wNQtGaQ-lw.pt"/>
+            <methods xmi:id="_PrOBeTG0Ed-kc8dEZsdm2w" name="doGenerate" patternFilePath="templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBeTG0Ed-kc8dEZsdm2w.pt"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_X0A-gId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_X1LcIId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_QRYMcChGEd-zj5CV40Ozyg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_X1xSAId1EemTGPCEQmMGWg"
+                called="#_PrOBeTG0Ed-kc8dEZsdm2w"/>
+            <orchestration xmi:type="pattern:BackCall" xmi:id="_X2GpMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_X2ayQId1EemTGPCEQmMGWg"
+                called="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_MeyroChGEd-zj5CV40Ozyg"/>
+          </elements>
+        </libraries>
+        <libraries xmi:id="_09kCIGJ-Ed-FqczH3ESmRw" name="org.eclipse.egf.emf.pattern.tests.call.TestCase">
+          <elements xmi:id="_09kCIWJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenFeature.insert&#xA;"
+              name="TestCase.implementedGenFeature.override" headerMethod="#_09kCI2J-Ed-FqczH3ESmRw"
+              conditionMethod="#_CIbc1XLZEd-09ds9dfYpFw" initMethod="#_09kCJGJ-Ed-FqczH3ESmRw"
+              footerMethod="#_09kCJmJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_rXYQcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_09kCI2J-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_09kCJGJ-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJGJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CIbc1XLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._CIbc1XLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_09kCJmJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_09kCLGJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCLGJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_rat4UId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_rbCocId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_rbVjYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_rboeUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_rb8nYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_raZvQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_rcjEUId1EemTGPCEQmMGWg"
+                called="#_09kCLGJ-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_093kIGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.TODO.override&#xA;"
+              name="TestCase.getGenFeature.override" headerMethod="#_093kImJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CKEblHLZEd-09ds9dfYpFw" initMethod="#_093kI2J-Ed-FqczH3ESmRw"
+              footerMethod="#_093kJWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_rdRdEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_093kImJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kImJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_093kI2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kI2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CKEblHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._CKEblHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_093kJWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kJWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_093kK2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kK2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_rgphMId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_rg9DMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_rhPXEId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_rhhq8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_rhz-0Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_rgWmQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ribC0Id1EemTGPCEQmMGWg"
+                called="#_093kK2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0-KfEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.getGenFeature.annotations.insert" headerMethod="#_0-KfEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CLQuZHLZEd-09ds9dfYpFw" initMethod="#_0-KfE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0-KfFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_rjNtAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0-KfEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-KfE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CLQuZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._CLQuZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0-KfFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-KfG2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfG2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_rmviIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_rnDrMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_rnV_EId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_rnnr4Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_rn5_wId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_rmayAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_roiR4Id1EemTGPCEQmMGWg"
+                called="#_0-KfG2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0-UQEGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.getGenFeature.TODO.override" headerMethod="#_0-UQEmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CMmyNHLZEd-09ds9dfYpFw" initMethod="#_0-UQE2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0-UQFWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_rpUVAId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0-UQEmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQEmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-UQE2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQE2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CMmyNHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._CMmyNHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0-UQFWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQFWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-UQG2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQG2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_rs2KIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_rtKTMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_rtecQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_rtzMYId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ruH8gId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_rsiBEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ruwOoId1EemTGPCEQmMGWg"
+                called="#_0-UQG2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0-daAGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.TODO.override&#xA;"
+              name="TestCase.setGenFeature.override" headerMethod="#_0-daAmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CPu-tHLZEd-09ds9dfYpFw" initMethod="#_0-daA2J-Ed-FqczH3ESmRw"
+              footerMethod="#_0-daBWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_rvgckId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0-daAmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daAmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-daA2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daA2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CPu-tHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._CPu-tHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0-daBWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daBWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-daC2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daC2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_rzC4wId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_rzXo4Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_rzrx8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_rz_T8Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_r0S18Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_ryuIoId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_r07vIId1EemTGPCEQmMGWg"
+                called="#_0-daC2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0-wU8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.setGenFeature.annotations.insert" headerMethod="#_0-wU8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CRq4ZHLZEd-09ds9dfYpFw" initMethod="#_0-wU82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0-wU9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_r1qu8Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0-wU8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-wU82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CRq4ZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._CRq4ZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0-wU9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-wU-2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU-2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_r5FPUId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_r5amgId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_r5uIgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_r6EGwId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_r6XowId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_r4xGQId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_r7BJAId1EemTGPCEQmMGWg"
+                called="#_0-wU-2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0-6F8GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.setGenFeature.TODO.override" headerMethod="#_0-6F8mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CStaNHLZEd-09ds9dfYpFw" initMethod="#_0-6F82J-Ed-FqczH3ESmRw"
+              footerMethod="#_0-6F9WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_r7u6sId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0-6F8mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F8mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-6F82J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F82J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CStaNHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._CStaNHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0-6F9WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F9WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0-6F-2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F-2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_r_LQQId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_r_fZUId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_r_0JcId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sAJgoId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sAdCoId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_r-3HMId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_sBEGoId1EemTGPCEQmMGWg"
+                called="#_0-6F-2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_0_NA4GJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.TODO.override&#xA;"
+              name="TestCase.unsetGenFeature.override" headerMethod="#_0_NA4mJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CUDeBHLZEd-09ds9dfYpFw" initMethod="#_0_NA42J-Ed-FqczH3ESmRw"
+              footerMethod="#_0_NA5WJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sB0UkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_0_NA4mJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA4mJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0_NA42J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA42J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CUDeBHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._CUDeBHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_0_NA5WJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA5WJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_0_NA62J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA62J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_sFO08Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_sFhv4Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_sF0q0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sGG-sId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sGcV4Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_sE8hEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_sHEoAId1EemTGPCEQmMGWg"
+                called="#_0_NA62J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1BcckGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.unsetGenFeature.annotations.insert" headerMethod="#_1BcckmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CVZh1HLZEd-09ds9dfYpFw" initMethod="#_1Bcck2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1BcclWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sI-FcId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1BcckmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcckmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Bcck2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bcck2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CVZh1HLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._CVZh1HLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1BcclWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcclWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Bccm2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bccm2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_sMVigId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_sMpEgId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_sM8mgId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sNQvkId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sNkRkId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_sMCAgId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_sOLVkId1EemTGPCEQmMGWg"
+                called="#_1Bccm2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1BlmgGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.unsetGenFeature.TODO.override" headerMethod="#_1BlmgmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CWSSpHLZEd-09ds9dfYpFw" initMethod="#_1Blmg2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1BlmhWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sO68cId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1BlmgmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmgmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Blmg2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmg2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CWSSpHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._CWSSpHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1BlmhWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmhWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Blmi2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmi2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_sSYgIId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_sSspMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_sTAyQId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sTU7UId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sTpEYId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_sSEXEId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_sUPhUId1EemTGPCEQmMGWg"
+                called="#_1Blmi2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1BvXgGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.TODO.override&#xA;"
+              name="TestCase.isSetGenFeature.override" headerMethod="#_1BvXgmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CY-aRHLZEd-09ds9dfYpFw" initMethod="#_1BvXg2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1BvXhWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sU_IMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1BvXgmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXgmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1BvXg2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXg2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CY-aRHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._CY-aRHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1BvXhWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXhWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1BvXi2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXi2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_sYbdwId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_sYuYsId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_sZEW8Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sZX48Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sZra8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_sYH7wId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_saTGAId1EemTGPCEQmMGWg"
+                called="#_1BvXi2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1CMDcGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.isSetGenFeature.annotations.insert" headerMethod="#_1CMDcmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CanZBHLZEd-09ds9dfYpFw" initMethod="#_1CMDc2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1CMDdWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sbBewId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1CMDcmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDcmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1CMDc2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDc2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CanZBHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._CanZBHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1CMDdWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDdWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1CMDe2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDe2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_seaxAId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_setr8Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_sfAm4Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sfTh0Id1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sfmcwId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_seHPAId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_sgNgwId1EemTGPCEQmMGWg"
+                called="#_1CMDe2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1Ce-YGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.isSetGenFeature.TODO.override" headerMethod="#_1Ce-YmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CcGmxHLZEd-09ds9dfYpFw" initMethod="#_1Ce-Y2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1Ce-ZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sg_j4Id1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1Ce-YmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-YmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Ce-Y2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-Y2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CcGmxHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._CcGmxHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1Ce-ZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-ZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Ce-a2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-a2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_skgx8Id1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_sk2wMId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_slLgUId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_slfCUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_sl4q8Id1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_skMB0Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_smiyQId1EemTGPCEQmMGWg"
+                called="#_1Ce-a2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1CovYGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.implementedGenFeature.insert" headerMethod="#_1CovYmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CdcDhHLZEd-09ds9dfYpFw" initMethod="#_1CovY2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1CovZWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_snWqkId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1CovYmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovYmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1CovY2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovY2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CdcDhHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._CdcDhHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1CovZWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovZWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Cova2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1Cova2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_sq8KEId1EemTGPCEQmMGWg" name="genFeature" type="org.eclipse.emf.codegen.ecore.genmodel.GenFeature"/>
+            <parameters xmi:id="_srQTIId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_srkcMId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sr5MUId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_ssMHQId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_sqnZ8Id1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_ss0ZYId1EemTGPCEQmMGWg"
+                called="#_1Cova2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1Cx5UGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;This pattern calls:&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.genOperation.annotations.insert&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.TODO.override&#xA;    * org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.insert&#xA;"
+              name="TestCase.implementedGenOperation.override" headerMethod="#_1Cx5UmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CeVbZHLZEd-09ds9dfYpFw" initMethod="#_1Cx5U2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1Cx5VWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_stiLEId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1Cx5UmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5UmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Cx5U2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5U2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CeVbZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._CeVbZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1Cx5VWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5VWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1Cx5W2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5W2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_sw8EYId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_sxPmYId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_sxjvcId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_sx4fkId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_syMooId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_swn7UId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_sy0TsId1EemTGPCEQmMGWg"
+                called="#_1Cx5W2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1C7qUGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.genOperation.annotations.insert" headerMethod="#_1C7qUmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CgILJHLZEd-09ds9dfYpFw" initMethod="#_1C7qU2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1C7qVWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_sziFYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1C7qUmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qUmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1C7qU2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qU2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CgILJHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._CgILJHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1C7qVWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qVWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1C7qW2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qW2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_s29M0Id1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_s3Qu0Id1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_s3kQ0Id1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_s32ksId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_s4JfoId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_s2pDwId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_s4xxwId1EemTGPCEQmMGWg"
+                called="#_1C7qW2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1DFbUGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.implementedGenOperation.TODO.override" headerMethod="#_1DFbUmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_CjtDlHLZEd-09ds9dfYpFw" initMethod="#_1DFbU2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1DFbVWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_s5rJoId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1DFbUmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbUmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1DFbU2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbU2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_CjtDlHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._CjtDlHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1DFbVWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbVWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1DFbW2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbW2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_s9FqAId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_s9ddcId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_s9wYYId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_s-EhcId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_s-YqgId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_s8socId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_s_AVkId1EemTGPCEQmMGWg"
+                called="#_1DFbW2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1DOlQGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.implementedGenOperation.insert" headerMethod="#_1DOlQmJ-Ed-FqczH3ESmRw"
+              conditionMethod="#_Ckl0ZHLZEd-09ds9dfYpFw" initMethod="#_1DOlQ2J-Ed-FqczH3ESmRw"
+              footerMethod="#_1DOlRWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_s_tgMId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1DOlQmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1DOlQ2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQ2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_Ckl0ZHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._Ckl0ZHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1DOlRWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlRWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1DOlS2J-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlS2J-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_tDIAkId1EemTGPCEQmMGWg" name="genOperation" type="org.eclipse.emf.codegen.ecore.genmodel.GenOperation"/>
+            <parameters xmi:id="_tDbikId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_tDt2cId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_tEB_gId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_tEWvoId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_tCz3gId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_tE9zoId1EemTGPCEQmMGWg"
+                called="#_1DOlS2J-Ed-FqczH3ESmRw"/>
+          </elements>
+          <elements xmi:id="_1DYWQGJ-Ed-FqczH3ESmRw" description="This pattern was generated from : &#xA;    * Bundle org.eclipse.emf.codegen.ecore 2.18.0.qualifier from EMF 2.18.&#xA;    * Template &quot;templates/model.tests/TestCase.javajet&quot;&#xA;"
+              name="TestCase.insert" headerMethod="#_1DYWQmJ-Ed-FqczH3ESmRw" conditionMethod="#_ClCgVHLZEd-09ds9dfYpFw"
+              initMethod="#_1DYWQ2J-Ed-FqczH3ESmRw" footerMethod="#_1DYWRWJ-Ed-FqczH3ESmRw">
+            <nature xmi:type="jetpattern:JetNature" xmi:id="_tFsMYId1EemTGPCEQmMGWg"
+                name="JET"/>
+            <methods xmi:id="_1DYWQmJ-Ed-FqczH3ESmRw" name="header" patternFilePath="templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQmJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1DYWQ2J-Ed-FqczH3ESmRw" name="init" patternFilePath="templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQ2J-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_ClCgVHLZEd-09ds9dfYpFw" name="preCondition" patternFilePath="templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._ClCgVHLZEd-09ds9dfYpFw.pt"/>
+            <methods xmi:id="_1DYWRWJ-Ed-FqczH3ESmRw" name="footer" patternFilePath="templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWRWJ-Ed-FqczH3ESmRw.pt"/>
+            <methods xmi:id="_1DYWSmJ-Ed-FqczH3ESmRw" name="doGenerate" patternFilePath="templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWSmJ-Ed-FqczH3ESmRw.pt"/>
+            <parameters xmi:id="_tJFeoId1EemTGPCEQmMGWg" name="genClass" type="org.eclipse.emf.codegen.ecore.genmodel.GenClass"/>
+            <parameters xmi:id="_tJZAoId1EemTGPCEQmMGWg" name="genPackage" type="org.eclipse.emf.codegen.ecore.genmodel.GenPackage"/>
+            <parameters xmi:id="_tJsioId1EemTGPCEQmMGWg" name="genModel" type="org.eclipse.emf.codegen.ecore.genmodel.GenModel"/>
+            <parameters xmi:id="_tKArsId1EemTGPCEQmMGWg" name="isJDK50" type="java.lang.Boolean"/>
+            <orchestration xmi:type="pattern:SuperCall" xmi:id="_tIx8oId1EemTGPCEQmMGWg"/>
+            <orchestration xmi:type="pattern:MethodCall" xmi:id="_tKraEId1EemTGPCEQmMGWg"
+                called="#_1DYWSmJ-Ed-FqczH3ESmRw"/>
+          </elements>
+        </libraries>
+      </viewpoints>
+    </viewpointContainer>
+    <orchestration xmi:type="fprod:ProductionPlan" xmi:id="_Prg8gTG0Ed-kc8dEZsdm2w">
+      <invocations xmi:id="_tpNwMId1EemTGPCEQmMGWg" name="EMF Tests Pattern" invokedActivity="ftask:Task platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_jT-SgD1hEd-m5uHrCQ1Jew">
+        <invocationContractContainer xmi:id="_tp00MId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_tqaDAId1EemTGPCEQmMGWg" factoryComponentContract="#_Prg8hjG0Ed-kc8dEZsdm2w"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_DgB2IP6fEd64XaYPo3s6sPg"/>
+          <invocationContracts xmi:id="_tr2NcId1EemTGPCEQmMGWg" factoryComponentContract="#_tvg04FIIEd-eGOdO3WtsxA"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_L6JSwAHAEd-4faJMEplCjxw">
+            <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tsJvcId1EemTGPCEQmMGWg"
+                value="org.eclipse.egf.emf.pattern.base.ContentTypePatternExecutionReporter"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_ttDuYId1EemTGPCEQmMGWg" factoryComponentContract="#_Tx5xR1kTEd-bv5aydwO2Qw"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_nz1HkSCaEd-Sse0r9LJWbA">
+            <type xmi:type="pattern:TypePatternList" xmi:id="_ttWpUId1EemTGPCEQmMGWg"
+                elements="#_PoO-4jG0Ed-kc8dEZsdm2w"/>
+          </invocationContracts>
+          <invocationContracts xmi:id="_tuQoQId1EemTGPCEQmMGWg" factoryComponentContract="#_eYFgEFHVEd-dr9AWwNwIMQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.pattern.ftask/egf/Model_driven_pattern_strategy_task.fcore#_NFhJ4UMgEd-Ixul1H5ANhg"/>
+          <invocationContracts xmi:id="_tvhMgId1EemTGPCEQmMGWg" factoryComponentContract="#_NcjD0vMqEd-6tr0C8ZV8Ew"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_JWI2sPI7Ed-Pp8S8RvVOuQ"/>
+          <invocationContracts xmi:id="_tws4QId1EemTGPCEQmMGWg" factoryComponentContract="#_LnCeMFLNEd-ZSLMRjxSbVQ"
+              invokedContract="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_vtlEAFLMEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+    </orchestration>
+  </fcore:FactoryComponent>
+  <fcore:FactoryComponent xmi:id="_Prz3UDG0Ed-kc8dEZsdm2w" name="EMF Pattern">
+    <contractContainer xmi:id="_Prz3UTG0Ed-kc8dEZsdm2w">
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_Prz3UjG0Ed-kc8dEZsdm2w"
+          description="EMF Pattern" name="genModel" mandatory="true" invocationContracts="#_tyOiRId1EemTGPCEQmMGWg #_t0QikYd1EemTGPCEQmMGWg #_t2KAAYd1EemTGPCEQmMGWg #_t4F5sYd1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeDomain" xmi:id="_tyOiQ4d1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_yqrHUFIIEd-eGOdO3WtsxA"
+          description="EMF Pattern" name="pattern.execution.reporter" invocationContracts="#_tykggod1EemTGPCEQmMGWg #_t0kEkId1EemTGPCEQmMGWg #_t2ewIId1EemTGPCEQmMGWg #_t4bQ4Id1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternExecutionReporter" xmi:id="_tykggYd1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_JBH151eTEd-ExtSXfVloug"
+          description="EMF Pattern" name="pattern.substitutions" invocationContracts="#_ty6ewod1EemTGPCEQmMGWg #_t03mkId1EemTGPCEQmMGWg #_t2y5MId1EemTGPCEQmMGWg #_t4vZ8Id1EemTGPCEQmMGWg">
+        <type xmi:type="pattern:TypePatternSubstitution" xmi:id="_ty6ewYd1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_k-TskPI7Ed-Pp8S8RvVOuQ"
+          description="EMF Pattern" name="usedGenPackages" invocationContracts="#_tzP18od1EemTGPCEQmMGWg #_t1LvoId1EemTGPCEQmMGWg #_t3IQYId1EemTGPCEQmMGWg #_t5ExIId1EemTGPCEQmMGWg">
+        <type xmi:type="domain:TypeGenPackages" xmi:id="_tzP18Yd1EemTGPCEQmMGWg"/>
+      </contracts>
+      <contracts xmi:type="fcore:FactoryComponentContract" xmi:id="_TK4DEFLNEd-ZSLMRjxSbVQ"
+          description="EMF Pattern" name="mergeRulesURI" invocationContracts="#_tzmbQYd1EemTGPCEQmMGWg #_t1eqkId1EemTGPCEQmMGWg #_t3byYId1EemTGPCEQmMGWg #_t5avYId1EemTGPCEQmMGWg">
+        <type xmi:type="types:TypeURI" xmi:id="_tzmbQId1EemTGPCEQmMGWg"/>
+      </contracts>
+    </contractContainer>
+    <orchestration xmi:type="fprod:ProductionPlan" xmi:id="_Prz3VDG0Ed-kc8dEZsdm2w">
+      <invocations xmi:id="_tx5LEod1EemTGPCEQmMGWg" invokedActivity="#_Pcm9sDG0Ed-kc8dEZsdm2w">
+        <invocationContractContainer xmi:id="_tyOiQId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_tyOiRId1EemTGPCEQmMGWg" factoryComponentContract="#_Prz3UjG0Ed-kc8dEZsdm2w"
+              invokedContract="#_Prg8ZTG0Ed-kc8dEZsdm2w"/>
+          <invocationContracts xmi:id="_tykggod1EemTGPCEQmMGWg" factoryComponentContract="#_yqrHUFIIEd-eGOdO3WtsxA"
+              invokedContract="#_WRxYEFIIEd-eGOdO3WtsxA"/>
+          <invocationContracts xmi:id="_ty6ewod1EemTGPCEQmMGWg" factoryComponentContract="#_JBH151eTEd-ExtSXfVloug"
+              invokedContract="#_OVsagFHVEd-dr9AWwNwIMQ"/>
+          <invocationContracts xmi:id="_tzP18od1EemTGPCEQmMGWg" factoryComponentContract="#_k-TskPI7Ed-Pp8S8RvVOuQ"
+              invokedContract="#_RcQCMPI7Ed-Pp8S8RvVOuQ"/>
+          <invocationContracts xmi:id="_tzmbQYd1EemTGPCEQmMGWg" factoryComponentContract="#_TK4DEFLNEd-ZSLMRjxSbVQ"
+              invokedContract="#_sluXsVLLEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+      <invocations xmi:id="_tz7ycId1EemTGPCEQmMGWg" invokedActivity="#_PiIW4DG0Ed-kc8dEZsdm2w">
+        <invocationContractContainer xmi:id="_t0QikId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_t0QikYd1EemTGPCEQmMGWg" factoryComponentContract="#_Prz3UjG0Ed-kc8dEZsdm2w"
+              invokedContract="#_Prg8cDG0Ed-kc8dEZsdm2w"/>
+          <invocationContracts xmi:id="_t0kEkId1EemTGPCEQmMGWg" factoryComponentContract="#_yqrHUFIIEd-eGOdO3WtsxA"
+              invokedContract="#_jzYi8FIIEd-eGOdO3WtsxA"/>
+          <invocationContracts xmi:id="_t03mkId1EemTGPCEQmMGWg" factoryComponentContract="#_JBH151eTEd-ExtSXfVloug"
+              invokedContract="#_UCnhEFHVEd-dr9AWwNwIMQ"/>
+          <invocationContracts xmi:id="_t1LvoId1EemTGPCEQmMGWg" factoryComponentContract="#_k-TskPI7Ed-Pp8S8RvVOuQ"
+              invokedContract="#_dgkvsPI7Ed-Pp8S8RvVOuQ"/>
+          <invocationContracts xmi:id="_t1eqkId1EemTGPCEQmMGWg" factoryComponentContract="#_TK4DEFLNEd-ZSLMRjxSbVQ"
+              invokedContract="#_9wHxsFLMEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+      <invocations xmi:id="_t1128Id1EemTGPCEQmMGWg" invokedActivity="#_PkqGcDG0Ed-kc8dEZsdm2w">
+        <invocationContractContainer xmi:id="_t2KAAId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_t2KAAYd1EemTGPCEQmMGWg" factoryComponentContract="#_Prz3UjG0Ed-kc8dEZsdm2w"
+              invokedContract="#_Prg8ezG0Ed-kc8dEZsdm2w"/>
+          <invocationContracts xmi:id="_t2ewIId1EemTGPCEQmMGWg" factoryComponentContract="#_yqrHUFIIEd-eGOdO3WtsxA"
+              invokedContract="#_pCqEMFIIEd-eGOdO3WtsxA"/>
+          <invocationContracts xmi:id="_t2y5MId1EemTGPCEQmMGWg" factoryComponentContract="#_JBH151eTEd-ExtSXfVloug"
+              invokedContract="#_Y3EukFHVEd-dr9AWwNwIMQ"/>
+          <invocationContracts xmi:id="_t3IQYId1EemTGPCEQmMGWg" factoryComponentContract="#_k-TskPI7Ed-Pp8S8RvVOuQ"
+              invokedContract="#_NcZ6I_MqEd-6tr0C8ZV8Ew"/>
+          <invocationContracts xmi:id="_t3byYId1EemTGPCEQmMGWg" factoryComponentContract="#_TK4DEFLNEd-ZSLMRjxSbVQ"
+              invokedContract="#_FqdyEFLNEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+      <invocations xmi:id="_t3xJkId1EemTGPCEQmMGWg" invokedActivity="#_PoF08DG0Ed-kc8dEZsdm2w">
+        <invocationContractContainer xmi:id="_t4F5sId1EemTGPCEQmMGWg">
+          <invocationContracts xmi:id="_t4F5sYd1EemTGPCEQmMGWg" factoryComponentContract="#_Prz3UjG0Ed-kc8dEZsdm2w"
+              invokedContract="#_Prg8hjG0Ed-kc8dEZsdm2w"/>
+          <invocationContracts xmi:id="_t4bQ4Id1EemTGPCEQmMGWg" factoryComponentContract="#_yqrHUFIIEd-eGOdO3WtsxA"
+              invokedContract="#_tvg04FIIEd-eGOdO3WtsxA"/>
+          <invocationContracts xmi:id="_t4vZ8Id1EemTGPCEQmMGWg" factoryComponentContract="#_JBH151eTEd-ExtSXfVloug"
+              invokedContract="#_eYFgEFHVEd-dr9AWwNwIMQ"/>
+          <invocationContracts xmi:id="_t5ExIId1EemTGPCEQmMGWg" factoryComponentContract="#_k-TskPI7Ed-Pp8S8RvVOuQ"
+              invokedContract="#_NcjD0vMqEd-6tr0C8ZV8Ew"/>
+          <invocationContracts xmi:id="_t5avYId1EemTGPCEQmMGWg" factoryComponentContract="#_TK4DEFLNEd-ZSLMRjxSbVQ"
+              invokedContract="#_LnCeMFLNEd-ZSLMRjxSbVQ"/>
+        </invocationContractContainer>
+      </invocations>
+    </orchestration>
+  </fcore:FactoryComponent>
+</xmi:XMI>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/BuildProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/BuildProperties.java
new file mode 100644
index 0000000..ced6b1e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/BuildProperties.java
@@ -0,0 +1,236 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class BuildProperties extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "bin.includes = ";
+	protected final String TEXT_3 = ",\\";
+	protected final String TEXT_4 = NL + "               icons/,\\";
+	protected final String TEXT_5 = NL + "               META-INF/,\\";
+	protected final String TEXT_6 = NL + "               plugin.xml,\\";
+	protected final String TEXT_7 = NL + "               ";
+	protected final String TEXT_8 = ".properties";
+	protected final String TEXT_9 = NL + "jars.compile.order = ";
+	protected final String TEXT_10 = NL + "source.";
+	protected final String TEXT_11 = " = ";
+	protected final String TEXT_12 = NL + "output.";
+	protected final String TEXT_13 = " = bin/" + NL;
+	protected final String TEXT_14 = NL;
+
+	public BuildProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_14);
+		stringBuffer.append(TEXT_14);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditProjectDirectory() + "/build.properties";
+		overwrite = genModel.isUpdateClasspath()
+				&& !new CodegenGeneratorAdapter(parameter).exists(new CodegenGeneratorAdapter(parameter)
+						.toURI(genModel.getEditProjectDirectory()).appendSegment("plugin.xml"));
+		encoding = "ISO-8859-1";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getEditPluginID() + ".jar" : ".";
+		List<String> sourceFolders = genModel.getEditSourceFolders();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_3);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_4);
+		}
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_5);
+		}
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_6);
+		}
+		String editBundleLocalization = genModel.getEditBundleLocalization();
+		int index = editBundleLocalization.indexOf("/");
+		if (index == -1) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(editBundleLocalization);
+			stringBuffer.append(TEXT_8);
+		} else {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(editBundleLocalization.substring(0, index + 1));
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(pluginClassesLocation);
+		boolean first = true;
+		for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) {
+			String sourceFolder = i.next();
+			if (i.hasNext()) {
+				sourceFolder += ",\\";
+			}
+			if (first) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(pluginClassesLocation);
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(sourceFolder);
+				first = false;
+			} else {
+				stringBuffer.append(sourceFolder);
+			}
+		}
+		stringBuffer.append(TEXT_12);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_13);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/CreateChildIconsForGenClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/CreateChildIconsForGenClass.java
new file mode 100644
index 0000000..9276b52
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/CreateChildIconsForGenClass.java
@@ -0,0 +1,139 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class CreateChildIconsForGenClass extends org.eclipse.egf.emf.pattern.base.GenClassGIF {
+	protected static String nl;
+
+	public static synchronized CreateChildIconsForGenClass create(String lineSeparator) {
+		nl = lineSeparator;
+		CreateChildIconsForGenClass result = new CreateChildIconsForGenClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public CreateChildIconsForGenClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenClass genClass = parameter;
+		GenModel genModel = genClass.getGenModel();
+		if (genModel.isCreationCommands() && genModel.isCreationIcons()) {
+			for (GenFeature feature : genClass.getCreateChildFeaturesIncludingDelegation()) {
+				for (GenClass childClass : genClass.getChildrenClasses(feature)) {
+					new CodegenGeneratorAdapter(parameter).generateGIF("edit/CreateChild.gif",
+							genClass.getCreateChildIconFileName(feature, childClass), genClass.getName(),
+							childClass.getName(), false);
+				}
+			}
+		}
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenClass genClass = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/CreateChildIconsForGenPackage.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/CreateChildIconsForGenPackage.java
new file mode 100644
index 0000000..3b75a30
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/CreateChildIconsForGenPackage.java
@@ -0,0 +1,150 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class CreateChildIconsForGenPackage extends org.eclipse.egf.emf.pattern.base.GenPackageGIF {
+	protected static String nl;
+
+	public static synchronized CreateChildIconsForGenPackage create(String lineSeparator) {
+		nl = lineSeparator;
+		CreateChildIconsForGenPackage result = new CreateChildIconsForGenPackage();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public CreateChildIconsForGenPackage() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		GenModel genModel = genPackage.getGenModel();
+		if (genModel.isCreationCommands() && genModel.isCreationIcons() && genPackage.isChildCreationExtenders()) {
+			for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage
+					.getExtendedChildCreationData().entrySet()) {
+				for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue()
+						.entrySet()) {
+					GenClass genClass = classEntry.getKey();
+					for (GenClass.ChildCreationData childCreationData : classEntry.getValue()) {
+						if (childCreationData.createClassifier instanceof GenClass
+								&& (childCreationData.delegatedFeature == null || classEntry.getKey()
+										.getAllGenFeatures().contains(childCreationData.delegatedFeature))) {
+							GenClass childClass = (GenClass) childCreationData.createClassifier;
+							GenFeature feature = childCreationData.createFeature;
+							new CodegenGeneratorAdapter(parameter).generateGIF("edit/CreateChild.gif",
+									genClass.getCreateChildIconFileName(genModel, feature, childClass),
+									genClass.getName(), childClass.getName(), false);
+						}
+					}
+				}
+			}
+		}
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Images.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Images.java
new file mode 100644
index 0000000..0de1d0d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Images.java
@@ -0,0 +1,219 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Images extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized Images create(String lineSeparator) {
+		nl = lineSeparator;
+		Images result = new Images();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->" + NL + " * @generated" + NL + " */" + NL + "public interface ";
+	protected final String TEXT_5 = "Images extends ";
+	protected final String TEXT_6 = NL + "{";
+	protected final String TEXT_7 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Source(\"";
+	protected final String TEXT_8 = "\")" + NL + "\t";
+	protected final String TEXT_9 = " ";
+	protected final String TEXT_10 = "();" + NL;
+	protected final String TEXT_11 = NL + "}";
+	protected final String TEXT_12 = NL;
+	protected final String TEXT_13 = NL;
+
+	public Images() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(TEXT_13);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getEditPluginDirectory();
+		packageName = genModel.getEditPluginPackageName();
+		className = genModel.getEditPluginClassName() + "Images";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getEditPluginClassName());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(genModel.getImportedName("com.google.gwt.resources.client.ClientBundle"));
+		stringBuffer.append(TEXT_6);
+		for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (genClass.isImage()) {
+					String image = genClass.getItemIconFileName();
+					image = image.substring(image.lastIndexOf("/icons/") + 1);
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(image);
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.resources.client.ImageResource"));
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genClass.getItemIconAccessorName());
+					stringBuffer.append(TEXT_10);
+				}
+			}
+		}
+		stringBuffer.append(TEXT_11);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_12);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT)
+				&& (!genModel.sameEditEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemIcon.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemIcon.java
new file mode 100644
index 0000000..6eedfcd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemIcon.java
@@ -0,0 +1,134 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemIcon extends org.eclipse.egf.emf.pattern.base.GenClassGIF {
+	protected static String nl;
+
+	public static synchronized ItemIcon create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemIcon result = new ItemIcon();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ItemIcon() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenClass genClass = parameter;
+		if (genClass.isImage()) {
+			new CodegenGeneratorAdapter(parameter).generateGIF("edit/Item.gif", genClass.getItemIconFileName(),
+					genClass.getName(), null, false);
+		} else {
+		}
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenClass genClass = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemProvider.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemProvider.java
new file mode 100644
index 0000000..80dd5dd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemProvider.java
@@ -0,0 +1,841 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvider extends org.eclipse.egf.emf.pattern.base.GenClassJava {
+	protected static String nl;
+
+	public static synchronized ItemProvider create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvider result = new ItemProvider();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * This is the item provider adapter for a {@link ";
+	protected final String TEXT_5 = "} object." + NL + " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = " ";
+	protected final String TEXT_11 = "extends ";
+	protected final String TEXT_12 = NL + "\textends ";
+	protected final String TEXT_13 = NL + "\timplements";
+	protected final String TEXT_14 = NL + "\t\t";
+	protected final String TEXT_15 = ",";
+	protected final String TEXT_16 = NL + "{";
+	protected final String TEXT_17 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_18 = " copyright = ";
+	protected final String TEXT_19 = ";";
+	protected final String TEXT_20 = NL;
+	protected final String TEXT_21 = NL + "\t/**" + NL
+			+ "\t * This constructs an instance from a factory and a notifier." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_22 = "(AdapterFactory adapterFactory)" + NL + "\t{" + NL + "\t\tsuper(adapterFactory);"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This returns the property descriptors for the adapted class." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_23 = NL + "\t@Override";
+	protected final String TEXT_24 = NL + "\tpublic ";
+	protected final String TEXT_25 = " getPropertyDescriptors(Object object)" + NL + "\t{" + NL
+			+ "\t\tif (itemPropertyDescriptors == null)" + NL + "\t\t{" + NL
+			+ "\t\t\tsuper.getPropertyDescriptors(object);" + NL;
+	protected final String TEXT_26 = NL + "\t\t\tadd";
+	protected final String TEXT_27 = "PropertyDescriptor(object);";
+	protected final String TEXT_28 = NL + "\t\t}" + NL + "\t\treturn itemPropertyDescriptors;" + NL + "\t}" + NL;
+	protected final String TEXT_29 = NL + "\t/**" + NL + "\t * This adds a property descriptor for the ";
+	protected final String TEXT_30 = " feature." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_31 = NL + "\t * ";
+	protected final String TEXT_32 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_33 = NL + "\t@Deprecated";
+	protected final String TEXT_34 = NL + "\tprotected void add";
+	protected final String TEXT_35 = "PropertyDescriptor(Object object)" + NL + "\t{";
+	protected final String TEXT_36 = NL + "\t}" + NL;
+	protected final String TEXT_37 = NL + "\t/**" + NL
+			+ "\t * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an"
+			+ NL
+			+ "\t * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or"
+			+ NL + "\t * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_38 = " getChildrenFeatures(Object object)" + NL + "\t{" + NL
+			+ "\t\tif (childrenFeatures == null)" + NL + "\t\t{" + NL + "\t\t\tsuper.getChildrenFeatures(object);";
+	protected final String TEXT_39 = NL + "\t\t\tchildrenFeatures.add(";
+	protected final String TEXT_40 = ");";
+	protected final String TEXT_41 = NL + "\t\t}" + NL + "\t\treturn childrenFeatures;" + NL + "\t}" + NL;
+	protected final String TEXT_42 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_43 = NL + "\tprotected ";
+	protected final String TEXT_44 = " getChildFeature(Object object, Object child)" + NL + "\t{" + NL
+			+ "\t\t// Check the type of the specified child object and return the proper feature to use for" + NL
+			+ "\t\t// adding (see {@link AddCommand}) it as a child." + NL + "" + NL
+			+ "\t\treturn super.getChildFeature(object, child);" + NL + "\t}" + NL;
+	protected final String TEXT_45 = NL + "\tpublic boolean hasChildren(Object object)" + NL + "\t{" + NL
+			+ "\t\treturn hasChildren(object, ";
+	protected final String TEXT_46 = ");" + NL + "\t}" + NL;
+	protected final String TEXT_47 = NL + "\t/**" + NL + "\t * This returns ";
+	protected final String TEXT_48 = ".gif." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_49 = NL + "\tpublic Object getImage(Object object)" + NL + "\t{" + NL
+			+ "\t\treturn overlayImage(object, getResourceLocator().getImage(\"full/obj16/";
+	protected final String TEXT_50 = "\"));";
+	protected final String TEXT_51 = NL + "\t/**" + NL
+			+ "\t * This returns <code>getImage(object)</code> for the column index <code>0</code> or <code>super.getImage(object)</code> otherwise."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @see #getText(Object)" + NL + "\t * @see #getColumnText(Object, int)" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_52 = NL + "\tpublic Object getColumnImage(Object object, int columnIndex)" + NL + "\t{"
+			+ NL + "\t\t// TODO: implement this method to return appropriate information for each column." + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\treturn columnIndex == 0 ? getImage(object) : super.getImage(object);" + NL + "\t}" + NL;
+	protected final String TEXT_53 = NL + "\tprotected boolean shouldComposeCreationImage()" + NL + "\t{" + NL
+			+ "\t\treturn true;" + NL + "\t}" + NL;
+	protected final String TEXT_54 = NL + "\t/**" + NL + "\t * This returns the label text for the adapted class." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_55 = NL + "\tpublic String getText(Object object)" + NL + "\t{";
+	protected final String TEXT_56 = NL + "\t/**" + NL
+			+ "\t * This returns <code>getText(object)</code> for the column index <code>0</code> or <code>super.getText(object)</code> otherwise."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @see #getImage(Object)" + NL + "\t * @see #getColumnImage(Object, int)" + NL + "\t * @generated"
+			+ NL + "\t */";
+	protected final String TEXT_57 = NL + "\tpublic String getColumnText(Object object, int columnIndex)" + NL + "\t{"
+			+ NL + "\t\t// TODO: implement this method to return appropriate information for each column." + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\treturn columnIndex == 0 ? getText(object) : super.getText(object);" + NL + "\t}" + NL;
+	protected final String TEXT_58 = NL + "\t/**" + NL
+			+ "\t * This returns the label styled text for the adapted class." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_59 = NL + "\tpublic Object getStyledText(Object object)" + NL + "\t{";
+	protected final String TEXT_60 = NL + "\t}";
+	protected final String TEXT_61 = NL + NL + "\t/**" + NL
+			+ "\t * This handles model notifications by calling {@link #updateChildren} to update any cached" + NL
+			+ "\t * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_62 = NL + "\tpublic void notifyChanged(Notification notification)" + NL + "\t{" + NL
+			+ "\t\tupdateChildren(notification);";
+	protected final String TEXT_63 = NL + NL + "\t\tswitch (notification.getFeatureID(";
+	protected final String TEXT_64 = ".class))" + NL + "\t\t{";
+	protected final String TEXT_65 = NL + "\t\t\tcase ";
+	protected final String TEXT_66 = ":";
+	protected final String TEXT_67 = NL + "\t\t\t\tfireNotifyChanged(new ";
+	protected final String TEXT_68 = "(notification, notification.getNotifier(), false, true));" + NL
+			+ "\t\t\t\treturn;";
+	protected final String TEXT_69 = "(notification, notification.getNotifier(), true, false));" + NL
+			+ "\t\t\t\treturn;";
+	protected final String TEXT_70 = "(notification, notification.getNotifier(), true, true));" + NL
+			+ "\t\t\t\treturn;";
+	protected final String TEXT_71 = NL + "\t\t\tdefault:";
+	protected final String TEXT_72 = NL + "\t\t}";
+	protected final String TEXT_73 = "\t\tsuper.notifyChanged(notification);";
+	protected final String TEXT_74 = "\t\treturn;" + NL + "\t\t\t}";
+	protected final String TEXT_75 = NL + "\t/**" + NL
+			+ "\t * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children" + NL
+			+ "\t * that can be created under this object." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_76 = NL + "\tprotected void collectNewChildDescriptors(";
+	protected final String TEXT_77 = " newChildDescriptors, Object object)" + NL + "\t{" + NL
+			+ "\t\tsuper.collectNewChildDescriptors(newChildDescriptors, object);";
+	protected final String TEXT_78 = NL + "\t/**" + NL
+			+ "\t * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_79 = NL
+			+ "\tpublic String getCreateChildText(Object owner, Object feature, Object child, ";
+	protected final String TEXT_80 = " selection)" + NL + "\t{" + NL + "\t\tObject childFeature = feature;" + NL
+			+ "\t\tObject childObject = child;" + NL;
+	protected final String TEXT_81 = NL + "\t\tif (childFeature instanceof ";
+	protected final String TEXT_82 = " && ";
+	protected final String TEXT_83 = ".isFeatureMap((EStructuralFeature)childFeature))" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_84 = ".Entry entry = (FeatureMap.Entry)childObject;" + NL
+			+ "\t\t\tchildFeature = entry.getEStructuralFeature();" + NL + "\t\t\tchildObject = entry.getValue();" + NL
+			+ "\t\t}" + NL;
+	protected final String TEXT_85 = NL + "\t\tboolean qualify =";
+	protected final String TEXT_86 = NL + "\t\t\tchildFeature == ";
+	protected final String TEXT_87 = NL + NL + "\t\tif (qualify)" + NL + "\t\t{" + NL + "\t\t\treturn getString" + NL
+			+ "\t\t\t\t(\"_UI_CreateChild_text2\",";
+	protected final String TEXT_88 = NL
+			+ "\t\t\t\t new Object[] { getTypeText(childObject), getFeatureText(childFeature), getTypeText(owner) });"
+			+ NL + "\t\t}" + NL + "\t\treturn super.getCreateChildText(owner, feature, child, selection);" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_89 = NL + "\t/**" + NL
+			+ "\t * Return the resource locator for this item provider's resources." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_90 = " getResourceLocator()" + NL + "\t{";
+	protected final String TEXT_91 = NL + "\t\treturn ((";
+	protected final String TEXT_92 = ")adapterFactory).getResourceLocator();";
+	protected final String TEXT_93 = NL + "\t\treturn ";
+	protected final String TEXT_94 = ".INSTANCE;";
+	protected final String TEXT_95 = NL + "}";
+	protected final String TEXT_96 = NL;
+
+	public ItemProvider() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_96);
+		stringBuffer.append(TEXT_96);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenClass genClass = parameter;
+		targetPath = genClass.getGenModel().getEditDirectory();
+		packageName = genClass.getGenPackage().getProviderPackageName();
+		className = genClass.getProviderClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenClass genClass = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2019 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+		 */
+
+		GenClass genClass = (GenClass) argument;
+		GenPackage genPackage = genClass.getGenPackage();
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();
+		String indentDefaultCase = forceDefaultCase ? "\t\t" : "";
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getProviderPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("org.eclipse.emf.common.notify.AdapterFactory");
+		genModel.addImport("org.eclipse.emf.common.notify.Notification");
+		String _List = genModel.getImportedName(
+				genModel.useGenerics() ? "java.util.List<org.eclipse.emf.edit.provider.IItemPropertyDescriptor>"
+						: "java.util.List");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_5);
+		if (genClass.hasImplicitAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genClass.getProviderClassName());
+		stringBuffer.append(TEXT_10);
+		if (genClass.getProviderImplementsClassNames().isEmpty()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName()
+					: genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter"));
+		}
+		if (!genClass.getProviderImplementsClassNames().isEmpty()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName()
+					: genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter"));
+			stringBuffer.append(TEXT_13);
+			for (Iterator<String> i = genClass.getProviderImplementsClassNames().iterator(); i.hasNext();) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genModel.getImportedName(i.next()));
+				if (i.hasNext()) {
+					stringBuffer.append(TEXT_15);
+				}
+			}
+		}
+		stringBuffer.append(TEXT_16);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_20);
+		}
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(genClass.getProviderClassName());
+		stringBuffer.append(TEXT_22);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(_List);
+		stringBuffer.append(TEXT_25);
+		for (GenFeature genFeature : genClass.getPropertyFeatures()) {
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_27);
+		}
+		stringBuffer.append(TEXT_28);
+		for (GenFeature genFeature : genClass.getPropertyFeatures()) {
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genFeature.getFormattedName());
+			stringBuffer.append(TEXT_30);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_32);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_33);
+			}
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(TEXT_20);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.addPropertyDescriptor.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("_List", _List);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_03mkEWJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//ItemProvider/addPropertyDescriptor.override.javajetinc
+			stringBuffer.append(TEXT_36);
+		}
+		if (!genClass.getChildrenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_37);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getImportedName(
+					genModel.useGenerics() ? "java.util.Collection<? extends org.eclipse.emf.ecore.EStructuralFeature>"
+							: "java.util.Collection"));
+			stringBuffer.append(TEXT_38);
+			for (GenFeature genFeature : genClass.getChildrenFeatures()) {
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_40);
+			}
+			stringBuffer.append(TEXT_41);
+			if (!genClass.getChildrenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_42);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_23);
+				}
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+				stringBuffer.append(TEXT_44);
+			}
+		}
+		if (genClass.needsHasChildrenMethodOverride()) {
+			stringBuffer.append(TEXT_42);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_45);
+			stringBuffer.append(genModel.isOptimizedHasChildren());
+			stringBuffer.append(TEXT_46);
+		}
+		if (genClass.isImage()) {
+			stringBuffer.append(TEXT_47);
+			stringBuffer.append(genClass.getName());
+			stringBuffer.append(TEXT_48);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genClass.getName());
+			stringBuffer.append(TEXT_50);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_36);
+		}
+		if (genClass.getProviderImplementsClassNames()
+				.contains("org.eclipse.emf.edit.provider.ITableItemLabelProvider")) {
+			stringBuffer.append(TEXT_51);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_52);
+		}
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF26_VALUE && !genModel.isCreationIcons()) {
+			stringBuffer.append(TEXT_42);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_53);
+		}
+		stringBuffer.append(TEXT_54);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_55);
+		stringBuffer.append(TEXT_20);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.getText.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("_List", _List);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_03wVEGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//ItemProvider/getText.override.javajetinc
+		stringBuffer.append(TEXT_36);
+		if (genClass.getProviderImplementsClassNames()
+				.contains("org.eclipse.emf.edit.provider.ITableItemLabelProvider")) {
+			stringBuffer.append(TEXT_56);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_57);
+		}
+		if (genModel.isStyleProviders()) {
+			stringBuffer.append(TEXT_58);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_59);
+			stringBuffer.append(TEXT_20);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.getStyledText.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("_List", _List);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_sd5EMKoMEeOCpsO1cKKCxA",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//ItemProvider/getStyledText.override.javajetinc
+			stringBuffer.append(TEXT_60);
+		}
+		stringBuffer.append(TEXT_61);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_62);
+		if (!genClass.getLabelNotifyFeatures().isEmpty() || !genClass.getContentNotifyFeatures().isEmpty()
+				|| !genClass.getLabelAndContentNotifyFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_63);
+			stringBuffer.append(genClass.getRawImportedInterfaceName());
+			stringBuffer.append(TEXT_64);
+			if (!genClass.getLabelNotifyFeatures().isEmpty()) {
+				for (GenFeature genFeature : genClass.getLabelNotifyFeatures()) {
+					stringBuffer.append(TEXT_65);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_66);
+				}
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+				stringBuffer.append(TEXT_68);
+			}
+			if (!genClass.getContentNotifyFeatures().isEmpty()) {
+				for (GenFeature genFeature : genClass.getContentNotifyFeatures()) {
+					stringBuffer.append(TEXT_65);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_66);
+				}
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+				stringBuffer.append(TEXT_69);
+			}
+			if (!genClass.getLabelAndContentNotifyFeatures().isEmpty()) {
+				for (GenFeature genFeature : genClass.getLabelAndContentNotifyFeatures()) {
+					stringBuffer.append(TEXT_65);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_66);
+				}
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+				stringBuffer.append(TEXT_70);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_71);
+			} else { // {
+				stringBuffer.append(TEXT_72);
+			}
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_73);
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_74);
+			} // }
+		}
+		stringBuffer.append(TEXT_36);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_75);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(genModel.getImportedName(
+					genModel.useGenerics() ? "java.util.Collection<java.lang.Object>" : "java.util.Collection"));
+			stringBuffer.append(TEXT_77);
+			for (GenClass.ChildCreationData childCreationData : genClass.getChildCreationData()) {
+				GenFeature createFeature = childCreationData.createFeature;
+				GenFeature delegatedFeature = childCreationData.delegatedFeature;
+				GenClassifier createClassifier = childCreationData.createClassifier;
+				if (createFeature.isFeatureMapType()) {
+					if (delegatedFeature.isReferenceType()) {
+						GenClass createClass = (GenClass) createClassifier;
+						stringBuffer.append(TEXT_20);
+						{
+							//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+							InternalPatternContext ictx = (InternalPatternContext) ctx;
+							new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+							stringBuffer.setLength(0);
+
+							final Map<String, Object> callParameters = new HashMap<String, Object>();
+							callParameters.put("createClass", createClass);
+							callParameters.put("createFeature", createFeature);
+							callParameters.put("delegatedFeature", delegatedFeature);
+							callParameters.put("createClassifier", createClassifier);
+							callParameters.put("childCreationData", childCreationData);
+							callParameters.put("genClass", genClass);
+							callParameters.put("genPackage", genPackage);
+							callParameters.put("genModel", genModel);
+							callParameters.put("isJDK50", isJDK50);
+							CallHelper.executeWithParameterInjection(
+									"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_036GEGJ-Ed-FqczH3ESmRw",
+									new ExecutionContext((InternalPatternContext) ctx), callParameters);
+							stringBuffer.setLength(0);
+						}
+
+						//ItemProvider/newChildDescriptorsReferenceDelegatedFeature.override.javajetinc
+					} else {
+						GenDataType createDataType = (GenDataType) createClassifier;
+						stringBuffer.append(TEXT_20);
+						{
+							//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+							InternalPatternContext ictx = (InternalPatternContext) ctx;
+							new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+							stringBuffer.setLength(0);
+
+							final Map<String, Object> callParameters = new HashMap<String, Object>();
+							callParameters.put("createDataType", createDataType);
+							callParameters.put("createFeature", createFeature);
+							callParameters.put("delegatedFeature", delegatedFeature);
+							callParameters.put("createClassifier", createClassifier);
+							callParameters.put("childCreationData", childCreationData);
+							callParameters.put("genClass", genClass);
+							callParameters.put("genPackage", genPackage);
+							callParameters.put("genModel", genModel);
+							callParameters.put("isJDK50", isJDK50);
+							CallHelper.executeWithParameterInjection(
+									"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04WyAGJ-Ed-FqczH3ESmRw",
+									new ExecutionContext((InternalPatternContext) ctx), callParameters);
+							stringBuffer.setLength(0);
+						}
+
+						//ItemProvider/newChildDescriptorsAttributeDelegatedFeature.override.javajetinc
+					}
+				} else if (createFeature.isReferenceType()) {
+					GenClass createClass = (GenClass) createClassifier;
+					stringBuffer.append(TEXT_20);
+					{
+						//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+						InternalPatternContext ictx = (InternalPatternContext) ctx;
+						new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+						stringBuffer.setLength(0);
+
+						final Map<String, Object> callParameters = new HashMap<String, Object>();
+						callParameters.put("createClass", createClass);
+						callParameters.put("createFeature", createFeature);
+						callParameters.put("delegatedFeature", delegatedFeature);
+						callParameters.put("createClassifier", createClassifier);
+						callParameters.put("childCreationData", childCreationData);
+						callParameters.put("genClass", genClass);
+						callParameters.put("genPackage", genPackage);
+						callParameters.put("genModel", genModel);
+						callParameters.put("isJDK50", isJDK50);
+						CallHelper.executeWithParameterInjection(
+								"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04ps8GJ-Ed-FqczH3ESmRw",
+								new ExecutionContext((InternalPatternContext) ctx), callParameters);
+						stringBuffer.setLength(0);
+					}
+
+					//ItemProvider/newChildDescriptorsReferenceFeature.override.javajetinc 
+				} else {
+					GenDataType createDataType = (GenDataType) createClassifier;
+					stringBuffer.append(TEXT_20);
+					{
+						//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+						InternalPatternContext ictx = (InternalPatternContext) ctx;
+						new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+						stringBuffer.setLength(0);
+
+						final Map<String, Object> callParameters = new HashMap<String, Object>();
+						callParameters.put("createDataType", createDataType);
+						callParameters.put("createFeature", createFeature);
+						callParameters.put("delegatedFeature", delegatedFeature);
+						callParameters.put("createClassifier", createClassifier);
+						callParameters.put("childCreationData", childCreationData);
+						callParameters.put("genClass", genClass);
+						callParameters.put("genPackage", genPackage);
+						callParameters.put("genModel", genModel);
+						callParameters.put("isJDK50", isJDK50);
+						CallHelper.executeWithParameterInjection(
+								"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_048n4GJ-Ed-FqczH3ESmRw",
+								new ExecutionContext((InternalPatternContext) ctx), callParameters);
+						stringBuffer.setLength(0);
+					}
+
+					//ItemProvider/newChildDescriptorsAttributeFeature.override.javajetinc
+				}
+			}
+			stringBuffer.append(TEXT_36);
+			if (!genClass.getSharedClassCreateChildFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_78);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_23);
+				}
+				stringBuffer.append(TEXT_79);
+				stringBuffer.append(genModel
+						.getImportedName(genModel.useGenerics() ? "java.util.Collection<?>" : "java.util.Collection"));
+				stringBuffer.append(TEXT_80);
+				if (genClass.hasFeatureMapCreateChildFeatures()) {
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+					stringBuffer.append(TEXT_82);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_84);
+				}
+				stringBuffer.append(TEXT_85);
+				for (Iterator<GenFeature> i = genClass.getSharedClassCreateChildFeatures().iterator(); i.hasNext();) {
+					GenFeature createFeature = i.next();
+					stringBuffer.append(TEXT_86);
+					stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(i.hasNext() ? " ||" : ";");
+				}
+				stringBuffer.append(TEXT_87);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_88);
+			}
+		}
+		if (genClass.getProviderExtendsGenClass() == null || genClass.getProviderExtendsGenClass()
+				.getGenPackage() != genPackage
+				&& (!genPackage.isExtensibleProviderFactory() || genClass.getProviderExtendsGenClass().getGenPackage()
+						.isExtensibleProviderFactory() != genPackage.isExtensibleProviderFactory())) {
+			stringBuffer.append(TEXT_89);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
+			stringBuffer.append(TEXT_90);
+			if (genPackage.isExtensibleProviderFactory()) {
+				stringBuffer.append(TEXT_91);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
+				stringBuffer.append(TEXT_92);
+			} else {
+				stringBuffer.append(TEXT_93);
+				stringBuffer.append(genPackage.getImportedEditPluginClassName());
+				stringBuffer.append(TEXT_94);
+			}
+			stringBuffer.append(TEXT_36);
+		}
+		stringBuffer.append(TEXT_20);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("_List", _List);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_051_wGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_95);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_20);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenClass genClass = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemProviderAdapterFactory.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemProviderAdapterFactory.java
new file mode 100644
index 0000000..c3215a7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ItemProviderAdapterFactory.java
@@ -0,0 +1,889 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProviderAdapterFactory extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized ItemProviderAdapterFactory create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProviderAdapterFactory result = new ItemProviderAdapterFactory();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL
+			+ " * This is the factory that is used to provide the interfaces needed to support Viewers." + NL
+			+ " * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}."
+			+ NL + " * The adapters also support Eclipse property sheets." + NL
+			+ " * Note that most of the adapters are shared among multiple instances." + NL
+			+ " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = " extends ";
+	protected final String TEXT_11 = " implements ComposeableAdapterFactory, IChangeNotifier";
+	protected final String TEXT_12 = ", ";
+	protected final String TEXT_13 = NL + "{";
+	protected final String TEXT_14 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_15 = " copyright = ";
+	protected final String TEXT_16 = ";";
+	protected final String TEXT_17 = NL;
+	protected final String TEXT_18 = NL + "\t/**" + NL
+			+ "\t * This keeps track of the root adapter factory that delegates to this adapter factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ComposedAdapterFactory parentAdapterFactory;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected IChangeNotifier changeNotifier = new ChangeNotifier();" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL
+			+ "\t * This keeps track of all the item providers created, so that they can be {@link #dispose disposed}."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_20 = " disposable = new Disposable();" + NL;
+	protected final String TEXT_21 = NL + "\t/**" + NL + "\t * This helps manage the child creation extenders." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_22 = " childCreationExtenderManager = new ";
+	protected final String TEXT_23 = "(";
+	protected final String TEXT_24 = ".INSTANCE, ";
+	protected final String TEXT_25 = ".eNS_URI);" + NL;
+	protected final String TEXT_26 = NL + "\t/**" + NL
+			+ "\t * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_27 = " supportedTypes = new ";
+	protected final String TEXT_28 = "();" + NL + "" + NL + "\t/**" + NL + "\t * This constructs an instance." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_29 = "()" + NL + "\t{";
+	protected final String TEXT_30 = NL + "\t\tsupportedTypes.add(";
+	protected final String TEXT_31 = ".class);";
+	protected final String TEXT_32 = NL + "\t}" + NL;
+	protected final String TEXT_33 = NL + "\t/**" + NL
+			+ "\t * This keeps track of the factory to which to delegate adapter creation for objects from that package."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_34 = " ";
+	protected final String TEXT_35 = " = null;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This determines the delegate factory for the package." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_36 = " get";
+	protected final String TEXT_37 = "()" + NL + "\t{" + NL + "\t\tif (";
+	protected final String TEXT_38 = " == null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_39 = " rootAdapterFactory = getRootAdapterFactory();" + NL
+			+ "\t\t\tif (rootAdapterFactory instanceof ComposedAdapterFactory)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_40 = " delegateAdapterFactory =" + NL
+			+ "\t\t\t\t\t((ComposedAdapterFactory)rootAdapterFactory).getFactoryForType(";
+	protected final String TEXT_41 = ".getPackage());" + NL + "\t\t\t\tif (delegateAdapterFactory instanceof ";
+	protected final String TEXT_42 = ")" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_43 = " = (";
+	protected final String TEXT_44 = ")delegateAdapterFactory;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL
+			+ "\t\treturn ";
+	protected final String TEXT_45 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_46 = NL + "\t/**" + NL
+			+ "\t * This keeps track of the one adapter used for all {@link ";
+	protected final String TEXT_47 = "} instances." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_48 = NL + "\t * ";
+	protected final String TEXT_49 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_50 = NL + "\t@Deprecated";
+	protected final String TEXT_51 = NL + "\tprotected ";
+	protected final String TEXT_52 = "ItemProvider;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This creates an adapter for a {@link ";
+	protected final String TEXT_53 = "}." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_54 = NL + "\t@Override";
+	protected final String TEXT_55 = NL + "\tpublic Adapter create";
+	protected final String TEXT_56 = "Adapter()" + NL + "\t{" + NL + "\t\tif (";
+	protected final String TEXT_57 = "ItemProvider == null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_58 = "ItemProvider = new ";
+	protected final String TEXT_59 = "(this);" + NL + "\t\t}" + NL + "" + NL + "\t\treturn ";
+	protected final String TEXT_60 = "ItemProvider;" + NL + "\t}" + NL;
+	protected final String TEXT_61 = NL + "\t/**" + NL + "\t * This creates an adapter for a {@link ";
+	protected final String TEXT_62 = "Adapter()" + NL + "\t{" + NL + "\t\treturn new ";
+	protected final String TEXT_63 = "(this);" + NL + "\t}" + NL;
+	protected final String TEXT_64 = NL + "\t/**" + NL + "\t * ";
+	protected final String TEXT_65 = " of ";
+	protected final String TEXT_66 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_67 = "Adapter()" + NL + "\t{" + NL + "\t\treturn" + NL + "\t\t\tget";
+	protected final String TEXT_68 = "() == null ?" + NL + "\t\t\t\tnull :" + NL + "\t\t\t\tget";
+	protected final String TEXT_69 = "().create";
+	protected final String TEXT_70 = "Adapter();" + NL + "\t}" + NL;
+	protected final String TEXT_71 = NL + "\t/**" + NL
+			+ "\t * This returns the root adapter factory that contains this factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_72 = NL + "\tpublic ComposeableAdapterFactory getRootAdapterFactory()" + NL + "\t{" + NL
+			+ "\t\treturn parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This sets the composed adapter factory that contains this factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_73 = NL
+			+ "\tpublic void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)" + NL + "\t{" + NL
+			+ "\t\tthis.parentAdapterFactory = parentAdapterFactory;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_74 = NL + "\tpublic boolean isFactoryForType(Object type)" + NL + "\t{" + NL
+			+ "\t\treturn supportedTypes.contains(type) || super.isFactoryForType(type);" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * This implementation substitutes the factory itself as the key for the adapter." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_75 = NL + "\tpublic Adapter adapt(Notifier notifier, Object type)" + NL + "\t{" + NL
+			+ "\t\treturn super.adapt(notifier, this);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_76 = NL + "\tpublic Object adapt(Object object, Object type)" + NL + "\t{" + NL
+			+ "\t\tif (isFactoryForType(type))" + NL + "\t\t{" + NL
+			+ "\t\t\tObject adapter = super.adapt(object, type);" + NL + "\t\t\tif (!(type instanceof Class";
+	protected final String TEXT_77 = "<?>";
+	protected final String TEXT_78 = ") || ";
+	protected final String TEXT_79 = ".isInstance((Class";
+	protected final String TEXT_80 = ")type, adapter)";
+	protected final String TEXT_81 = "(((Class";
+	protected final String TEXT_82 = ")type).isInstance(adapter))";
+	protected final String TEXT_83 = ")" + NL + "\t\t\t{" + NL + "\t\t\t\treturn adapter;" + NL + "\t\t\t}" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\treturn null;" + NL + "\t}" + NL;
+	protected final String TEXT_84 = NL + "\t/**" + NL
+			+ "\t * Associates an adapter with a notifier via the base implementation, then records it to ensure it will be disposed."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_85 = NL + "\tprotected void associate(Adapter adapter, Notifier target)" + NL + "\t{"
+			+ NL + "\t\tsuper.associate(adapter, target);" + NL + "\t\tif (adapter != null)" + NL + "\t\t{" + NL
+			+ "\t\t\tdisposable.add(adapter);" + NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_86 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_87 = " getChildCreationExtenders()" + NL + "\t{" + NL
+			+ "\t\treturn childCreationExtenderManager.getChildCreationExtenders();" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated"
+			+ NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_88 = " getNewChildDescriptors(Object object, ";
+	protected final String TEXT_89 = " editingDomain)" + NL + "\t{" + NL
+			+ "\t\treturn childCreationExtenderManager.getNewChildDescriptors(object, editingDomain);" + NL + "\t}" + NL
+			+ "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_90 = " getResourceLocator()" + NL + "\t{" + NL
+			+ "\t\treturn childCreationExtenderManager;" + NL + "\t}" + NL;
+	protected final String TEXT_91 = NL + "\t/**" + NL + "\t * This adds a listener." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_92 = NL + "\tpublic void addListener(INotifyChangedListener notifyChangedListener)" + NL
+			+ "\t{" + NL + "\t\tchangeNotifier.addListener(notifyChangedListener);" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * This removes a listener." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_93 = NL + "\tpublic void removeListener(INotifyChangedListener notifyChangedListener)"
+			+ NL + "\t{" + NL + "\t\tchangeNotifier.removeListener(notifyChangedListener);" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_94 = NL + "\tpublic void fireNotifyChanged(Notification notification)" + NL + "\t{" + NL
+			+ "\t\tchangeNotifier.fireNotifyChanged(notification);" + NL + "" + NL
+			+ "\t\tif (parentAdapterFactory != null)" + NL + "\t\t{" + NL
+			+ "\t\t\tparentAdapterFactory.fireNotifyChanged(notification);" + NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_95 = NL + "\t/**" + NL
+			+ "\t * This disposes all of the item providers created by this factory. " + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_96 = NL + "\tpublic void dispose()" + NL + "\t{";
+	protected final String TEXT_97 = NL + "\t\tdisposable.dispose();";
+	protected final String TEXT_98 = NL + "\t\tif (";
+	protected final String TEXT_99 = "ItemProvider != null) ";
+	protected final String TEXT_100 = "ItemProvider.dispose();";
+	protected final String TEXT_101 = NL + "\t/**" + NL + "\t * A child creation extender for the {@link ";
+	protected final String TEXT_102 = "}." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static class ";
+	protected final String TEXT_103 = " implements ";
+	protected final String TEXT_104 = NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * The switch for creating child descriptors specific to each extended class." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tprotected static class CreationSwitch extends ";
+	protected final String TEXT_105 = NL + "\t\t{" + NL + "\t\t\t/**" + NL
+			+ "\t\t\t * The child descriptors being populated." + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
+			+ "\t\t\tprotected ";
+	protected final String TEXT_106 = " newChildDescriptors;" + NL + "" + NL + "\t\t\t/**" + NL
+			+ "\t\t\t * The domain in which to create the children." + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
+			+ "\t\t\tprotected ";
+	protected final String TEXT_107 = " editingDomain;" + NL + "" + NL + "\t\t\t/**" + NL
+			+ "\t\t\t * Creates the a switch for populating child descriptors in the given domain." + NL
+			+ "\t\t\t * <!-- begin-user-doc -->" + NL + "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated"
+			+ NL + "\t\t\t */" + NL + "\t\t\tCreationSwitch(";
+	protected final String TEXT_108 = " newChildDescriptors, ";
+	protected final String TEXT_109 = " editingDomain) " + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tthis.newChildDescriptors = newChildDescriptors;" + NL
+			+ "\t\t\t\tthis.editingDomain = editingDomain;" + NL + "\t\t\t}";
+	protected final String TEXT_110 = NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */";
+	protected final String TEXT_111 = NL + "\t\t\t@Override";
+	protected final String TEXT_112 = NL + "\t\t\tpublic ";
+	protected final String TEXT_113 = "Object case";
+	protected final String TEXT_114 = " object)" + NL + "\t\t\t{";
+	protected final String TEXT_115 = NL + "\t\t\t\treturn null;" + NL + "\t\t\t}" + NL + " ";
+	protected final String TEXT_116 = NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
+			+ "\t\t\tprotected ";
+	protected final String TEXT_117 = " createChildParameter(Object feature, Object child)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\treturn new ";
+	protected final String TEXT_118 = "(null, feature, child);" + NL + "\t\t\t}" + NL + "" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
+	protected final String TEXT_119 = " editingDomain)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_120 = " result = new ";
+	protected final String TEXT_121 = "();" + NL + "\t\t\tnew CreationSwitch(result, editingDomain).doSwitch((";
+	protected final String TEXT_122 = ")object);" + NL + "\t\t\treturn result;" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
+	protected final String TEXT_123 = " getResourceLocator()" + NL + "\t\t{" + NL + "\t\t\treturn ";
+	protected final String TEXT_124 = ".INSTANCE;" + NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_125 = NL + "}";
+	protected final String TEXT_126 = NL;
+
+	public ItemProviderAdapterFactory() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_126);
+		stringBuffer.append(TEXT_126);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getEditDirectory();
+		packageName = genPackage.getProviderPackageName();
+		className = genPackage.getItemProviderAdapterFactoryClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getProviderPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("org.eclipse.emf.common.notify.Adapter");
+		genModel.addImport("org.eclipse.emf.common.notify.Notification");
+		genModel.addImport("org.eclipse.emf.common.notify.Notifier");
+		genModel.addImport("org.eclipse.emf.edit.provider.ChangeNotifier");
+		genModel.addImport("org.eclipse.emf.edit.provider.ComposeableAdapterFactory");
+		genModel.addImport("org.eclipse.emf.edit.provider.ComposedAdapterFactory");
+		genModel.addImport("org.eclipse.emf.edit.provider.IChangeNotifier");
+		genModel.addImport("org.eclipse.emf.edit.provider.IEditingDomainItemProvider");
+		genModel.addImport("org.eclipse.emf.edit.provider.IItemLabelProvider");
+		genModel.addImport("org.eclipse.emf.edit.provider.IItemPropertySource");
+		genModel.addImport("org.eclipse.emf.edit.provider.INotifyChangedListener");
+		genModel.addImport("org.eclipse.emf.edit.provider.IStructuredItemContentProvider");
+		genModel.addImport("org.eclipse.emf.edit.provider.ITreeItemContentProvider");
+		boolean useGenerics = genModel.useGenerics();
+		String _ArrayList = genModel
+				.getImportedName(useGenerics ? "java.util.ArrayList<java.lang.Object>" : "java.util.ArrayList");
+		String _Collection = genModel
+				.getImportedName(useGenerics ? "java.util.Collection<java.lang.Object>" : "java.util.Collection");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClasses())) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getItemProviderAdapterFactoryClassName());
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genPackage.getImportedAdapterFactoryClassName());
+		stringBuffer.append(TEXT_11);
+		if (genPackage.isDisposableProviderFactory()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IDisposable"));
+		}
+		if (genPackage.isExtensibleProviderFactory()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
+		}
+		stringBuffer.append(TEXT_13);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_17);
+		}
+		stringBuffer.append(TEXT_18);
+		if (genPackage.isDisposableProviderFactory() && genPackage.hasStatefulProvider()) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.Disposable"));
+			stringBuffer.append(TEXT_20);
+		}
+		if (genPackage.isExtensibleProviderFactory()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ChildCreationExtenderManager"));
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ChildCreationExtenderManager"));
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genPackage.getImportedEditPluginClassName());
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_25);
+		}
+		stringBuffer.append(TEXT_26);
+		stringBuffer.append(_Collection);
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(_ArrayList);
+		stringBuffer.append(TEXT_28);
+		stringBuffer.append(genPackage.getItemProviderAdapterFactoryClassName());
+		stringBuffer.append(TEXT_29);
+		for (String name : genPackage.getProviderSupportedTypes()) {
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genModel.getImportedName(name));
+			stringBuffer.append(TEXT_31);
+		}
+		stringBuffer.append(TEXT_32);
+		for (GenPackage genDelegate : genPackage.getAdapterDelegatePackages()) {
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genPackage.getAdapterFactoryDelegateName(genDelegate));
+			stringBuffer.append(TEXT_37);
+			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
+			stringBuffer.append(TEXT_38);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.AdapterFactory"));
+			stringBuffer.append(TEXT_39);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.AdapterFactory"));
+			stringBuffer.append(TEXT_40);
+			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
+			stringBuffer.append(TEXT_41);
+			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
+			stringBuffer.append(TEXT_42);
+			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
+			stringBuffer.append(TEXT_43);
+			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
+			stringBuffer.append(TEXT_44);
+			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
+			stringBuffer.append(TEXT_45);
+		}
+		for (GenClass genClass : genPackage.getGenClasses()) {
+			if (!genClass.isAbstract() && genClass.getProvider() != GenProviderKind.NONE_LITERAL) {
+				if (genClass.isProviderSingleton()) {
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_47);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_49);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(genClass.getProviderClassName());
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genClass.getUncapName());
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_53);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_49);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_54);
+					}
+					stringBuffer.append(TEXT_55);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_56);
+					stringBuffer.append(genClass.getUncapName());
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genClass.getUncapName());
+					stringBuffer.append(TEXT_58);
+					stringBuffer.append(genClass.getProviderClassName());
+					stringBuffer.append(TEXT_59);
+					stringBuffer.append(genClass.getUncapName());
+					stringBuffer.append(TEXT_60);
+				} else {
+					stringBuffer.append(TEXT_61);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_53);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_49);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_54);
+					}
+					stringBuffer.append(TEXT_55);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_62);
+					stringBuffer.append(genClass.getProviderClassName());
+					stringBuffer.append(TEXT_63);
+				}
+			}
+		}
+		for (GenClass genClass : genPackage.getAdapterDelegateSuperClasses()) {
+			stringBuffer.append(TEXT_64);
+			stringBuffer.append(genClass.getName());
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(genClass.getItemProviderAdapterFactoryClassName());
+			stringBuffer.append(TEXT_66);
+			if (genClass.hasAPITags()) {
+				stringBuffer.append(TEXT_48);
+				stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_49);
+			if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_50);
+			}
+			stringBuffer.append(TEXT_55);
+			stringBuffer.append(genClass.getName());
+			stringBuffer.append(TEXT_67);
+			stringBuffer.append(genClass.getItemProviderAdapterFactoryClassName());
+			stringBuffer.append(TEXT_68);
+			stringBuffer.append(genClass.getItemProviderAdapterFactoryClassName());
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(genClass.getName());
+			stringBuffer.append(TEXT_70);
+		}
+		stringBuffer.append(TEXT_71);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_72);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_73);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_74);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_75);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_76);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_77);
+		}
+		stringBuffer.append(TEXT_78);
+		if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+			stringBuffer.append(TEXT_79);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_77);
+			}
+			stringBuffer.append(TEXT_80);
+		} else {
+			stringBuffer.append(TEXT_81);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_77);
+			}
+			stringBuffer.append(TEXT_82);
+		}
+		stringBuffer.append(TEXT_83);
+		if (genPackage.isDisposableProviderFactory() && genPackage.hasStatefulProvider()) {
+			stringBuffer.append(TEXT_84);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_54);
+			}
+			stringBuffer.append(TEXT_85);
+		}
+		if (genPackage.isExtensibleProviderFactory()) {
+			stringBuffer.append(TEXT_86);
+			stringBuffer.append(genModel.getImportedName(
+					useGenerics ? "java.util.List<org.eclipse.emf.edit.provider.IChildCreationExtender>"
+							: "java.util.List"));
+			stringBuffer.append(TEXT_87);
+			stringBuffer
+					.append(genModel.getImportedName(useGenerics ? "java.util.Collection<?>" : "java.util.Collection"));
+			stringBuffer.append(TEXT_88);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
+			stringBuffer.append(TEXT_89);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
+			stringBuffer.append(TEXT_90);
+		}
+		stringBuffer.append(TEXT_91);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_92);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_93);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_54);
+		}
+		stringBuffer.append(TEXT_94);
+		if (genPackage.isDisposableProviderFactory()) {
+			stringBuffer.append(TEXT_95);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_54);
+			}
+			stringBuffer.append(TEXT_96);
+			if (genPackage.hasStatefulProvider()) {
+				stringBuffer.append(TEXT_97);
+			} else {
+				for (GenClass genClass : genPackage.getGenClasses()) {
+					if (!genClass.isAbstract() && genClass.isProviderSingleton()) {
+						stringBuffer.append(TEXT_98);
+						stringBuffer.append(genClass.getUncapName());
+						stringBuffer.append(TEXT_99);
+						stringBuffer.append(genClass.getUncapName());
+						stringBuffer.append(TEXT_100);
+					}
+				}
+			}
+			stringBuffer.append(TEXT_32);
+		}
+		if (genPackage.isChildCreationExtenders()) {
+			for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage
+					.getExtendedChildCreationData().entrySet()) {
+				stringBuffer.append(TEXT_101);
+				stringBuffer.append(packageEntry.getKey().getImportedPackageInterfaceName());
+				stringBuffer.append(TEXT_102);
+				stringBuffer.append(genPackage.getChildCreationExtenderName(packageEntry.getKey()));
+				stringBuffer.append(TEXT_103);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
+				stringBuffer.append(TEXT_104);
+				stringBuffer.append(genModel.getImportedName(packageEntry.getKey().getQualifiedSwitchClassName()));
+				stringBuffer.append(useGenerics ? "<Object>" : "");
+				stringBuffer.append(TEXT_105);
+				stringBuffer
+						.append(genModel.getImportedName(useGenerics ? "java.util.List<Object>" : "java.util.List"));
+				stringBuffer.append(TEXT_106);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
+				stringBuffer.append(TEXT_107);
+				stringBuffer
+						.append(genModel.getImportedName(useGenerics ? "java.util.List<Object>" : "java.util.List"));
+				stringBuffer.append(TEXT_108);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
+				stringBuffer.append(TEXT_109);
+				for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue()
+						.entrySet()) {
+					GenClass genClass = classEntry.getKey();
+					stringBuffer.append(TEXT_110);
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_111);
+					}
+					stringBuffer.append(TEXT_112);
+					stringBuffer.append(genClass.getTypeParameters());
+					stringBuffer.append(TEXT_113);
+					stringBuffer.append(genPackage.getClassUniqueName(genClass));
+					stringBuffer.append(TEXT_23);
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceTypeArguments());
+					stringBuffer.append(TEXT_114);
+					for (GenClass.ChildCreationData childCreationData : classEntry.getValue()) {
+						GenFeature createFeature = childCreationData.createFeature;
+						GenFeature delegatedFeature = childCreationData.delegatedFeature;
+						GenClassifier createClassifier = childCreationData.createClassifier;
+						if (createFeature.isFeatureMapType()) {
+							if (delegatedFeature.isReferenceType()) {
+								GenClass createClass = (GenClass) createClassifier;
+								stringBuffer.append(TEXT_17);
+								{
+									//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+									InternalPatternContext ictx = (InternalPatternContext) ctx;
+									new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+									stringBuffer.setLength(0);
+
+									final Map<String, Object> callParameters = new HashMap<String, Object>();
+									callParameters.put("createClass", createClass);
+									callParameters.put("createFeature", createFeature);
+									callParameters.put("delegatedFeature", delegatedFeature);
+									callParameters.put("createClassifier", createClassifier);
+									callParameters.put("childCreationData", childCreationData);
+									callParameters.put("genClass", genClass);
+									callParameters.put("genPackage", genPackage);
+									callParameters.put("genModel", genModel);
+									callParameters.put("isJDK50", isJDK50);
+									CallHelper.executeWithParameterInjection(
+											"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_036GEGJ-Ed-FqczH3ESmRw",
+											new ExecutionContext((InternalPatternContext) ctx), callParameters);
+									stringBuffer.setLength(0);
+								}
+
+								//ItemProvider/newChildDescriptorsReferenceDelegatedFeature.override.javajetinc
+							} else {
+								GenDataType createDataType = (GenDataType) createClassifier;
+								stringBuffer.append(TEXT_17);
+								{
+									//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+									InternalPatternContext ictx = (InternalPatternContext) ctx;
+									new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+									stringBuffer.setLength(0);
+
+									final Map<String, Object> callParameters = new HashMap<String, Object>();
+									callParameters.put("createDataType", createDataType);
+									callParameters.put("createFeature", createFeature);
+									callParameters.put("delegatedFeature", delegatedFeature);
+									callParameters.put("createClassifier", createClassifier);
+									callParameters.put("childCreationData", childCreationData);
+									callParameters.put("genClass", genClass);
+									callParameters.put("genPackage", genPackage);
+									callParameters.put("genModel", genModel);
+									callParameters.put("isJDK50", isJDK50);
+									CallHelper.executeWithParameterInjection(
+											"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04WyAGJ-Ed-FqczH3ESmRw",
+											new ExecutionContext((InternalPatternContext) ctx), callParameters);
+									stringBuffer.setLength(0);
+								}
+
+								//ItemProvider/newChildDescriptorsAttributeDelegatedFeature.override.javajetinc
+							}
+						} else if (createFeature.isReferenceType()) {
+							GenClass createClass = (GenClass) createClassifier;
+							stringBuffer.append(TEXT_17);
+							{
+								//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+								InternalPatternContext ictx = (InternalPatternContext) ctx;
+								new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+								stringBuffer.setLength(0);
+
+								final Map<String, Object> callParameters = new HashMap<String, Object>();
+								callParameters.put("createClass", createClass);
+								callParameters.put("createFeature", createFeature);
+								callParameters.put("delegatedFeature", delegatedFeature);
+								callParameters.put("createClassifier", createClassifier);
+								callParameters.put("childCreationData", childCreationData);
+								callParameters.put("genClass", genClass);
+								callParameters.put("genPackage", genPackage);
+								callParameters.put("genModel", genModel);
+								callParameters.put("isJDK50", isJDK50);
+								CallHelper.executeWithParameterInjection(
+										"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04ps8GJ-Ed-FqczH3ESmRw",
+										new ExecutionContext((InternalPatternContext) ctx), callParameters);
+								stringBuffer.setLength(0);
+							}
+
+							//ItemProvider/newChildDescriptorsReferenceFeature.override.javajetinc 
+						} else {
+							GenDataType createDataType = (GenDataType) createClassifier;
+							stringBuffer.append(TEXT_17);
+							{
+								//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+								InternalPatternContext ictx = (InternalPatternContext) ctx;
+								new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+								stringBuffer.setLength(0);
+
+								final Map<String, Object> callParameters = new HashMap<String, Object>();
+								callParameters.put("createDataType", createDataType);
+								callParameters.put("createFeature", createFeature);
+								callParameters.put("delegatedFeature", delegatedFeature);
+								callParameters.put("createClassifier", createClassifier);
+								callParameters.put("childCreationData", childCreationData);
+								callParameters.put("genClass", genClass);
+								callParameters.put("genPackage", genPackage);
+								callParameters.put("genModel", genModel);
+								callParameters.put("isJDK50", isJDK50);
+								CallHelper.executeWithParameterInjection(
+										"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_048n4GJ-Ed-FqczH3ESmRw",
+										new ExecutionContext((InternalPatternContext) ctx), callParameters);
+								stringBuffer.setLength(0);
+							}
+
+							//ItemProvider/newChildDescriptorsAttributeFeature.override.javajetinc
+						}
+						stringBuffer.append(TEXT_17);
+					}
+					stringBuffer.append(TEXT_115);
+				}
+				stringBuffer.append(TEXT_116);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.command.CommandParameter"));
+				stringBuffer.append(TEXT_117);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.command.CommandParameter"));
+				stringBuffer.append(TEXT_118);
+				stringBuffer.append(_Collection);
+				stringBuffer.append(TEXT_88);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
+				stringBuffer.append(TEXT_119);
+				stringBuffer.append(_ArrayList);
+				stringBuffer.append(TEXT_120);
+				stringBuffer.append(_ArrayList);
+				stringBuffer.append(TEXT_121);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+				stringBuffer.append(TEXT_122);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
+				stringBuffer.append(TEXT_123);
+				stringBuffer.append(genPackage.getImportedEditPluginClassName());
+				stringBuffer.append(TEXT_124);
+			}
+		}
+		stringBuffer.append(TEXT_125);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_17);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (!genPackage.getGenClasses().isEmpty());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ManifestMF.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ManifestMF.java
new file mode 100644
index 0000000..1b1f54f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ManifestMF.java
@@ -0,0 +1,271 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ManifestMF extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ManifestMF create(String lineSeparator) {
+		nl = lineSeparator;
+		ManifestMF result = new ManifestMF();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "Manifest-Version: 1.0" + NL + "Bundle-ManifestVersion: 2" + NL + "Bundle-Name: ";
+	protected final String TEXT_2 = NL + "Bundle-SymbolicName: ";
+	protected final String TEXT_3 = ";singleton:=true" + NL + "Automatic-Module-Name: ";
+	protected final String TEXT_4 = NL + "Bundle-Version: 1.0.0.qualifier" + NL + "Bundle-ClassPath: ";
+	protected final String TEXT_5 = ".jar";
+	protected final String TEXT_6 = ".";
+	protected final String TEXT_7 = NL + "Bundle-Activator: ";
+	protected final String TEXT_8 = "$Implementation";
+	protected final String TEXT_9 = "$Activator";
+	protected final String TEXT_10 = NL + "Bundle-Vendor: ";
+	protected final String TEXT_11 = NL + "Bundle-Localization: ";
+	protected final String TEXT_12 = NL + "Bundle-RequiredExecutionEnvironment: J2SE-1.5";
+	protected final String TEXT_13 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.6";
+	protected final String TEXT_14 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.7";
+	protected final String TEXT_15 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.8";
+	protected final String TEXT_16 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-9";
+	protected final String TEXT_17 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-10";
+	protected final String TEXT_18 = NL + "Export-Package: ";
+	protected final String TEXT_19 = ",";
+	protected final String TEXT_20 = NL + " ";
+	protected final String TEXT_21 = NL + "Require-Bundle: ";
+	protected final String TEXT_22 = ";resolution:=optional;x-installation:=greedy";
+	protected final String TEXT_23 = ";visibility:=reexport";
+	protected final String TEXT_24 = NL + "Import-Package: org.osgi.framework";
+	protected final String TEXT_25 = NL + "Eclipse-LazyStart: true";
+	protected final String TEXT_26 = NL + "Bundle-ActivationPolicy: lazy" + NL;
+	protected final String TEXT_27 = NL;
+
+	public ManifestMF() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditProjectDirectory() + "/META-INF/MANIFEST.MF";
+		overwrite = genModel.isUpdateClasspath();
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genModel.getEditBundleNameKey());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditPluginID());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getEditPluginID());
+		stringBuffer.append(TEXT_4);
+		if (genModel.isRuntimeJar()) {
+			stringBuffer.append(genModel.getEditPluginID());
+			stringBuffer.append(TEXT_5);
+		} else {
+			stringBuffer.append(TEXT_6);
+		}
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genModel.getQualifiedEditPluginClassName());
+			stringBuffer.append(TEXT_8);
+			if (genModel.isOSGiCompatible()) {
+				stringBuffer.append(TEXT_9);
+			}
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getEditBundleVendorKey());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genModel.getEditBundleLocalization());
+		if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {
+			stringBuffer.append(TEXT_12);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {
+			stringBuffer.append(TEXT_13);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {
+			stringBuffer.append(TEXT_14);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {
+			stringBuffer.append(TEXT_15);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {
+			stringBuffer.append(TEXT_16);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {
+			stringBuffer.append(TEXT_17);
+		}
+		Iterator<String> packagesIterator = genModel.getEditQualifiedPackageNames().iterator();
+		if (packagesIterator.hasNext()) {
+			String pack = packagesIterator.next();
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(pack);
+			while (packagesIterator.hasNext()) {
+				pack = packagesIterator.next();
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(pack);
+			}
+		}
+		Iterator<String> requiredPluginIterator = genModel.getEditRequiredPlugins().iterator();
+		if (requiredPluginIterator.hasNext()) {
+			String pluginID = requiredPluginIterator.next();
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(pluginID);
+			if (pluginID.startsWith("org.eclipse.core.runtime")) {
+				if (genModel.isOSGiCompatible()) {
+					stringBuffer.append(TEXT_22);
+				}
+			} else {
+				stringBuffer.append(TEXT_23);
+			}
+			while (requiredPluginIterator.hasNext()) {
+				pluginID = requiredPluginIterator.next();
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(pluginID);
+				if (pluginID.startsWith("org.eclipse.core.runtime")) {
+					if (genModel.isOSGiCompatible()) {
+						stringBuffer.append(TEXT_22);
+					}
+				} else if (!pluginID.equals("org.eclipse.xtext.xbase.lib")
+						&& !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {
+					stringBuffer.append(TEXT_23);
+				}
+			}
+		}
+		if (genModel.isOSGiCompatible()) {
+			stringBuffer.append(TEXT_24);
+		}
+		if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22
+				|| genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {
+			stringBuffer.append(TEXT_25);
+		}
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (genModel.isBundleManifest()) && (!genModel.sameEditEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ModuleGWTXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ModuleGWTXML.java
new file mode 100644
index 0000000..24bfbba
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/ModuleGWTXML.java
@@ -0,0 +1,202 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModuleGWTXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ModuleGWTXML create(String lineSeparator) {
+		nl = lineSeparator;
+		ModuleGWTXML result = new ModuleGWTXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL
+			+ "<!DOCTYPE module PUBLIC \"-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN\" \"http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd\">"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + NL + "<module>";
+	protected final String TEXT_4 = NL + "  <inherits name=\"";
+	protected final String TEXT_5 = "\" />";
+	protected final String TEXT_6 = NL + "  <source path=\"";
+	protected final String TEXT_7 = "\"/>";
+	protected final String TEXT_8 = NL + "</module>" + NL;
+	protected final String TEXT_9 = NL;
+
+	public ModuleGWTXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(TEXT_9);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditDirectory() + "/" + genModel.getQualifiedEditModuleName().replace(".", "/")
+				+ ".gwt.xml";
+		overwrite = false;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		for (String inherits : genModel.getEditModuleInherits()) {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(inherits);
+			stringBuffer.append(TEXT_5);
+		}
+		for (String source : genModel.getEditModuleSources()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(source);
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate
+				&& (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT && !genModel.sameModelEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Plugin.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Plugin.java
new file mode 100644
index 0000000..75059ff
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Plugin.java
@@ -0,0 +1,512 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Plugin extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized Plugin create(String lineSeparator) {
+		nl = lineSeparator;
+		Plugin result = new Plugin();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * This is the central singleton for the ";
+	protected final String TEXT_5 = " edit plugin." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "public final class ";
+	protected final String TEXT_10 = " extends EMFPlugin" + NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * Keep track of the singleton." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final ";
+	protected final String TEXT_16 = " INSTANCE = new ";
+	protected final String TEXT_17 = "();" + NL;
+	protected final String TEXT_18 = NL + "\t/**" + NL + "\t * Keep track of the singleton." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static Implementation plugin;" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * Create the instance." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_20 = "()" + NL + "\t{" + NL + "\t\tsuper" + NL + "\t\t  (new ResourceLocator [] " + NL
+			+ "\t\t   {";
+	protected final String TEXT_21 = NL + "\t\t     ";
+	protected final String TEXT_22 = ".INSTANCE,";
+	protected final String TEXT_23 = NL + "\t\t   });" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns the singleton instance of the Eclipse plugin." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the singleton instance." + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_24 = NL + "\t@Override";
+	protected final String TEXT_25 = NL + "\tpublic ResourceLocator getPluginResourceLocator()" + NL + "\t{";
+	protected final String TEXT_26 = NL + "\t\treturn null;";
+	protected final String TEXT_27 = NL + "\t\treturn plugin;";
+	protected final String TEXT_28 = NL + "\t}" + NL;
+	protected final String TEXT_29 = NL + "\t/**" + NL + "\t * Returns the singleton instance of the Eclipse plugin."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the singleton instance." + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static Implementation getPlugin()" + NL + "\t{" + NL + "\t\treturn plugin;" + NL + "\t}" + NL
+			+ "" + NL + "\t/**" + NL + "\t * The actual implementation of the Eclipse <b>Plugin</b>." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static class Implementation extends EclipsePlugin" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * Creates an instance." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_30 = NL + "\t\t * @param descriptor the description of the plugin.";
+	protected final String TEXT_31 = NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic Implementation(";
+	protected final String TEXT_32 = " descriptor";
+	protected final String TEXT_33 = ")" + NL + "\t\t{" + NL + "\t\t\tsuper(";
+	protected final String TEXT_34 = "descriptor";
+	protected final String TEXT_35 = ");" + NL + "" + NL + "\t\t\t// Remember the static instance." + NL + "\t\t\t//"
+			+ NL + "\t\t\tplugin = this;" + NL + "\t\t}";
+	protected final String TEXT_36 = NL + "\t" + NL + "\t\t/**" + NL
+			+ "\t\t * The actual implementation of the purely OSGi-compatible <b>Bundle Activator</b>." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic static final class Activator extends ";
+	protected final String TEXT_37 = ".OSGiDelegatingBundleActivator" + NL + "\t\t{";
+	protected final String TEXT_38 = NL + "\t\t\t@Override";
+	protected final String TEXT_39 = NL + "\t\t\tprotected ";
+	protected final String TEXT_40 = " createBundle()" + NL + "\t\t\t{" + NL + "\t\t\t\treturn new Implementation();"
+			+ NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_41 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected static final ";
+	protected final String TEXT_42 = " PROPERTIES = ";
+	protected final String TEXT_43 = ".create(";
+	protected final String TEXT_44 = ".class);" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Override" + NL
+			+ "\tpublic String getString(String key, boolean translate)" + NL + "\t{";
+	protected final String TEXT_45 = NL + "\t\t";
+	protected final String TEXT_46 = "else ";
+	protected final String TEXT_47 = "if (\"_UI_";
+	protected final String TEXT_48 = "_type\".equals(key)) return PROPERTIES.";
+	protected final String TEXT_49 = "Type();";
+	protected final String TEXT_50 = " if (\"_UI_Unknown_type\".equals(key)) return PROPERTIES.unknownType();" + NL
+			+ "\t\telse if (\"_UI_Unknown_datatype\".equals(key)) return PROPERTIES.unknownDatatype();";
+	protected final String TEXT_51 = NL + "\t\telse if (\"_UI_";
+	protected final String TEXT_52 = "_";
+	protected final String TEXT_53 = "_feature\".equals(key)) return PROPERTIES.";
+	protected final String TEXT_54 = "Feature();";
+	protected final String TEXT_55 = "_description\".equals(key)) return PROPERTIES.";
+	protected final String TEXT_56 = "Description();";
+	protected final String TEXT_57 = NL
+			+ "\t\telse if (\"_UI_Unknown_feature\".equals(key)) return PROPERTIES.unknownFeature();";
+	protected final String TEXT_58 = "_literal\".equals(key)) return PROPERTIES.";
+	protected final String TEXT_59 = "Literal();";
+	protected final String TEXT_60 = " = ";
+	protected final String TEXT_61 = NL + "\t\telse if (\"";
+	protected final String TEXT_62 = "\".equals(key)) return PROPERTIES.";
+	protected final String TEXT_63 = "();";
+	protected final String TEXT_64 = NL + "\t\telse return key;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t@Override" + NL
+			+ "\tpublic String getString(String key, Object [] substitutions, boolean translate)" + NL + "\t{";
+	protected final String TEXT_65 = NL
+			+ "\t\tif (\"_UI_CreateChild_text\".equals(key)) return PROPERTIES.createChildText(substitutions[0]);" + NL
+			+ "\t\telse if (\"_UI_CreateChild_text2\".equals(key)) return PROPERTIES.createChildText2(substitutions[0], substitutions[1]);"
+			+ NL
+			+ "\t\telse if (\"_UI_CreateChild_text3\".equals(key)) return PROPERTIES.createChildText3(substitutions[1]);"
+			+ NL
+			+ "\t\telse if (\"_UI_CreateChild_tooltip\".equals(key)) return PROPERTIES.createChildTooltip(substitutions[0], substitutions[1]);"
+			+ NL
+			+ "\t\telse if (\"_UI_CreateChild_description\".equals(key)) return PROPERTIES.createChildDescripition(substitutions[0], substitutions[1], substitutions[2]);"
+			+ NL
+			+ "\t\telse if (\"_UI_CreateSibling_description\".equals(key)) return PROPERTIES.createSiblingDescription(substitutions[0], substitutions[1], substitutions[2]);";
+	protected final String TEXT_66 = "if (\"_UI_PropertyDescriptor_description\".equals(key)) return PROPERTIES.propertyDescriptorDescription(substitutions[0], substitutions[1]);"
+			+ NL + "\t\telse return key;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected static final ";
+	protected final String TEXT_67 = " IMAGES = ";
+	protected final String TEXT_68 = ".class);" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Override" + NL
+			+ "\tpublic Object getImage(String key)" + NL + "\t{";
+	protected final String TEXT_69 = "if (\"";
+	protected final String TEXT_70 = "\".equals(key)) return IMAGES.";
+	protected final String TEXT_71 = "return key;" + NL + "\t}" + NL;
+	protected final String TEXT_72 = NL + "}";
+	protected final String TEXT_73 = NL;
+
+	public Plugin() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_73);
+		stringBuffer.append(TEXT_73);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getEditPluginDirectory();
+		packageName = genModel.getEditPluginPackageName();
+		className = genModel.getEditPluginClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("org.eclipse.emf.common.EMFPlugin");
+		genModel.addImport("org.eclipse.emf.common.util.ResourceLocator");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_5);
+		if (genModel.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genModel.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genModel.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genModel.getEditPluginClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genModel.getEditPluginClassName());
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genModel.getEditPluginClassName());
+		stringBuffer.append(TEXT_17);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_18);
+		}
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genModel.getEditPluginClassName());
+		stringBuffer.append(TEXT_20);
+		for (String pluginClassName : genModel.getEditResourceDelegateImportedPluginClassNames()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(pluginClassName);
+			stringBuffer.append(TEXT_22);
+		}
+		stringBuffer.append(TEXT_23);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_24);
+		}
+		stringBuffer.append(TEXT_25);
+		if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_26);
+		} else {
+			stringBuffer.append(TEXT_27);
+		}
+		stringBuffer.append(TEXT_28);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_29);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(TEXT_30);
+			}
+			stringBuffer.append(TEXT_31);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.IPluginDescriptor"));
+				stringBuffer.append(TEXT_32);
+			}
+			stringBuffer.append(TEXT_33);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(TEXT_34);
+			}
+			stringBuffer.append(TEXT_35);
+			if (genModel.isOSGiCompatible()) {
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.EMFPlugin"));
+				stringBuffer.append(TEXT_37);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_38);
+				}
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genModel.getImportedName("org.osgi.framework.BundleActivator"));
+				stringBuffer.append(TEXT_40);
+			}
+			stringBuffer.append(TEXT_28);
+		} else {
+			stringBuffer.append(TEXT_41);
+			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Properties"));
+			stringBuffer.append(TEXT_42);
+			stringBuffer.append(genModel.getImportedName("com.google.gwt.core.client.GWT"));
+			stringBuffer.append(TEXT_43);
+			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Properties"));
+			stringBuffer.append(TEXT_44);
+			boolean first = true;
+			for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+				if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {
+					for (GenClass genClass : genPackage.getGenClasses()) {
+						stringBuffer.append(TEXT_45);
+						if (first) {
+							first = false;
+						} else {
+							stringBuffer.append(TEXT_46);
+						}
+						stringBuffer.append(TEXT_47);
+						stringBuffer.append(genClass.getName());
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genClass.getUncapName());
+						stringBuffer.append(TEXT_49);
+					}
+				}
+			}
+			stringBuffer.append(TEXT_45);
+			if (first) {
+				first = false;
+			} else {
+				stringBuffer.append(TEXT_46);
+			}
+			stringBuffer.append(TEXT_50);
+			for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) {
+				String description = genFeature.getPropertyDescription();
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(genFeature.getGenClass().getName());
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genFeature.getName());
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genFeature.getGenClass().getUncapName());
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_54);
+				if (description != null && description.length() > 0) {
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(genFeature.getGenClass().getName());
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genFeature.getName());
+					stringBuffer.append(TEXT_55);
+					stringBuffer.append(genFeature.getGenClass().getUncapName());
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_56);
+				}
+			}
+			stringBuffer.append(TEXT_57);
+			for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+				if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {
+					for (GenEnum genEnum : genPackage.getGenEnums()) {
+						for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+							stringBuffer.append(TEXT_51);
+							stringBuffer.append(genEnum.getName());
+							stringBuffer.append(TEXT_52);
+							stringBuffer.append(genEnumLiteral.getName());
+							stringBuffer.append(TEXT_58);
+							stringBuffer.append(genEnum.getSafeUncapName());
+							stringBuffer.append(TEXT_52);
+							stringBuffer.append(genEnumLiteral.getName());
+							stringBuffer.append(TEXT_59);
+						}
+					}
+				}
+			}
+			for (String category : genModel.getPropertyCategories()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genModel.getPropertyCategoryKey(category));
+				stringBuffer.append(TEXT_60);
+				stringBuffer.append(category);
+				stringBuffer.append(TEXT_61);
+				stringBuffer.append(genModel.getPropertyCategoryKey(category));
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(genModel.getPropertyCategoryKey(category));
+				stringBuffer.append(TEXT_63);
+			}
+			stringBuffer.append(TEXT_64);
+			if (genModel.isCreationCommands()) {
+				stringBuffer.append(TEXT_65);
+			}
+			stringBuffer.append(TEXT_45);
+			if (!genModel.isCreationCommands()) {
+				stringBuffer.append(TEXT_46);
+			}
+			stringBuffer.append(TEXT_66);
+			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Images"));
+			stringBuffer.append(TEXT_67);
+			stringBuffer.append(genModel.getImportedName("com.google.gwt.core.client.GWT"));
+			stringBuffer.append(TEXT_43);
+			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Images"));
+			stringBuffer.append(TEXT_68);
+			first = true;
+			for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+				for (GenClass genClass : genPackage.getGenClasses()) {
+					if (genClass.isImage()) {
+						String image = genClass.getItemIconFileName();
+						image = image.substring(image.lastIndexOf("/icons/") + 7, image.length() - 4);
+						stringBuffer.append(TEXT_45);
+						if (first) {
+							first = false;
+						} else {
+							stringBuffer.append(TEXT_46);
+						}
+						stringBuffer.append(TEXT_69);
+						stringBuffer.append(image);
+						stringBuffer.append(TEXT_70);
+						stringBuffer.append(genClass.getItemIconAccessorName());
+						stringBuffer.append(TEXT_63);
+					}
+				}
+			}
+			stringBuffer.append(TEXT_45);
+			if (first) {
+				first = false;
+			} else {
+				stringBuffer.append(TEXT_46);
+			}
+			stringBuffer.append(TEXT_71);
+		}
+		stringBuffer.append(TEXT_72);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (!genModel.sameEditEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/PluginProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/PluginProperties.java
new file mode 100644
index 0000000..c281193
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/PluginProperties.java
@@ -0,0 +1,264 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginProperties extends org.eclipse.egf.emf.pattern.base.GenModelProperties {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "pluginName = ";
+	protected final String TEXT_3 = NL + "providerName = ";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "_UI_CreateChild_text = {0}" + NL + "_UI_CreateChild_text2 = {1} ";
+	protected final String TEXT_6 = "| ";
+	protected final String TEXT_7 = "{0}" + NL + "_UI_CreateChild_text3 = {1}" + NL
+			+ "_UI_CreateChild_tooltip = Create New {0} Under {1} Feature" + NL
+			+ "_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}."
+			+ NL
+			+ "_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent."
+			+ NL;
+	protected final String TEXT_8 = NL + "_UI_PropertyDescriptor_description = The {0} of the {1}" + NL;
+	protected final String TEXT_9 = NL + "_UI_";
+	protected final String TEXT_10 = "_type = ";
+	protected final String TEXT_11 = NL + "_UI_Unknown_type = Object" + NL + "" + NL + "_UI_Unknown_datatype= Value"
+			+ NL;
+	protected final String TEXT_12 = "_";
+	protected final String TEXT_13 = "_feature = ";
+	protected final String TEXT_14 = "_description = ";
+	protected final String TEXT_15 = NL + "_UI_Unknown_feature = Unspecified" + NL;
+	protected final String TEXT_16 = "_literal = ";
+	protected final String TEXT_17 = " = ";
+	protected final String TEXT_18 = NL;
+
+	public PluginProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_18);
+		stringBuffer.append(TEXT_18);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditProjectDirectory() + "/" + genModel.getEditBundleLocalization()
+				+ ".properties";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2007 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditBundleName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getEditBundleVendorName());
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_4);
+			if (genModel.isCreationCommands()) {
+				stringBuffer.append(TEXT_5);
+				if (genModel.isCreationSubmenus()) {
+					stringBuffer.append(TEXT_6);
+				}
+				stringBuffer.append(TEXT_7);
+			}
+			stringBuffer.append(TEXT_8);
+			for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+				if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {
+					for (GenClass genClass : genPackage.getGenClasses()) {
+						stringBuffer.append(TEXT_9);
+						stringBuffer.append(genClass.getName());
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genClass.getFormattedName());
+					}
+				}
+			}
+			stringBuffer.append(TEXT_11);
+			for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) {
+				String description = genFeature.getPropertyDescription();
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getGenClass().getName());
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getName());
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genFeature.getFormattedName());
+				if (description != null && description.length() > 0) {
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genFeature.getGenClass().getName());
+					stringBuffer.append(TEXT_12);
+					stringBuffer.append(genFeature.getName());
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(description);
+				}
+			}
+			stringBuffer.append(TEXT_15);
+			for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+				if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {
+					for (GenEnum genEnum : genPackage.getGenEnums()) {
+						for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+							stringBuffer.append(TEXT_9);
+							stringBuffer.append(genEnum.getName());
+							stringBuffer.append(TEXT_12);
+							stringBuffer.append(genEnumLiteral.getName());
+							stringBuffer.append(TEXT_16);
+							stringBuffer.append(genEnumLiteral.getLiteral());
+						}
+					}
+				}
+			}
+			for (String category : genModel.getPropertyCategories()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genModel.getPropertyCategoryKey(category));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(category);
+			}
+		}
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (true);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/PluginXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/PluginXML.java
new file mode 100644
index 0000000..fd314af
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/PluginXML.java
@@ -0,0 +1,385 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized PluginXML create(String lineSeparator) {
+		nl = lineSeparator;
+		PluginXML result = new PluginXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL + "<?eclipse version=\"3.0\"?>"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "<plugin>";
+	protected final String TEXT_4 = NL + "<plugin" + NL + "      name=\"%pluginName\"" + NL + "      id=\"";
+	protected final String TEXT_5 = "\"" + NL + "      version=\"1.0.0\"" + NL + "      provider-name=\"%providerName\""
+			+ NL + "      class=\"";
+	protected final String TEXT_6 = "$Implementation\">" + NL + "" + NL + "   <requires>";
+	protected final String TEXT_7 = NL + "      <import plugin=\"";
+	protected final String TEXT_8 = "\"";
+	protected final String TEXT_9 = " export=\"true\"";
+	protected final String TEXT_10 = "/>";
+	protected final String TEXT_11 = NL + "   </requires>" + NL + "" + NL + "   <runtime>";
+	protected final String TEXT_12 = NL + "      <library name=\"";
+	protected final String TEXT_13 = ".jar\">";
+	protected final String TEXT_14 = NL + "      <library name=\".\">";
+	protected final String TEXT_15 = NL + "         <export name=\"*\"/>" + NL + "      </library>" + NL
+			+ "   </runtime>";
+	protected final String TEXT_16 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.generated_package\">";
+	protected final String TEXT_17 = NL + "      <!-- @generated ";
+	protected final String TEXT_18 = " -->";
+	protected final String TEXT_19 = NL + "      <package" + NL + "            uri=\"";
+	protected final String TEXT_20 = NL + "            class=\"";
+	protected final String TEXT_21 = "\"" + NL + "            genModel=\"";
+	protected final String TEXT_22 = "\"/>";
+	protected final String TEXT_23 = NL + "   </extension>";
+	protected final String TEXT_24 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.content_parser\">";
+	protected final String TEXT_25 = NL + "      <parser" + NL + "            contentTypeIdentifier=\"";
+	protected final String TEXT_26 = "\"" + NL + "            class=\"";
+	protected final String TEXT_27 = "\"/>" + NL + "   </extension>" + NL + "" + NL
+			+ "   <extension point=\"org.eclipse.core.contenttype.contentTypes\">";
+	protected final String TEXT_28 = NL + "      <content-type" + NL + "            base-type=\"";
+	protected final String TEXT_29 = "\"" + NL + "            file-extensions=\"";
+	protected final String TEXT_30 = "\"" + NL + "            id=\"";
+	protected final String TEXT_31 = "\"" + NL + "            name=\"%_UI_";
+	protected final String TEXT_32 = "_content_type\"" + NL + "            priority=\"normal\">" + NL
+			+ "         <describer class=\"org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer\">";
+	protected final String TEXT_33 = NL + "            <parameter name=\"namespace\" value=\"";
+	protected final String TEXT_34 = NL + "            <parameter name=\"kind\" value=\"xmi\"/>";
+	protected final String TEXT_35 = NL + "         </describer>" + NL + "      </content-type>" + NL
+			+ "   </extension>";
+	protected final String TEXT_36 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.extension_parser\">";
+	protected final String TEXT_37 = NL + "      <parser" + NL + "            type=\"";
+	protected final String TEXT_38 = NL + NL
+			+ "   <extension point=\"org.eclipse.emf.edit.itemProviderAdapterFactories\">";
+	protected final String TEXT_39 = NL + "      <factory" + NL + "            uri=\"";
+	protected final String TEXT_40 = "\"" + NL + "            supportedTypes=";
+	protected final String TEXT_41 = NL + "              ";
+	protected final String TEXT_42 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.childCreationExtenders\">";
+	protected final String TEXT_43 = NL + "      <extender" + NL + "            uri=\"";
+	protected final String TEXT_44 = "$";
+	protected final String TEXT_45 = NL + NL + "</plugin>" + NL;
+	protected final String TEXT_46 = NL;
+
+	public PluginXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_46);
+		stringBuffer.append(TEXT_46);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditProjectDirectory() + "/plugin.xml";
+		overwrite = true;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String key = genModel.getPluginKey();
+		boolean hasKey = key != null && !key.equals("");
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getEditPluginID());
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genModel.getQualifiedEditPluginClassName());
+			stringBuffer.append(TEXT_6);
+			for (String pluginID : genModel.getEditRequiredPlugins()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(pluginID);
+				stringBuffer.append(TEXT_8);
+				if (!pluginID.startsWith("org.eclipse.core.runtime")) {
+					stringBuffer.append(TEXT_9);
+				}
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			if (genModel.isRuntimeJar()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genModel.getEditPluginID());
+				stringBuffer.append(TEXT_13);
+			} else {
+				stringBuffer.append(TEXT_14);
+			}
+			stringBuffer.append(TEXT_15);
+		}
+		if (genModel.sameModelEditProject()) {
+			for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+				stringBuffer.append(TEXT_16);
+				if (hasKey) {
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genPackage.getNSURI());
+				stringBuffer.append(TEXT_8);
+				if (genModel.hasLocalGenModel()) {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+					stringBuffer.append(TEXT_21);
+					stringBuffer.append(genModel.getRelativeGenModelLocation());
+					stringBuffer.append(TEXT_22);
+				} else {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+					stringBuffer.append(TEXT_22);
+				}
+				stringBuffer.append(TEXT_23);
+				if (genPackage.isContentType()) {
+					stringBuffer.append(TEXT_24);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genPackage.getContentTypeIdentifier());
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genPackage.getQualifiedEffectiveResourceFactoryClassName());
+					stringBuffer.append(TEXT_27);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(
+							genPackage.isXMIResource() ? "org.eclipse.emf.ecore.xmi" : "org.eclipse.core.runtime.xml");
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genPackage.getFileExtensions());
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genPackage.getContentTypeIdentifier());
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genPackage.getPrefix());
+					stringBuffer.append(TEXT_32);
+					if (genPackage.hasTargetNamespace()) {
+						stringBuffer.append(TEXT_33);
+						stringBuffer.append(genPackage.getNSURI());
+						stringBuffer.append(TEXT_22);
+					}
+					if (genPackage.isXMIResource()) {
+						stringBuffer.append(TEXT_34);
+					}
+					stringBuffer.append(TEXT_35);
+				} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {
+					stringBuffer.append(TEXT_36);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					for (String fileExtension : genPackage.getFileExtensionList()) {
+						stringBuffer.append(TEXT_37);
+						stringBuffer.append(fileExtension);
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
+						stringBuffer.append(TEXT_22);
+					}
+					stringBuffer.append(TEXT_23);
+				}
+			}
+		}
+		for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+			if (!genPackage.getGenClasses().isEmpty()) {
+				stringBuffer.append(TEXT_38);
+				if (hasKey) {
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genPackage.getNSURI());
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+				stringBuffer.append(TEXT_40);
+				for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext();) {
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(j.hasPrevious() ? " " : "\"");
+					stringBuffer.append(j.next());
+					if (!j.hasNext()) {
+						stringBuffer.append(TEXT_22);
+					}
+				}
+				stringBuffer.append(TEXT_23);
+				if (genPackage.isChildCreationExtenders()) {
+					Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> extendedChildCreationData = genPackage
+							.getExtendedChildCreationData();
+					if (!extendedChildCreationData.isEmpty()) {
+						stringBuffer.append(TEXT_42);
+						if (hasKey) {
+							stringBuffer.append(TEXT_17);
+							stringBuffer.append(key);
+							stringBuffer.append(TEXT_18);
+						}
+						for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> entry : extendedChildCreationData
+								.entrySet()) {
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(entry.getKey().getNSURI());
+							stringBuffer.append(TEXT_26);
+							stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+							stringBuffer.append(TEXT_44);
+							stringBuffer.append(genPackage.getChildCreationExtenderName(entry.getKey()));
+							stringBuffer.append(TEXT_22);
+						}
+						stringBuffer.append(TEXT_23);
+					}
+				}
+			}
+		}
+		stringBuffer.append(TEXT_45);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT)
+				&& (!genModel.sameEditEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Properties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Properties.java
new file mode 100644
index 0000000..cb22a1b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/Properties.java
@@ -0,0 +1,335 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Properties extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized Properties create(String lineSeparator) {
+		nl = lineSeparator;
+		Properties result = new Properties();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->" + NL + " * @generated" + NL + " */" + NL + "public interface ";
+	protected final String TEXT_5 = "Properties extends ";
+	protected final String TEXT_6 = NL + "{";
+	protected final String TEXT_7 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\t@Key(\"_UI_CreateChild_text\")" + NL + "\t@DefaultMessage(\"{0}\")" + NL
+			+ "\tString createChildText(Object type);" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\t@Key(\"_UI_CreateChild_text2\")" + NL + "\t@DefaultMessage(\"{1} ";
+	protected final String TEXT_8 = "| ";
+	protected final String TEXT_9 = "{0}\")" + NL + "\tString createChildText2(Object type, Object feature);" + NL + ""
+			+ NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\t@Key(\"_UI_CreateChild_text3\")" + NL
+			+ "\t@DefaultMessage(\"{0}\")" + NL + "\tString createChildText3(Object feature);" + NL + "" + NL + "\t/**"
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\t@Key(\"_UI_CreateChild_tooltip\")" + NL
+			+ "\t@DefaultMessage(\"Create New {0} Under {1} Feature\")" + NL
+			+ "\tString createChildTooltip(Object type, Object feature);" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t@Key(\"_UI_CreateChild_description\")" + NL
+			+ "\t@DefaultMessage(\"Create a new child of type {0} for the {1} feature of the selected {2}.\")" + NL
+			+ "\tString createChildDescripition(Object type, Object feature, Object selection);" + NL + "" + NL
+			+ "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated"
+			+ NL + "\t */" + NL + "\t@Key(\"_UI_CreateSibling_description\")" + NL
+			+ "\t@DefaultMessage(\"Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.\")"
+			+ NL + "\tString createSiblingDescription(Object type, Object feature, Object selection);" + NL;
+	protected final String TEXT_10 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\t@Key(\"_UI_PropertyDescriptor_description\")" + NL + "\t@DefaultMessage(\"The {0} of the {1}\")" + NL
+			+ "\tString propertyDescriptorDescription(Object feature, Object type);" + NL;
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Key(\"_UI_";
+	protected final String TEXT_12 = "_type\")" + NL + "\t@DefaultMessage(\"";
+	protected final String TEXT_13 = "\")" + NL + "\tString ";
+	protected final String TEXT_14 = "Type();" + NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Key(\"_UI_Unknown_type\")"
+			+ NL + "\t@DefaultMessage(\"Object\")" + NL + "\tString unknownType();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t@Key(\"_UI_Unknown_datatype\")" + NL + "\t@DefaultMessage(\"Value\")" + NL
+			+ "\tString unknownDatatype();" + NL;
+	protected final String TEXT_16 = "_";
+	protected final String TEXT_17 = "_feature\")" + NL + "\t@DefaultMessage(\"";
+	protected final String TEXT_18 = "Feature();" + NL;
+	protected final String TEXT_19 = "_description\")" + NL + "\t@DefaultMessage(\"";
+	protected final String TEXT_20 = "Description();" + NL;
+	protected final String TEXT_21 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\t@Key(\"_UI_Unknown_feature\")" + NL + "\t@DefaultMessage(\"Unspecified\")" + NL
+			+ "\tString unknownFeature();" + NL;
+	protected final String TEXT_22 = "_literal\")" + NL + "\t@DefaultMessage(\"";
+	protected final String TEXT_23 = "Literal();" + NL;
+	protected final String TEXT_24 = NL;
+	protected final String TEXT_25 = " = ";
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Key(\"";
+	protected final String TEXT_27 = "\")" + NL + "\t@DefaultMessage(\"";
+	protected final String TEXT_28 = "();" + NL;
+	protected final String TEXT_29 = NL + "}";
+	protected final String TEXT_30 = NL;
+
+	public Properties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_30);
+		stringBuffer.append(TEXT_30);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getEditPluginDirectory();
+		packageName = genModel.getEditPluginPackageName();
+		className = genModel.getEditPluginClassName() + "Properties";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getEditPluginClassName());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(genModel.getImportedName("com.google.gwt.i18n.client.Messages"));
+		stringBuffer.append(TEXT_6);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_7);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+			if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {
+				for (GenClass genClass : genPackage.getGenClasses()) {
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_12);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_13);
+					stringBuffer.append(genClass.getUncapName());
+					stringBuffer.append(TEXT_14);
+				}
+			}
+		}
+		stringBuffer.append(TEXT_15);
+		for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) {
+			String description = genFeature.getPropertyDescription();
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getGenClass().getName());
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genFeature.getName());
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genFeature.getFormattedName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genFeature.getGenClass().getUncapName());
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_18);
+			if (description != null && description.length() > 0) {
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getGenClass().getName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getName());
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(description);
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genFeature.getGenClass().getUncapName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_20);
+			}
+		}
+		stringBuffer.append(TEXT_21);
+		for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+			if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {
+				for (GenEnum genEnum : genPackage.getGenEnums()) {
+					for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+						stringBuffer.append(TEXT_11);
+						stringBuffer.append(genEnum.getName());
+						stringBuffer.append(TEXT_16);
+						stringBuffer.append(genEnumLiteral.getName());
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genEnumLiteral.getLiteral());
+						stringBuffer.append(TEXT_13);
+						stringBuffer.append(genEnum.getSafeUncapName());
+						stringBuffer.append(TEXT_16);
+						stringBuffer.append(genEnumLiteral.getName());
+						stringBuffer.append(TEXT_23);
+					}
+				}
+			}
+		}
+		for (String category : genModel.getPropertyCategories()) {
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getPropertyCategoryKey(category));
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(category);
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genModel.getPropertyCategoryKey(category));
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(category);
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getPropertyCategoryKey(category));
+			stringBuffer.append(TEXT_28);
+		}
+		stringBuffer.append(TEXT_29);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_24);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT)
+				&& (!genModel.sameEditEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvideraddPropertyDescriptoroverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvideraddPropertyDescriptoroverride.java
new file mode 100644
index 0000000..72bbc8e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvideraddPropertyDescriptoroverride.java
@@ -0,0 +1,321 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvideraddPropertyDescriptoroverride {
+	protected static String nl;
+
+	public static synchronized ItemProvideraddPropertyDescriptoroverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvideraddPropertyDescriptoroverride result = new ItemProvideraddPropertyDescriptoroverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\titemPropertyDescriptors.add" + NL + "\t\t\t(createItemPropertyDescriptor"
+			+ NL + "\t\t\t\t(((";
+	protected final String TEXT_2 = ")adapterFactory).getRootAdapterFactory()," + NL + "\t\t\t\t getResourceLocator(),"
+			+ NL + "\t\t\t\t getString(\"_UI_";
+	protected final String TEXT_3 = "_";
+	protected final String TEXT_4 = "_feature\"),";
+	protected final String TEXT_5 = NL + "\t\t\t\t getString(\"_UI_PropertyDescriptor_description\", \"_UI_";
+	protected final String TEXT_6 = "_feature\", \"_UI_";
+	protected final String TEXT_7 = "_type\"),";
+	protected final String TEXT_8 = NL + "\t\t\t\t getString(\"_UI_";
+	protected final String TEXT_9 = "_description\"),";
+	protected final String TEXT_10 = NL + "\t\t\t\t ";
+	protected final String TEXT_11 = "," + NL + "\t\t\t\t ";
+	protected final String TEXT_12 = ",";
+	protected final String TEXT_13 = NL + "\t\t\t\t null,";
+	protected final String TEXT_14 = ".";
+	protected final String TEXT_15 = NL + "\t\t\t\t getString(\"";
+	protected final String TEXT_16 = "\"),";
+	protected final String TEXT_17 = NL + "\t\t\t\t null," + NL + "\t\t\t\t ";
+	protected final String TEXT_18 = ".createURI(";
+	protected final String TEXT_19 = ")));";
+	protected final String TEXT_20 = NL + "\t\t\t\t null));";
+	protected final String TEXT_21 = NL + "\t\t\t\t new String[] {";
+	protected final String TEXT_22 = NL + "\t\t\t\t\t\"";
+	protected final String TEXT_23 = "\"";
+	protected final String TEXT_24 = NL + "\t\t\t\t }," + NL + "\t\t\t\t ";
+	protected final String TEXT_25 = NL + "\t\t\t\t }));";
+	protected final String TEXT_26 = NL;
+	protected final String TEXT_27 = NL;
+
+	public ItemProvideraddPropertyDescriptoroverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+								for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+									for (Object _ListParameter : _ListList) {
+
+										this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+										this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+										this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+										this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+										this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+										this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+										this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+										this._List = (java.lang.String) _ListParameter;
+
+										if (preCondition(ctx)) {
+											ctx.setNode(new Node.Container(currentNode, getClass()));
+											orchestration(ctx);
+										}
+
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("_List", this._List);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String _List = null;
+
+	public void set__List(java.lang.String object) {
+		this._List = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("_List", this._List);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ComposeableAdapterFactory"));
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGenClass().getName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getNonNLS());
+		if (genFeature.getPropertyDescription() == null || genFeature.getPropertyDescription().length() == 0) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genFeature.getGenClass().getName());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genFeature.getName());
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genFeature.getGenClass().getName());
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(genModel.getNonNLS(3));
+		} else {
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getGenClass().getName());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genFeature.getName());
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genFeature.getProperty() == GenPropertyKind.EDITABLE_LITERAL ? "true" : "false");
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genFeature.isPropertyMultiLine() ? "true" : "false");
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genFeature.isPropertySortChoices() ? "true" : "false");
+		stringBuffer.append(TEXT_12);
+		if (genFeature.isReferenceType()) {
+			stringBuffer.append(TEXT_13);
+		} else {
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ItemPropertyDescriptor"));
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getPropertyImageName());
+			stringBuffer.append(TEXT_12);
+		}
+		if (genFeature.getPropertyCategory() == null || genFeature.getPropertyCategory().length() == 0) {
+			stringBuffer.append(TEXT_13);
+		} else {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genModel.getPropertyCategoryKey(genFeature.getPropertyCategory()));
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		if (genFeature.getPropertyFilterFlags().isEmpty()) {
+			if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF214_VALUE
+					&& genFeature.getPropertyEditorFactory() != null
+					&& genFeature.getPropertyEditorFactory().trim().length() != 0) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(org.eclipse.emf.codegen.ecore.genmodel.impl.Literals
+						.toStringLiteral(genFeature.getPropertyEditorFactory().trim(), genModel));
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genModel.getNonNLS());
+			} else {
+				stringBuffer.append(TEXT_20);
+			}
+		} else {
+			stringBuffer.append(TEXT_21);
+			/*}*/for (Iterator<String> j = genFeature.getPropertyFilterFlags().iterator(); j.hasNext();) {
+				String filterFlag = j.next();
+				if (filterFlag != null && filterFlag.length() > 0) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(filterFlag);
+					stringBuffer.append(TEXT_23);
+					if (j.hasNext()) {
+						stringBuffer.append(TEXT_12);
+					}
+					stringBuffer.append(genModel.getNonNLS());
+				}
+			}
+			if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF214_VALUE
+					&& genFeature.getPropertyEditorFactory() != null
+					&& genFeature.getPropertyEditorFactory().trim().length() != 0) { // {
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(org.eclipse.emf.codegen.ecore.genmodel.impl.Literals
+						.toStringLiteral(genFeature.getPropertyEditorFactory().trim(), genModel));
+				stringBuffer.append(TEXT_19);
+			} else { // {
+				stringBuffer.append(TEXT_25);
+			}
+		}
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidergetStyledTextoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidergetStyledTextoverride.java
new file mode 100644
index 0000000..3c8db51
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidergetStyledTextoverride.java
@@ -0,0 +1,383 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidergetStyledTextoverride {
+	protected static String nl;
+
+	public static synchronized ItemProvidergetStyledTextoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidergetStyledTextoverride result = new ItemProvidergetStyledTextoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t\t";
+	protected final String TEXT_3 = "<?, ?>";
+	protected final String TEXT_4 = " ";
+	protected final String TEXT_5 = " = (";
+	protected final String TEXT_6 = ")object;";
+	protected final String TEXT_7 = NL + "\t\treturn new ";
+	protected final String TEXT_8 = "(\"\" + ";
+	protected final String TEXT_9 = ".getKey()).append(\" -> \", ";
+	protected final String TEXT_10 = ".QUALIFIER_STYLER).append(\"\" + ";
+	protected final String TEXT_11 = ".getValue());";
+	protected final String TEXT_12 = NL + "\t\tString key = crop(\"\" + ";
+	protected final String TEXT_13 = ".getKey());";
+	protected final String TEXT_14 = NL + "\t\tString key = \"\" + ";
+	protected final String TEXT_15 = ".getKey();";
+	protected final String TEXT_16 = NL + "\t\tString value = crop(\"\" + ";
+	protected final String TEXT_17 = NL + "\t\tString value = \"\" + ";
+	protected final String TEXT_18 = ".getValue();";
+	protected final String TEXT_19 = "(key).append(\" -> \", ";
+	protected final String TEXT_20 = ".QUALIFIER_STYLER).append(value);";
+	protected final String TEXT_21 = ")object;" + NL + "\t\treturn new ";
+	protected final String TEXT_22 = "(getString(\"_UI_";
+	protected final String TEXT_23 = "_type\"), ";
+	protected final String TEXT_24 = ".QUALIFIER_STYLER).append(\" \").append(";
+	protected final String TEXT_25 = ".toString(";
+	protected final String TEXT_26 = ".";
+	protected final String TEXT_27 = "()));";
+	protected final String TEXT_28 = NL + "\t\tString label = crop(((";
+	protected final String TEXT_29 = ")object).";
+	protected final String TEXT_30 = "());";
+	protected final String TEXT_31 = NL + "\t\tString label = ((";
+	protected final String TEXT_32 = "();";
+	protected final String TEXT_33 = " labelValue = ((";
+	protected final String TEXT_34 = ")object).eGet(";
+	protected final String TEXT_35 = ");";
+	protected final String TEXT_36 = NL + "\t\tString label = labelValue == null ? null : labelValue.toString();";
+	protected final String TEXT_37 = NL + "    \t";
+	protected final String TEXT_38 = " styledLabel = new ";
+	protected final String TEXT_39 = "();" + NL + "\t\tif (label == null || label.length() == 0)" + NL + "\t\t{" + NL
+			+ "\t\t\tstyledLabel.append(getString(\"_UI_";
+	protected final String TEXT_40 = ".QUALIFIER_STYLER); ";
+	protected final String TEXT_41 = NL + "\t\t} else {" + NL + "\t\t\tstyledLabel.append(getString(\"_UI_";
+	protected final String TEXT_42 = ".QUALIFIER_STYLER).append(\" \" + label);";
+	protected final String TEXT_43 = NL + "\t\t}" + NL + "\t\treturn styledLabel;";
+	protected final String TEXT_44 = "_type\"));";
+	protected final String TEXT_45 = NL;
+	protected final String TEXT_46 = NL;
+
+	public ItemProvidergetStyledTextoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+							for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+								for (Object _ListParameter : _ListList) {
+
+									this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+									this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+									this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+									this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+									this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+									this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+									this._List = (java.lang.String) _ListParameter;
+
+									if (preCondition(ctx)) {
+										ctx.setNode(new Node.Container(currentNode, getClass()));
+										orchestration(ctx);
+									}
+
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_46);
+		stringBuffer.append(TEXT_46);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("_List", this._List);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String _List = null;
+
+	public void set__List(java.lang.String object) {
+		this._List = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("_List", this._List);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genClass.isMapEntry()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_3);
+			}
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genClass.getSafeUncapName());
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_3);
+			}
+			stringBuffer.append(TEXT_6);
+			if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine()
+					&& !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+				stringBuffer.append(TEXT_8);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+			} else {
+				if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {
+					stringBuffer.append(TEXT_12);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_13);
+					stringBuffer.append(genModel.getNonNLS());
+				} else {
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genModel.getNonNLS());
+				}
+				if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(genModel.getNonNLS());
+				} else {
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genModel.getNonNLS());
+				}
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genModel.getNonNLS());
+			}
+		} else if (genClass.getLabelFeature() != null) {
+			GenFeature labelFeature = genClass.getLabelFeature();
+			if (labelFeature.isPrimitiveType() && !labelFeature.getGenClass().isDynamic()
+					&& !labelFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(labelFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genClass.getLabelFeature().getGetAccessor());
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+			} else {
+				if (labelFeature.isStringType() && !labelFeature.getGenClass().isDynamic()
+						&& !labelFeature.isSuppressedGetVisibility()) {
+					if (labelFeature.isPropertyMultiLine()) {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genClass.getImportedInterfaceName());
+						stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(labelFeature.getGetAccessor());
+						stringBuffer.append(TEXT_30);
+					} else {
+						stringBuffer.append(TEXT_31);
+						stringBuffer.append(genClass.getImportedInterfaceName());
+						stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(labelFeature.getGetAccessor());
+						stringBuffer.append(TEXT_32);
+					}
+				} else {
+					if (labelFeature.isSuppressedGetVisibility() || labelFeature.getGenClass().isDynamic()) {
+						stringBuffer.append(TEXT_2);
+						stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+						stringBuffer.append(TEXT_33);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(labelFeature.getQualifiedFeatureAccessor());
+						stringBuffer.append(TEXT_35);
+					} else {
+						stringBuffer.append(TEXT_2);
+						stringBuffer.append(labelFeature.getRawImportedType());
+						stringBuffer.append(TEXT_33);
+						stringBuffer.append(genClass.getImportedInterfaceName());
+						stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(labelFeature.getGetAccessor());
+						stringBuffer.append(TEXT_32);
+					}
+					stringBuffer.append(TEXT_36);
+				}
+				stringBuffer.append(TEXT_37);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+				stringBuffer.append(TEXT_38);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(TEXT_43);
+			}
+		} else {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genClass.getName());
+			stringBuffer.append(TEXT_44);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		stringBuffer.append(TEXT_45);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidergetTextoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidergetTextoverride.java
new file mode 100644
index 0000000..940bac7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidergetTextoverride.java
@@ -0,0 +1,357 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidergetTextoverride {
+	protected static String nl;
+
+	public static synchronized ItemProvidergetTextoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidergetTextoverride result = new ItemProvidergetTextoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t\treturn ((";
+	protected final String TEXT_3 = ")getStyledText(object)).getString();";
+	protected final String TEXT_4 = NL + "\t\t";
+	protected final String TEXT_5 = "<?, ?>";
+	protected final String TEXT_6 = " ";
+	protected final String TEXT_7 = " = (";
+	protected final String TEXT_8 = ")object;";
+	protected final String TEXT_9 = NL + "\t\treturn \"\" + ";
+	protected final String TEXT_10 = ".getKey() + \" -> \" + ";
+	protected final String TEXT_11 = ".getValue();";
+	protected final String TEXT_12 = NL + "\t\tString key = crop(\"\" + ";
+	protected final String TEXT_13 = ".getKey());";
+	protected final String TEXT_14 = NL + "\t\tString key = \"\" + ";
+	protected final String TEXT_15 = ".getKey();";
+	protected final String TEXT_16 = NL + "\t\tString value = crop(\"\" + ";
+	protected final String TEXT_17 = ".getValue());";
+	protected final String TEXT_18 = NL + "\t\tString value = \"\" + ";
+	protected final String TEXT_19 = NL + "\t\treturn key + \" -> \" + value;";
+	protected final String TEXT_20 = ")object;" + NL + "\t\treturn getString(\"_UI_";
+	protected final String TEXT_21 = "_type\") + \" \" + ";
+	protected final String TEXT_22 = ".";
+	protected final String TEXT_23 = "();";
+	protected final String TEXT_24 = NL + "\t\tString label = crop(((";
+	protected final String TEXT_25 = ")object).";
+	protected final String TEXT_26 = "());";
+	protected final String TEXT_27 = NL + "\t\tString label = ((";
+	protected final String TEXT_28 = " labelValue = ((";
+	protected final String TEXT_29 = ")object).eGet(";
+	protected final String TEXT_30 = ");";
+	protected final String TEXT_31 = NL + "\t\tString label = labelValue == null ? null : labelValue.toString();";
+	protected final String TEXT_32 = NL + "\t\treturn label == null || label.length() == 0 ?" + NL
+			+ "\t\t\tgetString(\"_UI_";
+	protected final String TEXT_33 = "_type\") :";
+	protected final String TEXT_34 = NL + "\t\t\tgetString(\"_UI_";
+	protected final String TEXT_35 = "_type\") + \" \" + label;";
+	protected final String TEXT_36 = NL + "\t\treturn getString(\"_UI_";
+	protected final String TEXT_37 = "_type\");";
+	protected final String TEXT_38 = NL;
+	protected final String TEXT_39 = NL;
+
+	public ItemProvidergetTextoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+							for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+								for (Object _ListParameter : _ListList) {
+
+									this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+									this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+									this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+									this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+									this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+									this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+									this._List = (java.lang.String) _ListParameter;
+
+									if (preCondition(ctx)) {
+										ctx.setNode(new Node.Container(currentNode, getClass()));
+										orchestration(ctx);
+									}
+
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_39);
+		stringBuffer.append(TEXT_39);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("_List", this._List);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String _List = null;
+
+	public void set__List(java.lang.String object) {
+		this._List = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("_List", this._List);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.isStyleProviders()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+			stringBuffer.append(TEXT_3);
+		} else {
+			if (genClass.isMapEntry()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				if (genModel.useGenerics()) {
+					stringBuffer.append(TEXT_5);
+				}
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				if (genModel.useGenerics()) {
+					stringBuffer.append(TEXT_5);
+				}
+				stringBuffer.append(TEXT_8);
+				if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine()
+						&& !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(genModel.getNonNLS(2));
+				} else {
+					if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {
+						stringBuffer.append(TEXT_12);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_13);
+						stringBuffer.append(genModel.getNonNLS());
+					} else {
+						stringBuffer.append(TEXT_14);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(genModel.getNonNLS());
+					}
+					if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+						stringBuffer.append(TEXT_16);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(genModel.getNonNLS());
+					} else {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_11);
+						stringBuffer.append(genModel.getNonNLS());
+					}
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genModel.getNonNLS());
+				}
+			} else if (genClass.getLabelFeature() != null) {
+				GenFeature labelFeature = genClass.getLabelFeature();
+				if (labelFeature.isPrimitiveType() && !labelFeature.getGenClass().isDynamic()
+						&& !labelFeature.isSuppressedGetVisibility()) {
+					stringBuffer.append(TEXT_4);
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+					stringBuffer.append(TEXT_6);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_21);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genClass.getLabelFeature().getGetAccessor());
+					stringBuffer.append(TEXT_23);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(genModel.getNonNLS(2));
+				} else {
+					if (labelFeature.isStringType() && !labelFeature.getGenClass().isDynamic()
+							&& !labelFeature.isSuppressedGetVisibility()) {
+						if (labelFeature.isPropertyMultiLine()) {
+							stringBuffer.append(TEXT_24);
+							stringBuffer.append(genClass.getImportedInterfaceName());
+							stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(labelFeature.getGetAccessor());
+							stringBuffer.append(TEXT_26);
+						} else {
+							stringBuffer.append(TEXT_27);
+							stringBuffer.append(genClass.getImportedInterfaceName());
+							stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(labelFeature.getGetAccessor());
+							stringBuffer.append(TEXT_23);
+						}
+					} else {
+						if (labelFeature.isSuppressedGetVisibility() || labelFeature.getGenClass().isDynamic()) {
+							stringBuffer.append(TEXT_4);
+							stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+							stringBuffer.append(TEXT_28);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+							stringBuffer.append(TEXT_29);
+							stringBuffer.append(labelFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_30);
+						} else {
+							stringBuffer.append(TEXT_4);
+							stringBuffer.append(labelFeature.getRawImportedType());
+							stringBuffer.append(TEXT_28);
+							stringBuffer.append(genClass.getImportedInterfaceName());
+							stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(labelFeature.getGetAccessor());
+							stringBuffer.append(TEXT_23);
+						}
+						stringBuffer.append(TEXT_31);
+					}
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(genModel.getNonNLS(2));
+				}
+			} else {
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_37);
+				stringBuffer.append(genModel.getNonNLS());
+			}
+		}
+		stringBuffer.append(TEXT_38);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProviderinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProviderinsert.java
new file mode 100644
index 0000000..8a263e1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProviderinsert.java
@@ -0,0 +1,186 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProviderinsert {
+	protected static String nl;
+
+	public static synchronized ItemProviderinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProviderinsert result = new ItemProviderinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ItemProviderinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+							for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+								for (Object _ListParameter : _ListList) {
+
+									this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+									this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+									this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+									this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+									this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+									this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+									this._List = (java.lang.String) _ListParameter;
+
+									if (preCondition(ctx)) {
+										ctx.setNode(new Node.Container(currentNode, getClass()));
+										orchestration(ctx);
+									}
+
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("_List", this._List);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String _List = null;
+
+	public void set__List(java.lang.String object) {
+		this._List = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("_List", this._List);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert.java
new file mode 100644
index 0000000..cc57418
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert.java
@@ -0,0 +1,213 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert create(
+			String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert result = new ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ItemProvidernewChildDescriptorsAttributeDelegatedFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createDataTypeList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createDataTypeParameter : createDataTypeList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createDataType = (org.eclipse.emf.codegen.ecore.genmodel.GenDataType) createDataTypeParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createDataType", this.createDataType);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenDataType createDataType = null;
+
+	public void set_createDataType(org.eclipse.emf.codegen.ecore.genmodel.GenDataType object) {
+		this.createDataType = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createDataType", this.createDataType);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride.java
new file mode 100644
index 0000000..e70fbcc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride.java
@@ -0,0 +1,281 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride create(
+			String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride result = new ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t\t\tnewChildDescriptors.add" + NL + "\t\t\t\t\t(createChildParameter" + NL
+			+ "\t\t\t\t\t\t(";
+	protected final String TEXT_2 = "," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_3 = ".createEntry" + NL + "\t\t\t\t\t\t\t(";
+	protected final String TEXT_4 = ",";
+	protected final String TEXT_5 = NL + "\t\t\t\t\t\t\t ";
+	protected final String TEXT_6 = ")));";
+	protected final String TEXT_7 = ".createFromString(";
+	protected final String TEXT_8 = ", ";
+	protected final String TEXT_9 = "))));";
+	protected final String TEXT_10 = " // TODO: ensure this is a valid literal value";
+	protected final String TEXT_11 = NL;
+	protected final String TEXT_12 = NL;
+
+	public ItemProvidernewChildDescriptorsAttributeDelegatedFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createDataTypeList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createDataTypeParameter : createDataTypeList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createDataType = (org.eclipse.emf.codegen.ecore.genmodel.GenDataType) createDataTypeParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_12);
+		stringBuffer.append(TEXT_12);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createDataType", this.createDataType);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenDataType createDataType = null;
+
+	public void set_createDataType(org.eclipse.emf.codegen.ecore.genmodel.GenDataType object) {
+		this.createDataType = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createDataType", this.createDataType);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(delegatedFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_4);
+		if (delegatedFeature.isEnumBasedType()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(delegatedFeature.getTypeGenEnum()
+					.getStaticValue(delegatedFeature.getEcoreFeature().getDefaultValueLiteral()));
+			stringBuffer.append(TEXT_6);
+		} else if (delegatedFeature.isStringBasedType()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(delegatedFeature.getCreateChildValueLiteral());
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genModel.getNonNLS());
+		} else {
+			String literal = delegatedFeature.getCreateChildValueLiteral();
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(createDataType.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(literal);
+			stringBuffer.append(TEXT_9);
+			if (literal != null) {
+				stringBuffer.append(genModel.getNonNLS());
+			} else {
+				stringBuffer.append(TEXT_10);
+			}
+		}
+		stringBuffer.append(TEXT_11);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.insert" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("createDataType", createDataType);
+			callParameters.put("createFeature", createFeature);
+			callParameters.put("delegatedFeature", delegatedFeature);
+			callParameters.put("createClassifier", createClassifier);
+			callParameters.put("childCreationData", childCreationData);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04f78GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_11);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeFeatureinsert.java
new file mode 100644
index 0000000..20f1451
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeFeatureinsert.java
@@ -0,0 +1,212 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsAttributeFeatureinsert {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsAttributeFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsAttributeFeatureinsert result = new ItemProvidernewChildDescriptorsAttributeFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ItemProvidernewChildDescriptorsAttributeFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createDataTypeList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createDataTypeParameter : createDataTypeList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createDataType = (org.eclipse.emf.codegen.ecore.genmodel.GenDataType) createDataTypeParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createDataType", this.createDataType);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenDataType createDataType = null;
+
+	public void set_createDataType(org.eclipse.emf.codegen.ecore.genmodel.GenDataType object) {
+		this.createDataType = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createDataType", this.createDataType);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeFeatureoverride.java
new file mode 100644
index 0000000..13bb087
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsAttributeFeatureoverride.java
@@ -0,0 +1,274 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsAttributeFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsAttributeFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsAttributeFeatureoverride result = new ItemProvidernewChildDescriptorsAttributeFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t\t\tnewChildDescriptors.add" + NL + "\t\t\t\t\t(createChildParameter" + NL
+			+ "\t\t\t\t\t\t(";
+	protected final String TEXT_2 = ",";
+	protected final String TEXT_3 = NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_4 = "));";
+	protected final String TEXT_5 = ".createFromString(";
+	protected final String TEXT_6 = ", ";
+	protected final String TEXT_7 = ")));";
+	protected final String TEXT_8 = " // TODO: ensure this is a valid literal value";
+	protected final String TEXT_9 = NL;
+	protected final String TEXT_10 = NL;
+
+	public ItemProvidernewChildDescriptorsAttributeFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createDataTypeList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createDataTypeParameter : createDataTypeList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createDataType = (org.eclipse.emf.codegen.ecore.genmodel.GenDataType) createDataTypeParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(TEXT_10);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createDataType", this.createDataType);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenDataType createDataType = null;
+
+	public void set_createDataType(org.eclipse.emf.codegen.ecore.genmodel.GenDataType object) {
+		this.createDataType = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createDataType", this.createDataType);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_2);
+		if (createFeature.isEnumBasedType()) {
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(createFeature.getTypeGenEnum()
+					.getStaticValue(createFeature.getEcoreFeature().getDefaultValueLiteral()));
+			stringBuffer.append(TEXT_4);
+		} else if (createFeature.isStringBasedType()) {
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(createFeature.getCreateChildValueLiteral());
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getNonNLS());
+		} else {
+			String literal = createFeature.getCreateChildValueLiteral();
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(createDataType.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(literal);
+			stringBuffer.append(TEXT_7);
+			if (literal != null) {
+				stringBuffer.append(genModel.getNonNLS());
+			} else {
+				stringBuffer.append(TEXT_8);
+			}
+		}
+		stringBuffer.append(TEXT_9);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.insert" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("createDataType", createDataType);
+			callParameters.put("createFeature", createFeature);
+			callParameters.put("delegatedFeature", delegatedFeature);
+			callParameters.put("createClassifier", createClassifier);
+			callParameters.put("childCreationData", childCreationData);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_05ZT0GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_9);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert.java
new file mode 100644
index 0000000..44bb237
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert.java
@@ -0,0 +1,213 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert create(
+			String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert result = new ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ItemProvidernewChildDescriptorsReferenceDelegatedFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createClassParameter : createClassList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) createClassParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createClass", this.createClass);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass createClass = null;
+
+	public void set_createClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.createClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createClass", this.createClass);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride.java
new file mode 100644
index 0000000..2b35961
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride.java
@@ -0,0 +1,268 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride create(
+			String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride result = new ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t\t\tnewChildDescriptors.add" + NL + "\t\t\t\t\t(createChildParameter" + NL
+			+ "\t\t\t\t\t\t(";
+	protected final String TEXT_2 = "," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_3 = ".createEntry" + NL + "\t\t\t\t\t\t\t(";
+	protected final String TEXT_4 = ",";
+	protected final String TEXT_5 = NL + "\t\t\t\t\t\t\t ";
+	protected final String TEXT_6 = ".create(";
+	protected final String TEXT_7 = "))));";
+	protected final String TEXT_8 = ".create";
+	protected final String TEXT_9 = "())));";
+	protected final String TEXT_10 = NL;
+	protected final String TEXT_11 = NL;
+
+	public ItemProvidernewChildDescriptorsReferenceDelegatedFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createClassParameter : createClassList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) createClassParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(TEXT_11);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createClass", this.createClass);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass createClass = null;
+
+	public void set_createClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.createClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createClass", this.createClass);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(delegatedFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_4);
+		if (createClass.isMapEntry()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(createClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_7);
+		} else {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(createClass.getGenPackage().getQualifiedFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(createClass.getName());
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.insert" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("createClass", createClass);
+			callParameters.put("createFeature", createFeature);
+			callParameters.put("delegatedFeature", delegatedFeature);
+			callParameters.put("createClassifier", createClassifier);
+			callParameters.put("childCreationData", childCreationData);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04NBAGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_10);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceFeatureinsert.java
new file mode 100644
index 0000000..22bbbc1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceFeatureinsert.java
@@ -0,0 +1,212 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsReferenceFeatureinsert {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsReferenceFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsReferenceFeatureinsert result = new ItemProvidernewChildDescriptorsReferenceFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ItemProvidernewChildDescriptorsReferenceFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createClassParameter : createClassList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) createClassParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createClass", this.createClass);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass createClass = null;
+
+	public void set_createClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.createClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createClass", this.createClass);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceFeatureoverride.java
new file mode 100644
index 0000000..775f195
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/edit/call/ItemProvider/ItemProvidernewChildDescriptorsReferenceFeatureoverride.java
@@ -0,0 +1,261 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.edit.call.ItemProvider;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ItemProvidernewChildDescriptorsReferenceFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ItemProvidernewChildDescriptorsReferenceFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ItemProvidernewChildDescriptorsReferenceFeatureoverride result = new ItemProvidernewChildDescriptorsReferenceFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t\t\tnewChildDescriptors.add" + NL + "\t\t\t\t\t(createChildParameter" + NL
+			+ "\t\t\t\t\t\t(";
+	protected final String TEXT_2 = ",";
+	protected final String TEXT_3 = NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_4 = ".create(";
+	protected final String TEXT_5 = ")));";
+	protected final String TEXT_6 = ".create";
+	protected final String TEXT_7 = "()));";
+	protected final String TEXT_8 = NL;
+	protected final String TEXT_9 = NL;
+
+	public ItemProvidernewChildDescriptorsReferenceFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> createClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> delegatedFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> createClassifierList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> childCreationDataList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object createClassParameter : createClassList) {
+			for (Object createFeatureParameter : createFeatureList) {
+				for (Object delegatedFeatureParameter : delegatedFeatureList) {
+					for (Object createClassifierParameter : createClassifierList) {
+						for (Object childCreationDataParameter : childCreationDataList) {
+							for (Object genClassParameter : genClassList) {
+								for (Object genPackageParameter : genPackageList) {
+									for (Object genModelParameter : genModelList) {
+										for (Object isJDK50Parameter : isJDK50List) {
+
+											this.createClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) createClassParameter;
+											this.createFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) createFeatureParameter;
+											this.delegatedFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) delegatedFeatureParameter;
+											this.createClassifier = (org.eclipse.emf.codegen.ecore.genmodel.GenClassifier) createClassifierParameter;
+											this.childCreationData = (org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData) childCreationDataParameter;
+											this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+											this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+											this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+											this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+											if (preCondition(ctx)) {
+												ctx.setNode(new Node.Container(currentNode, getClass()));
+												orchestration(ctx);
+											}
+
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(TEXT_9);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("createClass", this.createClass);
+			parameterValues.put("createFeature", this.createFeature);
+			parameterValues.put("delegatedFeature", this.delegatedFeature);
+			parameterValues.put("createClassifier", this.createClassifier);
+			parameterValues.put("childCreationData", this.childCreationData);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass createClass = null;
+
+	public void set_createClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.createClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature createFeature = null;
+
+	public void set_createFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.createFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature delegatedFeature = null;
+
+	public void set_delegatedFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.delegatedFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClassifier createClassifier = null;
+
+	public void set_createClassifier(org.eclipse.emf.codegen.ecore.genmodel.GenClassifier object) {
+		this.createClassifier = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData childCreationData = null;
+
+	public void set_childCreationData(org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData object) {
+		this.childCreationData = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("createClass", this.createClass);
+		parameters.put("createFeature", this.createFeature);
+		parameters.put("delegatedFeature", this.delegatedFeature);
+		parameters.put("createClassifier", this.createClassifier);
+		parameters.put("childCreationData", this.childCreationData);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
+		stringBuffer.append(TEXT_2);
+		if (createClass.isMapEntry()) {
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(createClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_5);
+		} else {
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(createClass.getGenPackage().getQualifiedFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(createClass.getName());
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.insert" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("createClass", createClass);
+			callParameters.put("createFeature", createFeature);
+			callParameters.put("delegatedFeature", delegatedFeature);
+			callParameters.put("createClassifier", createClassifier);
+			callParameters.put("childCreationData", childCreationData);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04y24GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_8);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ActionBarContributor.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ActionBarContributor.java
new file mode 100644
index 0000000..260be76
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ActionBarContributor.java
@@ -0,0 +1,1147 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ActionBarContributor extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized ActionBarContributor create(String lineSeparator) {
+		nl = lineSeparator;
+		ActionBarContributor result = new ActionBarContributor();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * This is the action bar contributor for the ";
+	protected final String TEXT_5 = " model editor." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = NL + "\textends ";
+	protected final String TEXT_11 = NL + "\timplements ";
+	protected final String TEXT_12 = NL + "{";
+	protected final String TEXT_13 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static final String copyright = ";
+	protected final String TEXT_14 = ";";
+	protected final String TEXT_15 = NL;
+	protected final String TEXT_16 = NL + "\t/**" + NL + "\t * Action to create objects from the ";
+	protected final String TEXT_17 = " model." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static class NewAction extends ";
+	protected final String TEXT_18 = NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_19 = NL + "\t\t@Override";
+	protected final String TEXT_20 = NL + "\t\tpublic void run(";
+	protected final String TEXT_21 = " action)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_22 = " wizard = new ";
+	protected final String TEXT_23 = "();" + NL + "\t\t\twizard.init(getWindow().getWorkbench(), ";
+	protected final String TEXT_24 = ".EMPTY);" + NL + "\t\t\t";
+	protected final String TEXT_25 = " wizardDialog = new ";
+	protected final String TEXT_26 = "(getWindow().getShell(), wizard);" + NL + "\t\t\twizardDialog.open();" + NL
+			+ "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_27 = NL + "\t/**" + NL + "\t * This keeps track of the active editor." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_28 = " activeEditorPart;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This keeps track of the current selection provider." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_29 = " selectionProvider;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This action opens the Properties view." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_30 = " showPropertiesViewAction =" + NL + "\t\tnew ";
+	protected final String TEXT_31 = "(";
+	protected final String TEXT_32 = ".INSTANCE.getString(\"_UI_ShowPropertiesView_menu_item\"))";
+	protected final String TEXT_33 = NL + "\t\t{";
+	protected final String TEXT_34 = NL + "\t\t\t@Override";
+	protected final String TEXT_35 = NL + "\t\t\tpublic void run()" + NL + "\t\t\t{" + NL + "\t\t\t\ttry" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tgetPage().showView(\"org.eclipse.ui.views.PropertySheet\");";
+	protected final String TEXT_36 = NL + "\t\t\t\t}" + NL + "\t\t\t\tcatch (";
+	protected final String TEXT_37 = " exception)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_38 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t};"
+			+ NL + "" + NL + "\t/**" + NL + "\t * This action refreshes the viewer of the current editor if the editor"
+			+ NL + "\t * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_39 = " refreshViewerAction =" + NL + "\t\tnew ";
+	protected final String TEXT_40 = ".INSTANCE.getString(\"_UI_RefreshViewer_menu_item\"))";
+	protected final String TEXT_41 = NL + "\t\t\tpublic boolean isEnabled()" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\treturn activeEditorPart instanceof ";
+	protected final String TEXT_42 = ";" + NL + "\t\t\t}" + NL;
+	protected final String TEXT_43 = NL + "\t\t\tpublic void run()" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tif (activeEditorPart instanceof ";
+	protected final String TEXT_44 = ")" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_45 = " viewer = ((";
+	protected final String TEXT_46 = ")activeEditorPart).getViewer();" + NL + "\t\t\t\t\tif (viewer != null)" + NL
+			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tviewer.refresh();" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t}" + NL + "\t\t};" + NL;
+	protected final String TEXT_47 = NL + "\t/**" + NL
+			+ "\t * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor"
+			+ NL + "\t * generated for the current selection by the item provider." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_48 = " createChildActions;" + NL;
+	protected final String TEXT_49 = NL + "\t/**" + NL
+			+ "\t * This will contain a map of {@link org.eclipse.emf.edit.ui.action.CreateChildAction}s, keyed by sub-menu text."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_50 = " createChildSubmenuActions;" + NL;
+	protected final String TEXT_51 = NL + "\t/**" + NL
+			+ "\t * This is the menu manager into which menu contribution items should be added for CreateChild actions."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_52 = " createChildMenuManager;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor"
+			+ NL + "\t * generated for the current selection by the item provider." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_53 = " createSiblingActions;" + NL;
+	protected final String TEXT_54 = NL + "\t/**" + NL
+			+ "\t * This will contain a map of {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction}s, keyed by submenu text."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_55 = " createSiblingSubmenuActions;" + NL;
+	protected final String TEXT_56 = NL + "\t/**" + NL
+			+ "\t * This is the menu manager into which menu contribution items should be added for CreateSibling actions."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_57 = " createSiblingMenuManager;" + NL;
+	protected final String TEXT_58 = NL + "\t/**" + NL + "\t * This creates an instance of the contributor." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_59 = "()" + NL + "\t{" + NL + "\t\tsuper(ADDITIONS_LAST_STYLE);" + NL
+			+ "\t\tloadResourceAction = new ";
+	protected final String TEXT_60 = "();" + NL + "\t\tvalidateAction = new ";
+	protected final String TEXT_61 = "();";
+	protected final String TEXT_62 = NL + "\t\tliveValidationAction = new ";
+	protected final String TEXT_63 = ".LiveValidator.LiveValidationAction(";
+	protected final String TEXT_64 = ".getPlugin().getDialogSettings());";
+	protected final String TEXT_65 = NL + "\t\tcontrolAction = new ";
+	protected final String TEXT_66 = NL + "\t\tfindAction = ";
+	protected final String TEXT_67 = ".create();";
+	protected final String TEXT_68 = NL + "\t\trevertAction = new ";
+	protected final String TEXT_69 = NL + "\t\texpandAllAction = new ";
+	protected final String TEXT_70 = NL + "\t\tcollapseAllAction = new ";
+	protected final String TEXT_71 = NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This adds Separators for editor additions to the tool bar." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_72 = NL + "\t@Override";
+	protected final String TEXT_73 = NL + "\tpublic void contributeToToolBar(";
+	protected final String TEXT_74 = " toolBarManager)" + NL + "\t{" + NL
+			+ "\t\tsuper.contributeToToolBar(toolBarManager);" + NL + "\t\ttoolBarManager.add(new ";
+	protected final String TEXT_75 = "(\"";
+	protected final String TEXT_76 = "-settings\"));";
+	protected final String TEXT_77 = NL + "\t\ttoolBarManager.add(new ";
+	protected final String TEXT_78 = "-additions\"));";
+	protected final String TEXT_79 = NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This adds to the menu bar a menu and some separators for editor additions," + NL
+			+ "\t * as well as the sub-menus for object creation items." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_80 = NL + "\tpublic void contributeToMenu(";
+	protected final String TEXT_81 = " menuManager)" + NL + "\t{" + NL + "\t\tsuper.contributeToMenu(menuManager);" + NL
+			+ "" + NL + "\t\t";
+	protected final String TEXT_82 = " submenuManager = new ";
+	protected final String TEXT_83 = ".INSTANCE.getString(\"_UI_";
+	protected final String TEXT_84 = "_menu\"), \"";
+	protected final String TEXT_85 = "MenuID\");";
+	protected final String TEXT_86 = NL + "\t\tmenuManager.insertAfter(\"additions\", submenuManager);";
+	protected final String TEXT_87 = NL + "\t\tsubmenuManager.add(new ";
+	protected final String TEXT_88 = "(\"settings\"));";
+	protected final String TEXT_89 = "(\"actions\"));";
+	protected final String TEXT_90 = "(\"additions\"));";
+	protected final String TEXT_91 = "(\"additions-end\"));";
+	protected final String TEXT_92 = NL + "\t\t// Prepare for CreateChild item addition or removal." + NL + "\t\t//"
+			+ NL + "\t\tcreateChildMenuManager = new ";
+	protected final String TEXT_93 = ".INSTANCE.getString(\"_UI_CreateChild_menu_item\"));";
+	protected final String TEXT_94 = NL + "\t\tsubmenuManager.insertBefore(\"additions\", createChildMenuManager);";
+	protected final String TEXT_95 = NL + NL + "\t\t// Prepare for CreateSibling item addition or removal." + NL
+			+ "\t\t//" + NL + "\t\tcreateSiblingMenuManager = new ";
+	protected final String TEXT_96 = ".INSTANCE.getString(\"_UI_CreateSibling_menu_item\"));";
+	protected final String TEXT_97 = NL + "\t\tsubmenuManager.insertBefore(\"additions\", createSiblingMenuManager);";
+	protected final String TEXT_98 = NL + NL + "\t\t// Force an update because Eclipse hides empty menus now." + NL
+			+ "\t\t//" + NL + "\t\tsubmenuManager.addMenuListener" + NL + "\t\t\t(new ";
+	protected final String TEXT_99 = "()" + NL + "\t\t\t {";
+	protected final String TEXT_100 = NL + "\t\t\t\t @Override";
+	protected final String TEXT_101 = NL + "\t\t\t\t public void menuAboutToShow(";
+	protected final String TEXT_102 = " menuManager)" + NL + "\t\t\t\t {" + NL
+			+ "\t\t\t\t\t menuManager.updateAll(true);" + NL + "\t\t\t\t }" + NL + "\t\t\t });" + NL;
+	protected final String TEXT_103 = NL + "\t\t// Add your contributions." + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL;
+	protected final String TEXT_104 = NL + "\t\taddGlobalActions(submenuManager);" + NL + "\t}" + NL + "" + NL + "\t/**"
+			+ NL
+			+ "\t * When the active editor changes, this remembers the change and registers with it as a selection provider."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_105 = NL + "\tpublic void setActiveEditor(";
+	protected final String TEXT_106 = " part)" + NL + "\t{" + NL + "\t\tsuper.setActiveEditor(part);" + NL
+			+ "\t\tactiveEditorPart = part;" + NL + "" + NL + "\t\t// Switch to the new selection provider." + NL
+			+ "\t\t//" + NL + "\t\tif (selectionProvider != null)" + NL + "\t\t{" + NL
+			+ "\t\t\tselectionProvider.removeSelectionChangedListener(this);" + NL + "\t\t}" + NL
+			+ "\t\tif (part == null)" + NL + "\t\t{" + NL + "\t\t\tselectionProvider = null;" + NL + "\t\t}" + NL
+			+ "\t\telse" + NL + "\t\t{" + NL + "\t\t\tselectionProvider = part.getSite().getSelectionProvider();" + NL
+			+ "\t\t\tselectionProvider.addSelectionChangedListener(this);" + NL + "" + NL
+			+ "\t\t\t// Fake a selection changed event to update the menus." + NL + "\t\t\t//" + NL
+			+ "\t\t\tif (selectionProvider.getSelection() != null)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tselectionChanged(new ";
+	protected final String TEXT_107 = "(selectionProvider, selectionProvider.getSelection()));" + NL + "\t\t\t}" + NL
+			+ "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener}," + NL
+			+ "\t * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings"
+			+ NL + "\t * that can be added to the selected object and updating the menus accordingly." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_108 = NL + "\tpublic void selectionChanged(";
+	protected final String TEXT_109 = " event)" + NL + "\t{";
+	protected final String TEXT_110 = NL + "\t\t// Remove any menu items for old selection." + NL + "\t\t//" + NL
+			+ "\t\tif (createChildMenuManager != null)" + NL + "\t\t{";
+	protected final String TEXT_111 = NL
+			+ "\t\t\tdepopulateManager(createChildMenuManager, createChildSubmenuActions);";
+	protected final String TEXT_112 = NL + "\t\t\tdepopulateManager(createChildMenuManager, createChildActions);" + NL
+			+ "\t\t}" + NL + "\t\tif (createSiblingMenuManager != null)" + NL + "\t\t{";
+	protected final String TEXT_113 = NL
+			+ "\t\t\tdepopulateManager(createSiblingMenuManager, createSiblingSubmenuActions);";
+	protected final String TEXT_114 = NL + "\t\t\tdepopulateManager(createSiblingMenuManager, createSiblingActions);"
+			+ NL + "\t\t}" + NL + "" + NL
+			+ "\t\t// Query the new selection for appropriate new child/sibling descriptors" + NL + "\t\t//" + NL
+			+ "\t\t";
+	protected final String TEXT_115 = " newChildDescriptors = null;" + NL + "\t\t";
+	protected final String TEXT_116 = " newSiblingDescriptors = null;" + NL + "" + NL + "\t\t";
+	protected final String TEXT_117 = " selection = event.getSelection();" + NL + "\t\tif (selection instanceof ";
+	protected final String TEXT_118 = " && ((IStructuredSelection)selection).size() == 1)" + NL + "\t\t{" + NL
+			+ "\t\t\tObject object = ((";
+	protected final String TEXT_119 = ")selection).getFirstElement();" + NL + "" + NL + "\t\t\t";
+	protected final String TEXT_120 = " domain = ((";
+	protected final String TEXT_121 = ")activeEditorPart).getEditingDomain();" + NL + "" + NL
+			+ "\t\t\tnewChildDescriptors = domain.getNewChildDescriptors(object, null);" + NL
+			+ "\t\t\tnewSiblingDescriptors = domain.getNewChildDescriptors(null, object);" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\t// Generate actions for selection; populate and redraw the menus." + NL + "\t\t//" + NL
+			+ "\t\tcreateChildActions = generateCreateChildActions(newChildDescriptors, selection);";
+	protected final String TEXT_122 = NL + "\t\tcreateChildSubmenuActions = extractSubmenuActions(createChildActions);";
+	protected final String TEXT_123 = NL
+			+ "\t\tcreateSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);";
+	protected final String TEXT_124 = NL
+			+ "\t\tcreateSiblingSubmenuActions = extractSubmenuActions(createSiblingActions);";
+	protected final String TEXT_125 = NL + NL + "\t\tif (createChildMenuManager != null)" + NL + "\t\t{";
+	protected final String TEXT_126 = NL
+			+ "\t\t\tpopulateManager(createChildMenuManager, createChildSubmenuActions, null);";
+	protected final String TEXT_127 = NL + "\t\t\tpopulateManager(createChildMenuManager, createChildActions, null);"
+			+ NL + "\t\t\tcreateChildMenuManager.update(true);" + NL + "\t\t}" + NL
+			+ "\t\tif (createSiblingMenuManager != null)" + NL + "\t\t{";
+	protected final String TEXT_128 = NL
+			+ "\t\t\tpopulateManager(createSiblingMenuManager, createSiblingSubmenuActions, null);";
+	protected final String TEXT_129 = NL
+			+ "\t\t\tpopulateManager(createSiblingMenuManager, createSiblingActions, null);" + NL
+			+ "\t\t\tcreateSiblingMenuManager.update(true);" + NL + "\t\t}";
+	protected final String TEXT_130 = NL + "\t\t// Add your contributions." + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT";
+	protected final String TEXT_131 = NL + "\t}" + NL;
+	protected final String TEXT_132 = NL + "\t/**" + NL
+			+ "\t * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>,"
+			+ NL + "\t * and returns the collection of these actions." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_133 = " generateCreateChildActions(";
+	protected final String TEXT_134 = " descriptors, ";
+	protected final String TEXT_135 = " selection)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_136 = " actions = new ";
+	protected final String TEXT_137 = "();" + NL + "\t\tif (descriptors != null)" + NL + "\t\t{";
+	protected final String TEXT_138 = NL + "\t\t\tfor (";
+	protected final String TEXT_139 = " descriptor : descriptors)";
+	protected final String TEXT_140 = " i = descriptors.iterator(); i.hasNext(); )";
+	protected final String TEXT_141 = NL + "\t\t\t{" + NL + "\t\t\t\tactions.add(new ";
+	protected final String TEXT_142 = "(activeEditorPart, selection, ";
+	protected final String TEXT_143 = "descriptor";
+	protected final String TEXT_144 = "i.next()";
+	protected final String TEXT_145 = "));" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\treturn actions;" + NL + "\t}"
+			+ NL + "" + NL + "\t/**" + NL
+			+ "\t * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>,"
+			+ NL + "\t * and returns the collection of these actions." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_146 = " generateCreateSiblingActions(";
+	protected final String TEXT_147 = "));" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\treturn actions;" + NL + "\t}"
+			+ NL + "" + NL + "\t/**" + NL
+			+ "\t * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s"
+			+ NL
+			+ "\t * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,"
+			+ NL + "\t * by inserting them before the specified contribution item <code>contributionID</code>." + NL
+			+ "\t * If <code>contributionID</code> is <code>null</code>, they are simply added." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected void populateManager(";
+	protected final String TEXT_148 = " manager, ";
+	protected final String TEXT_149 = " actions, String contributionID)" + NL + "\t{" + NL + "\t\tif (actions != null)"
+			+ NL + "\t\t{";
+	protected final String TEXT_150 = " action : actions)";
+	protected final String TEXT_151 = " i = actions.iterator(); i.hasNext(); )";
+	protected final String TEXT_152 = NL + "\t\t\t{";
+	protected final String TEXT_153 = NL + "\t\t\t\t";
+	protected final String TEXT_154 = " action = (IAction)i.next();";
+	protected final String TEXT_155 = NL + "\t\t\t\tif (contributionID != null)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tmanager.insertBefore(contributionID, action);" + NL + "\t\t\t\t}" + NL + "\t\t\t\telse" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tmanager.add(action);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}"
+			+ NL + "\t}" + NL + "\t\t" + NL + "\t/**" + NL
+			+ "\t * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s"
+			+ NL
+			+ "\t * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected void depopulateManager(";
+	protected final String TEXT_156 = " actions)" + NL + "\t{" + NL + "\t\tif (actions != null)" + NL + "\t\t{" + NL
+			+ "\t\t\t";
+	protected final String TEXT_157 = "[] items = manager.getItems();" + NL
+			+ "\t\t\tfor (int i = 0; i < items.length; i++)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Look into SubContributionItems" + NL + "\t\t\t\t//" + NL + "\t\t\t\t";
+	protected final String TEXT_158 = " contributionItem = items[i];" + NL
+			+ "\t\t\t\twhile (contributionItem instanceof ";
+	protected final String TEXT_159 = ")" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tcontributionItem = ((";
+	protected final String TEXT_160 = ")contributionItem).getInnerItem();" + NL + "\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t// Delete the ActionContributionItems with matching action." + NL + "\t\t\t\t//" + NL
+			+ "\t\t\t\tif (contributionItem instanceof ";
+	protected final String TEXT_161 = " action = ((";
+	protected final String TEXT_162 = ")contributionItem).getAction();" + NL + "\t\t\t\t\tif (actions.contains(action))"
+			+ NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tmanager.remove(contributionItem);" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_163 = NL + "\t/**" + NL
+			+ "\t * This extracts those actions in the <code>submenuActions</code> collection whose text is qualified and returns"
+			+ NL + "\t * a map of these actions, keyed by submenu text." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_164 = " extractSubmenuActions(";
+	protected final String TEXT_165 = " createActions)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_166 = " createSubmenuActions = new ";
+	protected final String TEXT_167 = "();" + NL + "\t\tif (createActions != null)" + NL + "\t\t{" + NL + "\t\t\tfor (";
+	protected final String TEXT_168 = " actions = createActions.iterator(); actions.hasNext(); )" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t";
+	protected final String TEXT_169 = " action = ";
+	protected final String TEXT_170 = ")";
+	protected final String TEXT_171 = "actions.next();" + NL + "\t\t\t\t";
+	protected final String TEXT_172 = " st = new ";
+	protected final String TEXT_173 = "(action.getText(), \"|\");";
+	protected final String TEXT_174 = NL + "\t\t\t\tif (st.countTokens() == 2)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tString text = st.nextToken().trim();" + NL + "\t\t\t\t\t";
+	protected final String TEXT_175 = " submenuActions = ";
+	protected final String TEXT_176 = "createSubmenuActions.get(text);" + NL + "\t\t\t\t\tif (submenuActions == null)"
+			+ NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tcreateSubmenuActions.put(text, submenuActions = new ";
+	protected final String TEXT_177 = "());" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\taction.setText(st.nextToken().trim());" + NL + "\t\t\t\t\tsubmenuActions.add(action);" + NL
+			+ "\t\t\t\t\tactions.remove();" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL
+			+ "\t\treturn createSubmenuActions;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.MenuManager}s containing"
+			+ NL
+			+ "\t * {@link org.eclipse.jface.action.ActionContributionItem}s based on the {@link org.eclipse.jface.action.IAction}s"
+			+ NL
+			+ "\t * contained in the <code>submenuActions</code> collection, by inserting them before the specified contribution"
+			+ NL + "\t * item <code>contributionID</code>." + NL
+			+ "\t * If <code>contributionID</code> is <code>null</code>, they are simply added." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected void populateManager(";
+	protected final String TEXT_178 = " submenuActions, String contributionID)" + NL + "\t{" + NL
+			+ "\t\tif (submenuActions != null)" + NL + "\t\t{";
+	protected final String TEXT_179 = " entry : submenuActions.entrySet())" + NL + "\t\t\t{";
+	protected final String TEXT_180 = " entries = submenuActions.entrySet().iterator(); entries.hasNext();)" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_181 = " entry = (";
+	protected final String TEXT_182 = ")entries.next();";
+	protected final String TEXT_183 = "(String)";
+	protected final String TEXT_184 = "entry.getKey());" + NL + "\t\t\t\tif (contributionID != null)" + NL + "\t\t\t\t{"
+			+ NL + "\t\t\t\t\tmanager.insertBefore(contributionID, submenuManager);" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\telse" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tmanager.add(submenuManager);" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tpopulateManager(submenuManager, ";
+	protected final String TEXT_185 = "entry.getValue(), null);" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t}" + NL + ""
+			+ NL + "\t/**" + NL
+			+ "\t * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.MenuManager}s and their"
+			+ NL
+			+ "\t * {@link org.eclipse.jface.action.ActionContributionItem}s based on the {@link org.eclipse.jface.action.IAction}s"
+			+ NL + "\t * contained in the <code>submenuActions</code> map." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected void depopulateManager(";
+	protected final String TEXT_186 = " submenuActions)" + NL + "\t{" + NL + "\t\tif (submenuActions != null)" + NL
+			+ "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_187 = "[] items = manager.getItems();" + NL
+			+ "\t\t\tfor (int i = 0; i < items.length; i++)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_188 = " contributionItem = items[i];" + NL + "\t\t\t\tif (contributionItem instanceof ";
+	protected final String TEXT_189 = " submenuManager = (";
+	protected final String TEXT_190 = ")contributionItem;" + NL
+			+ "\t\t\t\t\tif (submenuActions.containsKey(submenuManager.getMenuText()))" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tdepopulateManager(submenuManager, ";
+	protected final String TEXT_191 = "submenuActions.get(submenuManager.getMenuText()));" + NL
+			+ "\t\t\t\t\t\tmanager.remove(contributionItem);" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t}"
+			+ NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_192 = NL + "\t/**" + NL + "\t * This populates the pop-up menu before it appears." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_193 = NL + "\tpublic void menuAboutToShow(";
+	protected final String TEXT_194 = " menuManager)" + NL + "\t{" + NL + "\t\tsuper.menuAboutToShow(menuManager);";
+	protected final String TEXT_195 = NL + "\t\t";
+	protected final String TEXT_196 = " submenuManager = null;" + NL + "" + NL + "\t\tsubmenuManager = new ";
+	protected final String TEXT_197 = NL + "\t\tpopulateManager(submenuManager, createChildSubmenuActions, null);";
+	protected final String TEXT_198 = NL + "\t\tpopulateManager(submenuManager, createChildActions, null);" + NL
+			+ "\t\tmenuManager.insertBefore(\"edit\", submenuManager);";
+	protected final String TEXT_199 = NL + NL + "\t\tsubmenuManager = new ";
+	protected final String TEXT_200 = NL + "\t\tpopulateManager(submenuManager, createSiblingSubmenuActions, null);";
+	protected final String TEXT_201 = NL + "\t\tpopulateManager(submenuManager, createSiblingActions, null);" + NL
+			+ "\t\tmenuManager.insertBefore(\"edit\", submenuManager);";
+	protected final String TEXT_202 = NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This inserts global actions before the \"additions-end\" separator." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_203 = NL + "\tprotected void addGlobalActions(";
+	protected final String TEXT_204 = " menuManager)" + NL + "\t{" + NL
+			+ "\t\tmenuManager.insertAfter(\"additions-end\", new ";
+	protected final String TEXT_205 = "(\"ui-actions\"));";
+	protected final String TEXT_206 = NL + "\t\tmenuManager.insertAfter(\"ui-actions\", showPropertiesViewAction);";
+	protected final String TEXT_207 = NL + NL
+			+ "\t\trefreshViewerAction.setEnabled(refreshViewerAction.isEnabled());\t\t" + NL
+			+ "\t\tmenuManager.insertAfter(\"ui-actions\", refreshViewerAction);";
+	protected final String TEXT_208 = NL + NL + "\t\tsuper.addGlobalActions(menuManager);" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * This ensures that a delete action will clean up all references to deleted objects."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_209 = NL + "\tprotected boolean removeAllReferencesOnDelete()" + NL + "\t{" + NL
+			+ "\t\treturn true;" + NL + "\t}" + NL + "" + NL + "}";
+	protected final String TEXT_210 = NL;
+
+	public ActionBarContributor() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_210);
+		stringBuffer.append(TEXT_210);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getEditorDirectory();
+		packageName = genPackage.getPresentationPackageName();
+		className = genPackage.getActionBarContributorClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2007 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+
+		String _CollectionOfAnything = null;
+		String _CollectionOfIAction = null;
+		String _ArrayListOfIAction = null;
+		String _CollectionOfExtendsIAction = null;
+		String _IteratorOfIAction = null;
+		String _MapOfStringToCollectionOfIAction = null;
+		String _MapEntryOfStringToCollectionOfIAction = null;
+		String _LinkedHashMapOfStringToCollectionOfIAction = null;
+		if (genModel.isCreationCommands()) {
+			_CollectionOfAnything = genModel.getImportedName("Collection" + (genModel.useGenerics() ? "<?>" : ""));
+			_CollectionOfIAction = genModel
+					.getImportedName(genModel.useGenerics() ? "java.util.Collection<org.eclipse.jface.action.IAction>"
+							: "java.util.Collection");
+			_ArrayListOfIAction = genModel
+					.getImportedName(genModel.useGenerics() ? "java.util.ArrayList<org.eclipse.jface.action.IAction>"
+							: "java.util.ArrayList");
+			_CollectionOfExtendsIAction = genModel.getImportedName(
+					genModel.useGenerics() ? "java.util.Collection<? extends org.eclipse.jface.action.IAction>"
+							: "java.util.Collection");
+			if (genModel.isCreationSubmenus()) {
+				_IteratorOfIAction = genModel
+						.getImportedName(genModel.useGenerics() ? "java.util.Iterator<org.eclipse.jface.action.IAction>"
+								: "java.util.Iterator");
+				_MapOfStringToCollectionOfIAction = genModel.getImportedName("java.util.Map")
+						+ (genModel.useGenerics() ? ("<String, " + _CollectionOfIAction + ">") : "");
+				_MapEntryOfStringToCollectionOfIAction = genModel.getImportedName("java.util.Map") + ".Entry"
+						+ (genModel.useGenerics() ? ("<String, " + _CollectionOfIAction + ">") : "");
+				_LinkedHashMapOfStringToCollectionOfIAction = genModel.getImportedName("java.util.LinkedHashMap")
+						+ (genModel.useGenerics() ? ("<String, " + _CollectionOfIAction + ">") : "");
+			}
+		}
+
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getPresentationPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getPrefix());
+		stringBuffer.append(TEXT_5);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getActionBarContributorClassName());
+		stringBuffer.append(TEXT_10);
+		stringBuffer
+				.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor"));
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelectionChangedListener"));
+		stringBuffer.append(TEXT_12);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_15);
+		}
+		if (genModel.isRichClientPlatform() && genPackage.isGenerateModelWizard()) {
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genPackage.getPrefix());
+			stringBuffer.append(TEXT_17);
+			stringBuffer
+					.append(genModel.getImportedName("org.eclipse.emf.common.ui.action.WorkbenchWindowActionDelegate"));
+			stringBuffer.append(TEXT_18);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_19);
+			}
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.StructuredSelection"));
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.wizard.WizardDialog"));
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.wizard.WizardDialog"));
+			stringBuffer.append(TEXT_26);
+		}
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IEditorPart"));
+		stringBuffer.append(TEXT_28);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelectionProvider"));
+		stringBuffer.append(TEXT_29);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+		stringBuffer.append(TEXT_30);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Action"));
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_32);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_33);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_34);
+		}
+		stringBuffer.append(TEXT_35);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_36);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.ui.PartInitException"));
+		stringBuffer.append(TEXT_37);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_38);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+		stringBuffer.append(TEXT_39);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Action"));
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_40);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_33);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_34);
+		}
+		stringBuffer.append(TEXT_41);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.viewer.IViewerProvider"));
+		stringBuffer.append(TEXT_42);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_34);
+		}
+		stringBuffer.append(TEXT_43);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.viewer.IViewerProvider"));
+		stringBuffer.append(TEXT_44);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.Viewer"));
+		stringBuffer.append(TEXT_45);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.viewer.IViewerProvider"));
+		stringBuffer.append(TEXT_46);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_47);
+			stringBuffer.append(_CollectionOfIAction);
+			stringBuffer.append(TEXT_48);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(_MapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_50);
+			}
+			stringBuffer.append(TEXT_51);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+			stringBuffer.append(TEXT_52);
+			stringBuffer.append(_CollectionOfIAction);
+			stringBuffer.append(TEXT_53);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(_MapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_55);
+			}
+			stringBuffer.append(TEXT_56);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+			stringBuffer.append(TEXT_57);
+		}
+		stringBuffer.append(TEXT_58);
+		stringBuffer.append(genPackage.getActionBarContributorClassName());
+		stringBuffer.append(TEXT_59);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.LoadResourceAction"));
+		stringBuffer.append(TEXT_60);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.ValidateAction"));
+		stringBuffer.append(TEXT_61);
+		if (genModel.getDecoration() == GenDecoration.LIVE) {
+			stringBuffer.append(TEXT_62);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DiagnosticDecorator"));
+			stringBuffer.append(TEXT_63);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_64);
+		}
+		stringBuffer.append(TEXT_65);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.ControlAction"));
+		stringBuffer.append(TEXT_61);
+		if (genModel.isFindAction()) {
+			stringBuffer.append(TEXT_66);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.FindAction"));
+			stringBuffer.append(TEXT_67);
+		}
+		if (genModel.isRevertAction()) {
+			stringBuffer.append(TEXT_68);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.RevertAction"));
+			stringBuffer.append(TEXT_61);
+		}
+		if (genModel.isExpandAllAction()) {
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.ExpandAllAction"));
+			stringBuffer.append(TEXT_61);
+		}
+		if (genModel.isCollapseAllAction()) {
+			stringBuffer.append(TEXT_70);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.CollapseAllAction"));
+			stringBuffer.append(TEXT_61);
+		}
+		stringBuffer.append(TEXT_71);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_73);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IToolBarManager"));
+		stringBuffer.append(TEXT_74);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_75);
+		stringBuffer.append(genPackage.getPrefix().toLowerCase(genModel.getLocale()));
+		stringBuffer.append(TEXT_76);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_77);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_75);
+		stringBuffer.append(genPackage.getPrefix().toLowerCase(genModel.getLocale()));
+		stringBuffer.append(TEXT_78);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_79);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_80);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+		stringBuffer.append(TEXT_81);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+		stringBuffer.append(TEXT_82);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_83);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_84);
+		stringBuffer.append(genPackage.getInterfacePackageName());
+		stringBuffer.append(TEXT_85);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(genModel.getNonNLS(2));
+		stringBuffer.append(TEXT_86);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_87);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_88);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_87);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_89);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_87);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_90);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_87);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_91);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_15);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_92);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_93);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_94);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_95);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_96);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_97);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_98);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuListener"));
+			stringBuffer.append(TEXT_99);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_100);
+			}
+			stringBuffer.append(TEXT_101);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+			stringBuffer.append(TEXT_102);
+		} else {
+			stringBuffer.append(TEXT_103);
+		}
+		stringBuffer.append(TEXT_104);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_105);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IEditorPart"));
+		stringBuffer.append(TEXT_106);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.SelectionChangedEvent"));
+		stringBuffer.append(TEXT_107);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_108);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.SelectionChangedEvent"));
+		stringBuffer.append(TEXT_109);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_110);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_111);
+			}
+			stringBuffer.append(TEXT_112);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_113);
+			}
+			stringBuffer.append(TEXT_114);
+			stringBuffer.append(_CollectionOfAnything);
+			stringBuffer.append(TEXT_115);
+			stringBuffer.append(_CollectionOfAnything);
+			stringBuffer.append(TEXT_116);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelection"));
+			stringBuffer.append(TEXT_117);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.IStructuredSelection"));
+			stringBuffer.append(TEXT_118);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.IStructuredSelection"));
+			stringBuffer.append(TEXT_119);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
+			stringBuffer.append(TEXT_120);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.IEditingDomainProvider"));
+			stringBuffer.append(TEXT_121);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_122);
+			}
+			stringBuffer.append(TEXT_123);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_124);
+			}
+			stringBuffer.append(TEXT_125);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_126);
+			}
+			stringBuffer.append(TEXT_127);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_128);
+			}
+			stringBuffer.append(TEXT_129);
+		} else {
+			stringBuffer.append(TEXT_130);
+		}
+		stringBuffer.append(TEXT_131);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_132);
+			stringBuffer.append(_CollectionOfIAction);
+			stringBuffer.append(TEXT_133);
+			stringBuffer.append(_CollectionOfAnything);
+			stringBuffer.append(TEXT_134);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelection"));
+			stringBuffer.append(TEXT_135);
+			stringBuffer.append(_CollectionOfIAction);
+			stringBuffer.append(TEXT_136);
+			stringBuffer.append(_ArrayListOfIAction);
+			stringBuffer.append(TEXT_137);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_138);
+				stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+				stringBuffer.append(TEXT_139);
+			} else {
+				stringBuffer.append(TEXT_138);
+				stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+				stringBuffer.append(TEXT_140);
+			}
+			stringBuffer.append(TEXT_141);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.CreateChildAction"));
+			stringBuffer.append(TEXT_142);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_143);
+			} else {
+				stringBuffer.append(TEXT_144);
+			}
+			stringBuffer.append(TEXT_145);
+			stringBuffer.append(_CollectionOfIAction);
+			stringBuffer.append(TEXT_146);
+			stringBuffer.append(_CollectionOfAnything);
+			stringBuffer.append(TEXT_134);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelection"));
+			stringBuffer.append(TEXT_135);
+			stringBuffer.append(_CollectionOfIAction);
+			stringBuffer.append(TEXT_136);
+			stringBuffer.append(_ArrayListOfIAction);
+			stringBuffer.append(TEXT_137);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_138);
+				stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+				stringBuffer.append(TEXT_139);
+			} else {
+				stringBuffer.append(TEXT_138);
+				stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+				stringBuffer.append(TEXT_140);
+			}
+			stringBuffer.append(TEXT_141);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.action.CreateSiblingAction"));
+			stringBuffer.append(TEXT_142);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_143);
+			} else {
+				stringBuffer.append(TEXT_144);
+			}
+			stringBuffer.append(TEXT_147);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionManager"));
+			stringBuffer.append(TEXT_148);
+			stringBuffer.append(_CollectionOfExtendsIAction);
+			stringBuffer.append(TEXT_149);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_138);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+				stringBuffer.append(TEXT_150);
+			} else {
+				stringBuffer.append(TEXT_138);
+				stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+				stringBuffer.append(TEXT_151);
+			}
+			stringBuffer.append(TEXT_152);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_153);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+				stringBuffer.append(TEXT_154);
+			}
+			stringBuffer.append(TEXT_155);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionManager"));
+			stringBuffer.append(TEXT_148);
+			stringBuffer.append(_CollectionOfExtendsIAction);
+			stringBuffer.append(TEXT_156);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionItem"));
+			stringBuffer.append(TEXT_157);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionItem"));
+			stringBuffer.append(TEXT_158);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.SubContributionItem"));
+			stringBuffer.append(TEXT_159);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.SubContributionItem"));
+			stringBuffer.append(TEXT_160);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.ActionContributionItem"));
+			stringBuffer.append(TEXT_44);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+			stringBuffer.append(TEXT_161);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.ActionContributionItem"));
+			stringBuffer.append(TEXT_162);
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_163);
+				stringBuffer.append(_MapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_164);
+				stringBuffer.append(_CollectionOfIAction);
+				stringBuffer.append(TEXT_165);
+				stringBuffer.append(_MapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_166);
+				stringBuffer.append(_LinkedHashMapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_167);
+				stringBuffer.append(_IteratorOfIAction);
+				stringBuffer.append(TEXT_168);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+				stringBuffer.append(TEXT_169);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IAction"));
+					stringBuffer.append(TEXT_170);
+				}
+				stringBuffer.append(TEXT_171);
+				stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+				stringBuffer.append(TEXT_172);
+				stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+				stringBuffer.append(TEXT_173);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_174);
+				stringBuffer.append(_CollectionOfIAction);
+				stringBuffer.append(TEXT_175);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(_CollectionOfIAction);
+					stringBuffer.append(TEXT_170);
+				}
+				stringBuffer.append(TEXT_176);
+				stringBuffer.append(_ArrayListOfIAction);
+				stringBuffer.append(TEXT_177);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionManager"));
+				stringBuffer.append(TEXT_148);
+				stringBuffer.append(_MapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_178);
+				if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
+					stringBuffer.append(TEXT_138);
+					stringBuffer.append(_MapEntryOfStringToCollectionOfIAction);
+					stringBuffer.append(TEXT_179);
+				} else {
+					stringBuffer.append(TEXT_138);
+					stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+					stringBuffer.append(TEXT_180);
+					stringBuffer.append(_MapEntryOfStringToCollectionOfIAction);
+					stringBuffer.append(TEXT_181);
+					stringBuffer.append(_MapEntryOfStringToCollectionOfIAction);
+					stringBuffer.append(TEXT_182);
+				}
+				stringBuffer.append(TEXT_153);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+				stringBuffer.append(TEXT_82);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+				stringBuffer.append(TEXT_31);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_183);
+				}
+				stringBuffer.append(TEXT_184);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(_CollectionOfIAction);
+					stringBuffer.append(TEXT_170);
+				}
+				stringBuffer.append(TEXT_185);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionManager"));
+				stringBuffer.append(TEXT_148);
+				stringBuffer.append(_MapOfStringToCollectionOfIAction);
+				stringBuffer.append(TEXT_186);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionItem"));
+				stringBuffer.append(TEXT_187);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IContributionItem"));
+				stringBuffer.append(TEXT_188);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+				stringBuffer.append(TEXT_44);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+				stringBuffer.append(TEXT_189);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+				stringBuffer.append(TEXT_190);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(_CollectionOfIAction);
+					stringBuffer.append(TEXT_170);
+				}
+				stringBuffer.append(TEXT_191);
+			}
+		}
+		stringBuffer.append(TEXT_192);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_193);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+		stringBuffer.append(TEXT_194);
+		if (genModel.isCreationCommands()) {
+			stringBuffer.append(TEXT_195);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+			stringBuffer.append(TEXT_196);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_93);
+			stringBuffer.append(genModel.getNonNLS());
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_197);
+			}
+			stringBuffer.append(TEXT_198);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_199);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.MenuManager"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_96);
+			stringBuffer.append(genModel.getNonNLS());
+			if (genModel.isCreationSubmenus()) {
+				stringBuffer.append(TEXT_200);
+			}
+			stringBuffer.append(TEXT_201);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		stringBuffer.append(TEXT_202);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_203);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.IMenuManager"));
+		stringBuffer.append(TEXT_204);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.jface.action.Separator"));
+		stringBuffer.append(TEXT_205);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(genModel.getNonNLS(2));
+		stringBuffer.append(TEXT_206);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_207);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_208);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_209);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genPackage.hasConcreteClasses()
+				&& genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Advisor.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Advisor.java
new file mode 100644
index 0000000..def9d84
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Advisor.java
@@ -0,0 +1,723 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Advisor extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized Advisor create(String lineSeparator) {
+		nl = lineSeparator;
+		Advisor result = new Advisor();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + "import java.io.File;" + NL + "import java.util.Arrays;";
+	protected final String TEXT_5 = NL + "import java.util.Iterator;";
+	protected final String TEXT_6 = NL + "import java.util.List;";
+	protected final String TEXT_7 = NL + NL + "import org.eclipse.equinox.app.IApplication;" + NL
+			+ "import org.eclipse.equinox.app.IApplicationContext;" + NL + "" + NL
+			+ "import org.eclipse.jface.action.GroupMarker;" + NL + "import org.eclipse.jface.action.IAction;" + NL
+			+ "import org.eclipse.jface.action.IMenuManager;" + NL + "import org.eclipse.jface.action.MenuManager;" + NL
+			+ "import org.eclipse.jface.action.Separator;" + NL + "import org.eclipse.jface.dialogs.MessageDialog;" + NL
+			+ "import org.eclipse.jface.window.Window;";
+	protected final String TEXT_8 = NL + "import org.eclipse.swt.SWT;";
+	protected final String TEXT_9 = NL + "import org.eclipse.swt.graphics.Point;" + NL
+			+ "import org.eclipse.swt.widgets.Display;";
+	protected final String TEXT_10 = NL + "import org.eclipse.swt.widgets.FileDialog;" + NL
+			+ "import org.eclipse.swt.widgets.Shell;";
+	protected final String TEXT_11 = NL + "import org.eclipse.ui.IEditorDescriptor;" + NL
+			+ "import org.eclipse.ui.IFolderLayout;" + NL + "import org.eclipse.ui.IPageLayout;" + NL
+			+ "import org.eclipse.ui.IPerspectiveFactory;" + NL + "import org.eclipse.ui.IWorkbench;" + NL
+			+ "import org.eclipse.ui.IWorkbenchActionConstants;" + NL + "import org.eclipse.ui.IWorkbenchPage;" + NL
+			+ "import org.eclipse.ui.IWorkbenchWindow;" + NL + "import org.eclipse.ui.PartInitException;" + NL
+			+ "import org.eclipse.ui.PlatformUI;" + NL + "import org.eclipse.ui.actions.ActionFactory;";
+	protected final String TEXT_12 = NL + "import org.eclipse.ui.actions.ContributionItemFactory;";
+	protected final String TEXT_13 = NL + "import org.eclipse.ui.application.ActionBarAdvisor;" + NL
+			+ "import org.eclipse.ui.application.IActionBarConfigurer;" + NL
+			+ "import org.eclipse.ui.application.IWorkbenchConfigurer;" + NL
+			+ "import org.eclipse.ui.application.IWorkbenchWindowConfigurer;" + NL
+			+ "import org.eclipse.ui.application.WorkbenchAdvisor;" + NL
+			+ "import org.eclipse.ui.application.WorkbenchWindowAdvisor;" + NL + "" + NL
+			+ "import org.eclipse.emf.common.ui.URIEditorInput;" + NL
+			+ "import org.eclipse.emf.common.ui.action.WorkbenchWindowActionDelegate;" + NL
+			+ "import org.eclipse.emf.common.util.URI;";
+	protected final String TEXT_14 = NL + "import org.eclipse.emf.common.util.UniqueEList;";
+	protected final String TEXT_15 = NL + "import org.eclipse.emf.edit.ui.action.LoadResourceAction;" + NL
+			+ "import org.eclipse.emf.edit.ui.util.EditUIUtil;" + NL + "" + NL + "import ";
+	protected final String TEXT_16 = ";";
+	protected final String TEXT_17 = NL + NL + NL + "/**" + NL
+			+ " * Customized {@link WorkbenchAdvisor} for the RCP application." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_18 = NL + " * ";
+	protected final String TEXT_19 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_20 = NL + "@Deprecated";
+	protected final String TEXT_21 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_22 = NL + "public final class ";
+	protected final String TEXT_23 = " extends WorkbenchAdvisor" + NL + "{";
+	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static final String copyright = ";
+	protected final String TEXT_25 = NL;
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * The default file extension filters for use in dialogs."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_27 = NL + "\tprivate static final String[] FILE_EXTENSION_FILTERS = ";
+	protected final String TEXT_28 = "(String[])";
+	protected final String TEXT_29 = ".FILE_EXTENSION_FILTERS.toArray(new String[0]);";
+	protected final String TEXT_30 = NL
+			+ "\tprivate static final String[] FILE_EXTENSION_FILTERS = getFileExtensionFilters();" + NL + "" + NL
+			+ "\t/**" + NL
+			+ "\t * Returns the default file extension filters. This method should only be used to initialize {@link #FILE_EXTENSION_FILTERS}."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprivate static String[] getFileExtensionFilters()" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_31 = " result = new ";
+	protected final String TEXT_32 = "();";
+	protected final String TEXT_33 = NL + "\t\tresult.addAll(";
+	protected final String TEXT_34 = ".FILE_EXTENSION_FILTERS);";
+	protected final String TEXT_35 = NL + "\t\treturn ";
+	protected final String TEXT_36 = "result.toArray(new String[0]);" + NL + "\t}";
+	protected final String TEXT_37 = " ";
+	protected final String TEXT_38 = NL + NL + "\t/**" + NL
+			+ "\t * This looks up a string in the plugin's plugin.properties file." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static String getString(String key)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_39 = ".INSTANCE.getString(key);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This looks up a string in plugin.properties, making a substitution." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static String getString(String key, Object s1)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_40 = ".INSTANCE.getString(key, new Object [] { s1 });" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * RCP's application" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static class Application implements IApplication" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_41 = NL + "\t\t@Override";
+	protected final String TEXT_42 = NL + "\t\tpublic Object start(IApplicationContext context) throws Exception" + NL
+			+ "\t\t{" + NL + "\t\t\tWorkbenchAdvisor workbenchAdvisor = new ";
+	protected final String TEXT_43 = "();" + NL + "\t\t\tDisplay display = PlatformUI.createDisplay();" + NL
+			+ "\t\t\ttry" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tint returnCode = PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);" + NL
+			+ "\t\t\t\tif (returnCode == PlatformUI.RETURN_RESTART)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\treturn IApplication.EXIT_RESTART;" + NL + "\t\t\t\t}" + NL + "\t\t\t\telse" + NL + "\t\t\t\t{"
+			+ NL + "\t\t\t\t\treturn IApplication.EXIT_OK;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\tfinally"
+			+ NL + "\t\t\t{" + NL + "\t\t\t\tdisplay.dispose();" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\t/**" + NL + "\t\t * @see org.eclipse.equinox.app.IApplication#stop()" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_44 = NL + "\t\tpublic void stop()" + NL + "\t\t{" + NL + "\t\t\t// Do nothing." + NL
+			+ "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * RCP's perspective" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static class Perspective implements IPerspectiveFactory" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * Perspective ID" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic static final String ID_PERSPECTIVE = \"";
+	protected final String TEXT_45 = "Perspective\";";
+	protected final String TEXT_46 = NL + NL + "\t\t/**" + NL
+			+ "\t\t * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_47 = NL + "\t\tpublic void createInitialLayout(IPageLayout layout)" + NL + "\t\t{" + NL
+			+ "\t\t\tlayout.setEditorAreaVisible(true);" + NL + "\t\t\tlayout.addPerspectiveShortcut(ID_PERSPECTIVE);"
+			+ NL + "" + NL
+			+ "\t\t\tIFolderLayout right = layout.createFolder(\"right\", IPageLayout.RIGHT, (float)0.66, layout.getEditorArea());";
+	protected final String TEXT_48 = NL + "\t\t\tright.addView(IPageLayout.ID_OUTLINE);" + NL + "" + NL
+			+ "\t\t\tIFolderLayout bottonRight = layout.createFolder(\"bottonRight\", IPageLayout.BOTTOM, (float)0.60, \"right\");";
+	protected final String TEXT_49 = NL + "\t\t\tbottonRight.addView(IPageLayout.ID_PROP_SHEET);" + NL + "\t\t}" + NL
+			+ "\t}" + NL + "\t" + NL + "\t/**" + NL + "\t * RCP's window advisor" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static class WindowAdvisor extends WorkbenchWindowAdvisor" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * @see WorkbenchWindowAdvisor#WorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)"
+			+ NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated"
+			+ NL + "\t\t */" + NL + "\t\tpublic WindowAdvisor(IWorkbenchWindowConfigurer configurer)" + NL + "\t\t{"
+			+ NL + "\t\t\tsuper(configurer);" + NL + "\t\t}" + NL + "\t\t" + NL + "\t\t/**" + NL
+			+ "\t\t * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#preWindowOpen()" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_50 = NL + "\t\tpublic void preWindowOpen()" + NL + "\t\t{" + NL
+			+ "\t\t\tIWorkbenchWindowConfigurer configurer = getWindowConfigurer();" + NL
+			+ "\t\t\tconfigurer.setInitialSize(new Point(600, 450));" + NL + "\t\t\tconfigurer.setShowCoolBar(false);"
+			+ NL + "\t\t\tconfigurer.setShowStatusLine(true);" + NL
+			+ "\t\t\tconfigurer.setTitle(getString(\"_UI_Application_title\"));";
+	protected final String TEXT_51 = NL + "\t\t}" + NL + "\t\t" + NL + "\t\t/**" + NL
+			+ "\t\t * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)"
+			+ NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated"
+			+ NL + "\t\t */";
+	protected final String TEXT_52 = NL
+			+ "\t\tpublic ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)" + NL + "\t\t{" + NL
+			+ "\t\t\treturn new WindowActionBarAdvisor(configurer);" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * RCP's action bar advisor" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static class WindowActionBarAdvisor extends ActionBarAdvisor" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * @see ActionBarAdvisor#ActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic WindowActionBarAdvisor(IActionBarConfigurer configurer)" + NL + "\t\t{" + NL
+			+ "\t\t\tsuper(configurer);" + NL + "\t\t}" + NL + "\t\t" + NL + "\t\t/**" + NL
+			+ "\t\t * @see org.eclipse.ui.application.ActionBarAdvisor#fillMenuBar(org.eclipse.jface.action.IMenuManager)"
+			+ NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated"
+			+ NL + "\t\t */";
+	protected final String TEXT_53 = NL + "\t\tprotected void fillMenuBar(IMenuManager menuBar)" + NL + "\t\t{" + NL
+			+ "\t\t\tIWorkbenchWindow window = getActionBarConfigurer().getWindowConfigurer().getWindow();" + NL
+			+ "\t\t\tmenuBar.add(createFileMenu(window));" + NL + "\t\t\tmenuBar.add(createEditMenu(window));" + NL
+			+ "\t\t\tmenuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));" + NL
+			+ "\t\t\tmenuBar.add(createWindowMenu(window));" + NL
+			+ "\t\t\tmenuBar.add(createHelpMenu(window));\t\t\t\t\t" + NL + "\t\t}" + NL + "\t\t" + NL + "\t\t/**" + NL
+			+ "\t\t * Creates the 'File' menu." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tprotected IMenuManager createFileMenu(IWorkbenchWindow window)" + NL + "\t\t{" + NL
+			+ "\t\t\tIMenuManager menu = new MenuManager(getString(\"_UI_Menu_File_label\"),";
+	protected final String TEXT_54 = NL + "\t\t\tIWorkbenchActionConstants.M_FILE);    " + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));" + NL + "\t" + NL
+			+ "\t\t\tIMenuManager newMenu = new MenuManager(getString(\"_UI_Menu_New_label\"), \"new\");";
+	protected final String TEXT_55 = NL + "\t\t\tnewMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));"
+			+ NL + "\t" + NL + "\t\t\tmenu.add(newMenu);" + NL + "\t\t\tmenu.add(new Separator());" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));" + NL
+			+ "\t\t\tmenu.add(new Separator());" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.CLOSE.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.CLOSE_ALL.create(window));" + NL
+			+ "\t\t\tmenu.add(new Separator());" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.SAVE.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.SAVE_AS.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.SAVE_ALL.create(window));" + NL
+			+ "\t\t\tmenu.add(new Separator());" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.QUIT.create(window));" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));" + NL + "\t\t\treturn menu;" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * Creates the 'Edit' menu." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tprotected IMenuManager createEditMenu(IWorkbenchWindow window)" + NL + "\t\t{" + NL
+			+ "\t\t\tIMenuManager menu = new MenuManager(getString(\"_UI_Menu_Edit_label\"),";
+	protected final String TEXT_56 = NL + "\t\t\tIWorkbenchActionConstants.M_EDIT);" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_START));" + NL + "\t" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.UNDO.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.REDO.create(window));" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.UNDO_EXT));" + NL
+			+ "\t\t\tmenu.add(new Separator());" + NL + "\t" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.CUT.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.COPY.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.PASTE.create(window));" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.CUT_EXT));" + NL
+			+ "\t\t\tmenu.add(new Separator());" + NL + "\t" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.DELETE.create(window));" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.SELECT_ALL.create(window));" + NL
+			+ "\t\t\tmenu.add(new Separator());" + NL + "\t" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.ADD_EXT));" + NL + "\t" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_END));" + NL
+			+ "\t\t\tmenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));" + NL + "\t\t\treturn menu;" + NL
+			+ "\t\t}" + NL + "\t" + NL + "\t\t/**" + NL + "\t\t * Creates the 'Window' menu." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tprotected IMenuManager createWindowMenu(IWorkbenchWindow window)" + NL + "\t\t{"
+			+ NL + "\t\t\tIMenuManager menu = new MenuManager(getString(\"_UI_Menu_Window_label\"),";
+	protected final String TEXT_57 = NL + "\t\t\tIWorkbenchActionConstants.M_WINDOW);" + NL + "\t" + NL
+			+ "\t\t\taddToMenuAndRegister(menu, ActionFactory.OPEN_NEW_WINDOW.create(window));" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));";
+	protected final String TEXT_58 = NL + "\t\t\tmenu.add(ContributionItemFactory.OPEN_WINDOWS.create(window));";
+	protected final String TEXT_59 = NL + "\t" + NL + "\t\t\treturn menu;" + NL + "\t\t}" + NL + "\t" + NL + "\t\t/**"
+			+ NL + "\t\t * Creates the 'Help' menu." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tprotected IMenuManager createHelpMenu(IWorkbenchWindow window)" + NL + "\t\t{" + NL
+			+ "\t\t\tIMenuManager menu = new MenuManager(getString(\"_UI_Menu_Help_label\"), IWorkbenchActionConstants.M_HELP);";
+	protected final String TEXT_60 = NL + "\t\t\t// Welcome or intro page would go here" + NL
+			+ "\t\t\t// Help contents would go here" + NL + "\t\t\t// Tips and tricks page would go here" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.HELP_START));" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.HELP_END));" + NL
+			+ "\t\t\tmenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));" + NL + "\t\t\treturn menu;"
+			+ NL + "\t\t}" + NL + "\t\t" + NL + "\t\t/**" + NL
+			+ "\t\t * Adds the specified action to the given menu and also registers the action with the" + NL
+			+ "\t\t * action bar configurer, in order to activate its key binding." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tprotected void addToMenuAndRegister(IMenuManager menuManager, IAction action)" + NL
+			+ "\t\t{" + NL + "\t\t\tmenuManager.add(action);" + NL
+			+ "\t\t\tgetActionBarConfigurer().registerGlobalAction(action);" + NL + "\t\t}" + NL + "\t}" + NL + "\t"
+			+ NL + "\t/**" + NL + "\t * About action for the RCP application." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static class AboutAction extends WorkbenchWindowActionDelegate" + NL + "\t{" + NL + "\t\t/**"
+			+ NL + "\t\t * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_61 = NL + "\t\tpublic void run(IAction action)" + NL + "\t\t{" + NL
+			+ "\t\t\tMessageDialog.openInformation(getWindow().getShell(), getString(\"_UI_About_title\"),";
+	protected final String TEXT_62 = NL + "\t\t\tgetString(\"_UI_About_text\"));";
+	protected final String TEXT_63 = NL + "\t\t}" + NL + "\t}" + NL + "\t";
+	protected final String TEXT_64 = NL + "\t/**" + NL + "\t * Open action for the objects from the ";
+	protected final String TEXT_65 = " model." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static class OpenAction extends WorkbenchWindowActionDelegate" + NL + "\t{" + NL + "\t\t/**"
+			+ NL + "\t\t * Opens the editors for the files selected using the file dialog." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_66 = NL + "\t\tpublic void run(IAction action)" + NL + "\t\t{" + NL
+			+ "\t\t\tString[] filePaths = openFilePathDialog(getWindow().getShell(), SWT.OPEN, null);" + NL
+			+ "\t\t\tif (filePaths.length > 0)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\topenEditor(getWindow().getWorkbench(), URI.createFileURI(filePaths[0]));" + NL + "\t\t\t}" + NL
+			+ "\t\t}" + NL + "\t}";
+	protected final String TEXT_67 = NL + "\t" + NL + "\t/**" + NL + "\t * Open URI action for the objects from the ";
+	protected final String TEXT_68 = " model." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static class OpenURIAction extends WorkbenchWindowActionDelegate" + NL + "\t{" + NL + "\t\t/**"
+			+ NL + "\t\t * Opens the editors for the files selected using the LoadResourceDialog." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_69 = NL + "\t\tpublic void run(IAction action)" + NL + "\t\t{" + NL
+			+ "\t\t\tLoadResourceAction.LoadResourceDialog loadResourceDialog = new LoadResourceAction.LoadResourceDialog(getWindow().getShell());"
+			+ NL + "\t\t\tif (Window.OK == loadResourceDialog.open())" + NL + "\t\t\t{";
+	protected final String TEXT_70 = NL + "\t\t\t\tfor (URI uri : loadResourceDialog.getURIs())" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\topenEditor(getWindow().getWorkbench(), uri);" + NL + "\t\t\t\t}";
+	protected final String TEXT_71 = NL
+			+ "\t\t\t\tfor (Iterator i = loadResourceDialog.getURIs().iterator(); i.hasNext();)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\topenEditor(getWindow().getWorkbench(), (URI)i.next());" + NL + "\t\t\t\t}";
+	protected final String TEXT_72 = NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t}" + NL + "\t";
+	protected final String TEXT_73 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static String[] openFilePathDialog(Shell shell, int style, String[] fileExtensionFilters)" + NL
+			+ "\t{" + NL
+			+ "\t\treturn openFilePathDialog(shell, style, fileExtensionFilters, (style & SWT.OPEN) != 0, (style & SWT.OPEN) != 0, (style & SWT.SAVE) != 0);"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static String[] openFilePathDialog(Shell shell, int style, String[] fileExtensionFilters, boolean includeGroupFilter, boolean includeAllFilter, boolean addExtension)"
+			+ NL + "\t{" + NL + "\t\tFileDialog fileDialog = new FileDialog(shell, style);" + NL
+			+ "\t\tif (fileExtensionFilters == null)" + NL + "\t\t{" + NL
+			+ "\t\t\tfileExtensionFilters = FILE_EXTENSION_FILTERS;" + NL + "\t\t}" + NL + "\t\t" + NL
+			+ "\t\t// If requested, augment the file extension filters by adding a group of all the other filters (*.ext1;*.ext2;...)"
+			+ NL + "\t\t// at the beginning and/or an all files wildcard (*.*) at the end." + NL + "\t\t//" + NL
+			+ "\t\tincludeGroupFilter &= fileExtensionFilters.length > 1;" + NL
+			+ "\t\tint offset = includeGroupFilter ? 1 : 0;" + NL + "\t\t" + NL
+			+ "\t\tif (includeGroupFilter || includeAllFilter)" + NL + "\t\t{" + NL
+			+ "\t\t\tint size = fileExtensionFilters.length + offset + (includeAllFilter ? 1 : 0);" + NL
+			+ "\t\t\tString[] allFilters = new String[size];" + NL + "\t\t\t";
+	protected final String TEXT_74 = " group = includeGroupFilter ? new ";
+	protected final String TEXT_75 = "() : null;" + NL + "\t\t\t" + NL
+			+ "\t\t\tfor (int i = 0; i < fileExtensionFilters.length; i++)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tif (includeGroupFilter)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tif (i != 0)" + NL + "\t\t\t\t\t{"
+			+ NL + "\t\t\t\t\t\tgroup.append(';');" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\tgroup.append(fileExtensionFilters[i]);" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tallFilters[i + offset] = fileExtensionFilters[i];" + NL + "\t\t\t}" + NL + "\t\t\t" + NL
+			+ "\t\t\tif (includeGroupFilter)" + NL + "\t\t\t{" + NL + "\t\t\t\tallFilters[0] = group.toString();" + NL
+			+ "\t\t\t}" + NL + "\t\t\tif (includeAllFilter)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tallFilters[allFilters.length - 1] = \"*.*\";";
+	protected final String TEXT_76 = NL + "\t\t\t}" + NL + "\t\t\t" + NL
+			+ "\t\t\tfileDialog.setFilterExtensions(allFilters);" + NL + "\t\t}" + NL + "\t\telse" + NL + "\t\t{" + NL
+			+ "\t\t\tfileDialog.setFilterExtensions(fileExtensionFilters);" + NL + "\t\t}" + NL
+			+ "\t\tfileDialog.open();" + NL + "\t\t" + NL + "\t\tString[] filenames = fileDialog.getFileNames();" + NL
+			+ "\t\tString[] result = new String[filenames.length];" + NL
+			+ "\t\tString path = fileDialog.getFilterPath() + File.separator;" + NL + "\t\tString extension = null;"
+			+ NL + "\t\t" + NL
+			+ "\t\t// If extension adding requested, get the dotted extension corresponding to the selected filter."
+			+ NL + "\t\t//" + NL + "\t\tif (addExtension)" + NL + "\t\t{" + NL
+			+ "\t\t\tint i = fileDialog.getFilterIndex();" + NL
+			+ "\t\t\tif (i != -1 && (!includeAllFilter || i != fileExtensionFilters.length))" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\ti = includeGroupFilter && i == 0 ? 0 : i - offset;" + NL
+			+ "\t\t\t\tString filter = fileExtensionFilters[i];" + NL + "\t\t\t\tint dot = filter.lastIndexOf('.');"
+			+ NL + "\t\t\t\tif (dot == 1 && filter.charAt(0) == '*')" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\textension = filter.substring(dot);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL
+			+ "\t\t" + NL
+			+ "\t\t// Build the result by adding the selected path and, if needed, auto-appending the extension." + NL
+			+ "\t\t//" + NL + "\t\tfor (int i = 0; i < filenames.length; i++)" + NL + "\t\t{" + NL
+			+ "\t\t\tString filename = path + filenames[i];" + NL + "\t\t\tif (extension != null)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tint dot = filename.lastIndexOf('.');" + NL
+			+ "\t\t\t\tif (dot == -1 || !Arrays.asList(fileExtensionFilters).contains(\"*\" + filename.substring(dot)))";
+	protected final String TEXT_77 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tfilename += extension;" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t}" + NL + "\t\t\tresult[i] = filename;" + NL + "\t\t}" + NL + "\t\treturn result;" + NL + "\t}";
+	protected final String TEXT_78 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static boolean openEditor(IWorkbench workbench, URI uri)" + NL + "\t{" + NL
+			+ "\t\tIWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();" + NL
+			+ "\t\tIWorkbenchPage page = workbenchWindow.getActivePage();" + NL + "\t\t" + NL
+			+ "\t\tIEditorDescriptor editorDescriptor = EditUIUtil.getDefaultEditor(uri, null);" + NL
+			+ "\t\tif (editorDescriptor == null)" + NL + "\t\t{" + NL + "\t\t\tMessageDialog.openError(" + NL
+			+ "\t\t\t\tworkbenchWindow.getShell()," + NL + "\t\t\t\tgetString(\"_UI_Error_title\"),";
+	protected final String TEXT_79 = NL + "\t\t\t\tgetString(\"_WARN_No_Editor\", uri.lastSegment()));";
+	protected final String TEXT_80 = NL + "\t\t\treturn false;" + NL + "\t\t}" + NL + "\t\telse" + NL + "\t\t{" + NL
+			+ "\t\t\ttry" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tpage.openEditor(new URIEditorInput(uri), editorDescriptor.getId());" + NL + "\t\t\t}" + NL
+			+ "\t\t\tcatch (PartInitException exception)" + NL + "\t\t\t{" + NL + "\t\t\t\tMessageDialog.openError("
+			+ NL + "\t\t\t\t\tworkbenchWindow.getShell()," + NL + "\t\t\t\t\tgetString(\"_UI_OpenEditorError_label\"),";
+	protected final String TEXT_81 = NL + "\t\t\t\t\texception.getMessage());" + NL + "\t\t\t\treturn false;" + NL
+			+ "\t\t\t}" + NL + "\t\t}" + NL + "\t\treturn true;" + NL + "\t}" + NL + "\t" + NL + "\t/**" + NL
+			+ "\t * @see org.eclipse.ui.application.WorkbenchAdvisor#getInitialWindowPerspectiveId()" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_82 = NL + "\tpublic String getInitialWindowPerspectiveId()" + NL + "\t{" + NL
+			+ "\t\treturn Perspective.ID_PERSPECTIVE;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize(org.eclipse.ui.application.IWorkbenchConfigurer)"
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_83 = NL + "\tpublic void initialize(IWorkbenchConfigurer configurer)" + NL + "\t{" + NL
+			+ "\t\tsuper.initialize(configurer);" + NL + "\t\tconfigurer.setSaveAndRestore(true);" + NL + "\t}" + NL
+			+ "\t" + NL + "\t/**" + NL
+			+ "\t * @see org.eclipse.ui.application.WorkbenchAdvisor#createWorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)"
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_84 = NL
+			+ "\tpublic WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)" + NL
+			+ "\t{" + NL + "\t\treturn new WindowAdvisor(configurer);" + NL + "\t}" + NL + "}";
+	protected final String TEXT_85 = NL;
+
+	public Advisor() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_85);
+		stringBuffer.append(TEXT_85);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getEditorPluginDirectory();
+		packageName = genModel.getEditorPluginPackageName();
+		className = genModel.getEditorAdvisorClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2004-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		String _ListOfString = "List" + (genModel.useGenerics() ? "<String>" : "");
+		String _UniqueEListOfString = "UniqueEList" + (genModel.useGenerics() ? "<String>" : "");
+		String _StringBuilder = genModel
+				.getImportedName(genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer");
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditorPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_4);
+		}
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_5);
+		}
+		if (genModel.getAllGenPackagesWithConcreteClasses().size() > 1) {
+			stringBuffer.append(TEXT_6);
+		}
+		stringBuffer.append(TEXT_7);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_10);
+		}
+		stringBuffer.append(TEXT_11);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_12);
+		}
+		stringBuffer.append(TEXT_13);
+		if (genModel.getAllGenPackagesWithConcreteClasses().size() > 1) {
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genModel.getQualifiedEditorPluginClassName());
+		stringBuffer.append(TEXT_16);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_17);
+		if (genModel.hasAPITags()) {
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_19);
+		if (isJDK50 && genModel.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_20);
+		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genModel.getAllGenPackagesWithConcreteClasses())) {
+			stringBuffer.append(TEXT_21);
+		}
+		stringBuffer.append(TEXT_22);
+		stringBuffer.append(genModel.getEditorAdvisorClassName());
+		stringBuffer.append(TEXT_23);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_25);
+		}
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_26);
+			if (genModel.getAllGenPackagesWithConcreteClasses().size() == 1) {
+				stringBuffer.append(TEXT_27);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_28);
+				}
+				stringBuffer
+						.append(genModel.getAllGenPackagesWithConcreteClasses().get(0).getImportedEditorClassName());
+				stringBuffer.append(TEXT_29);
+			} else {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(_ListOfString);
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(_UniqueEListOfString);
+				stringBuffer.append(TEXT_32);
+				for (GenPackage genPackage : genModel.getAllGenPackagesWithConcreteClasses()) {
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genPackage.getImportedEditorClassName());
+					stringBuffer.append(TEXT_34);
+				}
+				stringBuffer.append(TEXT_35);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_28);
+				}
+				stringBuffer.append(TEXT_36);
+			}
+			stringBuffer.append(TEXT_37);
+		}
+		stringBuffer.append(TEXT_38);
+		stringBuffer.append(genModel.getEditorPluginClassName());
+		stringBuffer.append(TEXT_39);
+		stringBuffer.append(genModel.getQualifiedEditorPluginClassName());
+		stringBuffer.append(TEXT_40);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_42);
+		stringBuffer.append(genModel.getEditorAdvisorClassName());
+		stringBuffer.append(TEXT_43);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_44);
+		stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+		stringBuffer.append(TEXT_45);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_46);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_47);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_48);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(genModel.getNonNLS(2));
+		stringBuffer.append(TEXT_49);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_50);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_51);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_52);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_53);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_54);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(genModel.getNonNLS(2));
+		stringBuffer.append(TEXT_55);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_56);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_57);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_58);
+		}
+		stringBuffer.append(TEXT_59);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_60);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_61);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_62);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_63);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_64);
+			stringBuffer.append(genModel.getModelName());
+			stringBuffer.append(TEXT_65);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_41);
+			}
+			stringBuffer.append(TEXT_66);
+		}
+		stringBuffer.append(TEXT_67);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_68);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_69);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_70);
+		} else {
+			stringBuffer.append(TEXT_71);
+		}
+		stringBuffer.append(TEXT_72);
+		if (!genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(_StringBuilder);
+			stringBuffer.append(TEXT_74);
+			stringBuffer.append(_StringBuilder);
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_77);
+		}
+		stringBuffer.append(TEXT_78);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_79);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_80);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_81);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_82);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_83);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_84);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_25);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.isRichClientPlatform());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/AppEngineWebXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/AppEngineWebXML.java
new file mode 100644
index 0000000..ab0a32e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/AppEngineWebXML.java
@@ -0,0 +1,187 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class AppEngineWebXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized AppEngineWebXML create(String lineSeparator) {
+		nl = lineSeparator;
+		AppEngineWebXML result = new AppEngineWebXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "<appengine-web-app xmlns=\"http://appengine.google.com/ns/1.0\">" + NL
+			+ "\t<application>";
+	protected final String TEXT_4 = "-editor</application>" + NL + "\t<version>1</version>" + NL
+			+ "\t<threadsafe>true</threadsafe>" + NL + "</appengine-web-app>" + NL;
+	protected final String TEXT_5 = NL;
+
+	public AppEngineWebXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_5);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/war/WEB-INF/appengine-web.xml";
+		overwrite = false;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getModelName().toLowerCase().replaceAll("\\s", "-"));
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/BuildProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/BuildProperties.java
new file mode 100644
index 0000000..61566a4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/BuildProperties.java
@@ -0,0 +1,240 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class BuildProperties extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "bin.includes = ";
+	protected final String TEXT_3 = ",\\" + NL + "               icons/,\\";
+	protected final String TEXT_4 = NL + "               META-INF/,\\";
+	protected final String TEXT_5 = NL + "               plugin.xml,\\";
+	protected final String TEXT_6 = NL + "               ";
+	protected final String TEXT_7 = ".properties";
+	protected final String TEXT_8 = NL + "jars.compile.order = ";
+	protected final String TEXT_9 = NL + "source.";
+	protected final String TEXT_10 = " = ";
+	protected final String TEXT_11 = NL + "output.";
+	protected final String TEXT_12 = "bin";
+	protected final String TEXT_13 = "war/WEB-INF/classes";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL;
+
+	public BuildProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(TEXT_15);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/build.properties";
+		overwrite = genModel.isUpdateClasspath()
+				&& !new CodegenGeneratorAdapter(parameter).exists(new CodegenGeneratorAdapter(parameter)
+						.toURI(genModel.getEditorProjectDirectory()).appendSegment("plugin.xml"));
+		encoding = "ISO-8859-1";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2008 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getEditorPluginID() + ".jar" : ".";
+		List<String> sourceFolders = genModel.getEditorSourceFolders();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_3);
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_4);
+		}
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_5);
+		}
+		String editorBundleLocalization = genModel.getEditorBundleLocalization();
+		int index = editorBundleLocalization.indexOf("/");
+		if (index == -1) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(editorBundleLocalization);
+			stringBuffer.append(TEXT_7);
+		} else {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(editorBundleLocalization.substring(0, index + 1));
+		}
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(pluginClassesLocation);
+		boolean first = true;
+		for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) {
+			String sourceFolder = i.next();
+			if (i.hasNext()) {
+				sourceFolder += ",\\";
+			}
+			if (first) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(pluginClassesLocation);
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(sourceFolder);
+				first = false;
+			} else {
+				stringBuffer.append(sourceFolder);
+			}
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_10);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_12);
+		} else {
+			stringBuffer.append(TEXT_13);
+		}
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Editor.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Editor.java
new file mode 100644
index 0000000..fced2b3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Editor.java
@@ -0,0 +1,2713 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Editor extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized Editor create(String lineSeparator) {
+		nl = lineSeparator;
+		Editor result = new Editor();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL + "" + NL + "" + NL + "import java.io.IOException;" + NL
+			+ "import java.io.InputStream;" + NL + "" + NL + "import java.util.ArrayList;" + NL
+			+ "import java.util.Collection;" + NL + "import java.util.Collections;" + NL
+			+ "import java.util.EventObject;" + NL + "import java.util.HashMap;" + NL + "import java.util.Iterator;"
+			+ NL + "import java.util.LinkedHashMap;" + NL + "import java.util.List;" + NL + "import java.util.Map;";
+	protected final String TEXT_4 = NL + NL + "import org.eclipse.core.resources.IFile;" + NL
+			+ "import org.eclipse.core.resources.IMarker;" + NL + "import org.eclipse.core.resources.IResource;" + NL
+			+ "import org.eclipse.core.resources.IResourceChangeEvent;" + NL
+			+ "import org.eclipse.core.resources.IResourceChangeListener;" + NL
+			+ "import org.eclipse.core.resources.IResourceDelta;" + NL
+			+ "import org.eclipse.core.resources.IResourceDeltaVisitor;" + NL
+			+ "import org.eclipse.core.resources.ResourcesPlugin;";
+	protected final String TEXT_5 = NL;
+	protected final String TEXT_6 = NL + "import org.eclipse.core.runtime.CoreException;" + NL
+			+ "import org.eclipse.core.runtime.IPath;";
+	protected final String TEXT_7 = NL + "import org.eclipse.core.runtime.IProgressMonitor;" + NL
+			+ "import org.eclipse.core.runtime.NullProgressMonitor;" + NL + "" + NL
+			+ "import org.eclipse.jface.action.IMenuListener;" + NL + "import org.eclipse.jface.action.IMenuManager;"
+			+ NL + "import org.eclipse.jface.action.IStatusLineManager;" + NL
+			+ "import org.eclipse.jface.action.IToolBarManager;" + NL + "import org.eclipse.jface.action.MenuManager;"
+			+ NL + "import org.eclipse.jface.action.Separator;" + NL + "" + NL
+			+ "import org.eclipse.jface.dialogs.MessageDialog;" + NL
+			+ "import org.eclipse.jface.dialogs.ProgressMonitorDialog;" + NL;
+	protected final String TEXT_8 = NL + "import org.eclipse.jface.util.LocalSelectionTransfer;" + NL;
+	protected final String TEXT_9 = NL + "import org.eclipse.jface.viewers.ColumnWeightData;";
+	protected final String TEXT_10 = NL + "import org.eclipse.jface.viewers.ISelection;" + NL
+			+ "import org.eclipse.jface.viewers.ISelectionChangedListener;" + NL
+			+ "import org.eclipse.jface.viewers.ISelectionProvider;" + NL
+			+ "import org.eclipse.jface.viewers.IStructuredSelection;";
+	protected final String TEXT_11 = NL + "import org.eclipse.jface.viewers.ListViewer;";
+	protected final String TEXT_12 = NL + "import org.eclipse.jface.viewers.SelectionChangedEvent;" + NL
+			+ "import org.eclipse.jface.viewers.StructuredSelection;" + NL
+			+ "import org.eclipse.jface.viewers.StructuredViewer;";
+	protected final String TEXT_13 = NL + "import org.eclipse.jface.viewers.TableLayout;" + NL
+			+ "import org.eclipse.jface.viewers.TableViewer;";
+	protected final String TEXT_14 = NL + "import org.eclipse.jface.viewers.TreeViewer;" + NL
+			+ "import org.eclipse.jface.viewers.Viewer;" + NL + "" + NL + "import org.eclipse.swt.SWT;" + NL + "" + NL
+			+ "import org.eclipse.swt.custom.CTabFolder;" + NL + "" + NL + "import org.eclipse.swt.dnd.DND;";
+	protected final String TEXT_15 = NL + "import org.eclipse.swt.dnd.FileTransfer;";
+	protected final String TEXT_16 = NL + "import org.eclipse.swt.dnd.Transfer;" + NL + "" + NL
+			+ "import org.eclipse.swt.events.ControlAdapter;" + NL + "import org.eclipse.swt.events.ControlEvent;" + NL
+			+ "" + NL + "import org.eclipse.swt.graphics.Point;" + NL + "import org.eclipse.swt.graphics.Rectangle;";
+	protected final String TEXT_17 = NL + NL + "import org.eclipse.swt.layout.FillLayout;";
+	protected final String TEXT_18 = NL + NL + "import org.eclipse.swt.widgets.Composite;" + NL
+			+ "import org.eclipse.swt.widgets.Menu;";
+	protected final String TEXT_19 = NL + "import org.eclipse.swt.widgets.Table;" + NL
+			+ "import org.eclipse.swt.widgets.TableColumn;";
+	protected final String TEXT_20 = NL + "import org.eclipse.swt.widgets.Tree;";
+	protected final String TEXT_21 = NL + "import org.eclipse.swt.widgets.TreeColumn;";
+	protected final String TEXT_22 = NL + NL + "import org.eclipse.ui.IActionBars;" + NL
+			+ "import org.eclipse.ui.IEditorInput;" + NL + "import org.eclipse.ui.IEditorPart;" + NL
+			+ "import org.eclipse.ui.IEditorSite;";
+	protected final String TEXT_23 = NL + "import org.eclipse.ui.IFileEditorInput;";
+	protected final String TEXT_24 = NL + "import org.eclipse.ui.IPartListener;" + NL
+			+ "import org.eclipse.ui.IWorkbenchPart;" + NL + "import org.eclipse.ui.PartInitException;";
+	protected final String TEXT_25 = NL + NL + "import org.eclipse.ui.dialogs.SaveAsDialog;" + NL + "" + NL
+			+ "import org.eclipse.ui.ide.IGotoMarker;";
+	protected final String TEXT_26 = NL + "import org.eclipse.ui.part.FileEditorInput;";
+	protected final String TEXT_27 = NL + "import org.eclipse.ui.part.MultiPageEditorPart;" + NL + "" + NL
+			+ "import org.eclipse.ui.views.contentoutline.ContentOutline;" + NL
+			+ "import org.eclipse.ui.views.contentoutline.ContentOutlinePage;" + NL
+			+ "import org.eclipse.ui.views.contentoutline.IContentOutlinePage;" + NL + "" + NL
+			+ "import org.eclipse.ui.views.properties.IPropertySheetPage;" + NL
+			+ "import org.eclipse.ui.views.properties.PropertySheet;" + NL
+			+ "import org.eclipse.ui.views.properties.PropertySheetPage;" + NL + "" + NL
+			+ "import org.eclipse.emf.common.command.BasicCommandStack;" + NL
+			+ "import org.eclipse.emf.common.command.Command;" + NL
+			+ "import org.eclipse.emf.common.command.CommandStack;" + NL
+			+ "import org.eclipse.emf.common.command.CommandStackListener;" + NL + "" + NL
+			+ "import org.eclipse.emf.common.notify.AdapterFactory;" + NL
+			+ "import org.eclipse.emf.common.notify.Notification;" + NL;
+	protected final String TEXT_28 = NL + "import org.eclipse.emf.common.ui.MarkerHelper;";
+	protected final String TEXT_29 = NL + "import org.eclipse.emf.common.ui.ViewerPane;";
+	protected final String TEXT_30 = NL + NL + "import org.eclipse.emf.common.ui.editor.ProblemEditorPart;" + NL + ""
+			+ NL + "import org.eclipse.emf.common.ui.viewer.IViewerProvider;" + NL + "" + NL
+			+ "import org.eclipse.emf.common.util.BasicDiagnostic;" + NL
+			+ "import org.eclipse.emf.common.util.Diagnostic;" + NL + "import org.eclipse.emf.common.util.URI;" + NL;
+	protected final String TEXT_31 = NL + "import org.eclipse.emf.ecore.EObject;" + NL
+			+ "import org.eclipse.emf.ecore.EValidator;";
+	protected final String TEXT_32 = NL + NL + "import org.eclipse.emf.ecore.resource.Resource;" + NL
+			+ "import org.eclipse.emf.ecore.resource.ResourceSet;" + NL + "" + NL
+			+ "import org.eclipse.emf.ecore.util.EContentAdapter;" + NL + "import org.eclipse.emf.ecore.util.EcoreUtil;"
+			+ NL + "" + NL + "import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;" + NL
+			+ "import org.eclipse.emf.edit.domain.EditingDomain;" + NL
+			+ "import org.eclipse.emf.edit.domain.IEditingDomainProvider;" + NL + "" + NL
+			+ "import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;" + NL
+			+ "import org.eclipse.emf.edit.provider.ComposedAdapterFactory;" + NL
+			+ "import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;" + NL + "" + NL
+			+ "import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;" + NL + "" + NL
+			+ "import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;" + NL + "" + NL
+			+ "import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;" + NL + "" + NL
+			+ "import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;" + NL
+			+ "import org.eclipse.emf.edit.ui.dnd.LocalTransfer;" + NL
+			+ "import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;" + NL + "" + NL
+			+ "import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;" + NL
+			+ "import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;";
+	protected final String TEXT_33 = NL + "import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;";
+	protected final String TEXT_34 = NL + NL + "import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;";
+	protected final String TEXT_35 = NL + "import org.eclipse.emf.edit.ui.util.EditUIUtil;";
+	protected final String TEXT_36 = NL + NL + "import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;" + NL
+			+ "" + NL + "import ";
+	protected final String TEXT_37 = ";" + NL;
+	protected final String TEXT_38 = NL + NL + NL + "/**" + NL + " * This is an example of a ";
+	protected final String TEXT_39 = " model editor." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_40 = NL + " * ";
+	protected final String TEXT_41 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_42 = NL + "@Deprecated";
+	protected final String TEXT_43 = NL + "public class ";
+	protected final String TEXT_44 = NL + "\textends MultiPageEditorPart" + NL
+			+ "\timplements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider";
+	protected final String TEXT_45 = ", IGotoMarker";
+	protected final String TEXT_46 = ", ";
+	protected final String TEXT_47 = NL + "{";
+	protected final String TEXT_48 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_49 = " copyright = ";
+	protected final String TEXT_50 = ";";
+	protected final String TEXT_51 = NL + "\t/**" + NL + "\t * The filters for file extensions supported by the editor."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_52 = NL + "\tpublic static final ";
+	protected final String TEXT_53 = " FILE_EXTENSION_FILTERS = prefixExtensions(";
+	protected final String TEXT_54 = ".FILE_EXTENSIONS, \"*.\");";
+	protected final String TEXT_55 = NL + "\t";
+	protected final String TEXT_56 = ".asList(";
+	protected final String TEXT_57 = ".INSTANCE.getString(\"_UI_";
+	protected final String TEXT_58 = "FilenameExtensions\").split(\"\\\\s*,\\\\s*\")), \"*.\");";
+	protected final String TEXT_59 = NL + "\t/**" + NL
+			+ "\t * Returns a new unmodifiable list containing prefixed versions of the extensions in the given list."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprivate static ";
+	protected final String TEXT_60 = " prefixExtensions(";
+	protected final String TEXT_61 = " extensions, String prefix)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_62 = " result = new ";
+	protected final String TEXT_63 = "();";
+	protected final String TEXT_64 = NL + "\t\tfor (String extension : extensions)" + NL + "\t\t{" + NL
+			+ "\t\t\tresult.add(prefix + extension);";
+	protected final String TEXT_65 = NL + "\t\tfor (Iterator iterator = extensions.iterator() ; iterator.hasNext(); )"
+			+ NL + "\t\t{" + NL + "\t\t\tresult.add(prefix + (String)iterator.next());";
+	protected final String TEXT_66 = NL + "\t\t}" + NL + "\t\treturn Collections.unmodifiableList(result);" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_67 = NL + "\t/**" + NL
+			+ "\t * This keeps track of the editing domain that is used to track all changes to the model." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected AdapterFactoryEditingDomain editingDomain;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is the one adapter factory used for providing views of the model." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ComposedAdapterFactory adapterFactory;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is the content outline page." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected IContentOutlinePage contentOutlinePage;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is a kludge..." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tprotected IStatusLineManager contentOutlineStatusLineManager;"
+			+ NL + "" + NL + "\t/**" + NL + "\t * This is the content outline page's viewer." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected TreeViewer contentOutlineViewer;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is the property sheet page." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_68 = " propertySheetPages = new ";
+	protected final String TEXT_69 = "();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is the viewer that shadows the selection in the content outline." + NL
+			+ "\t * The parent relation must be correctly defined for this to work." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected TreeViewer selectionViewer;";
+	protected final String TEXT_70 = NL + NL + "\t/**" + NL
+			+ "\t * This inverts the roll of parent and child in the content provider and show parents as a tree." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected TreeViewer parentViewer;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This shows how a tree view works." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected TreeViewer treeViewer;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This shows how a list view works." + NL + "\t * A list viewer doesn't support icons." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ListViewer listViewer;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This shows how a table view works." + NL + "\t * A table can be used as a list with icons." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected TableViewer tableViewer;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This shows how a tree view with columns works." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected TreeViewer treeViewerWithColumns;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This keeps track of the active viewer pane, in the book." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected ViewerPane currentViewerPane;";
+	protected final String TEXT_71 = NL + NL + "\t/**" + NL
+			+ "\t * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content outline viewer."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected Viewer currentViewer;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This listens to which ever viewer is active." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected ISelectionChangedListener selectionChangedListener;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to this editor."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected ";
+	protected final String TEXT_72 = " selectionChangedListeners = new ";
+	protected final String TEXT_73 = "();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This keeps track of the selection of the editor as a whole." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected ISelection editorSelection = StructuredSelection.EMPTY;" + NL;
+	protected final String TEXT_74 = NL + "\t/**" + NL
+			+ "\t * The MarkerHelper is responsible for creating workspace resource markers presented" + NL
+			+ "\t * in Eclipse's Problems View." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected MarkerHelper markerHelper = new EditUIMarkerHelper();" + NL;
+	protected final String TEXT_75 = NL + "\t/**" + NL + "\t * This listens for when the outline becomes active" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected IPartListener partListener =" + NL + "\t\tnew IPartListener()" + NL + "\t\t{";
+	protected final String TEXT_76 = NL + "\t\t\t@Override";
+	protected final String TEXT_77 = NL + "\t\t\tpublic void partActivated(IWorkbenchPart p)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tif (p instanceof ContentOutline)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tif (((ContentOutline)p).getCurrentPage() == contentOutlinePage)" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tgetActionBarContributor().setActiveEditor(";
+	protected final String TEXT_78 = ".this);" + NL + "" + NL + "\t\t\t\t\t\tsetCurrentViewer(contentOutlineViewer);"
+			+ NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t\telse if (p instanceof PropertySheet)" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tif (propertySheetPages.contains(((PropertySheet)p).getCurrentPage()))" + NL
+			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tgetActionBarContributor().setActiveEditor(";
+	protected final String TEXT_79 = ".this);" + NL + "\t\t\t\t\t\thandleActivate();" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t}" + NL + "\t\t\t\telse if (p == ";
+	protected final String TEXT_80 = ".this)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\thandleActivate();" + NL + "\t\t\t\t}"
+			+ NL + "\t\t\t}";
+	protected final String TEXT_81 = NL + "\t\t\tpublic void partBroughtToTop(IWorkbenchPart p)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Ignore." + NL + "\t\t\t}";
+	protected final String TEXT_82 = NL + "\t\t\tpublic void partClosed(IWorkbenchPart p)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Ignore." + NL + "\t\t\t}";
+	protected final String TEXT_83 = NL + "\t\t\tpublic void partDeactivated(IWorkbenchPart p)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Ignore." + NL + "\t\t\t}";
+	protected final String TEXT_84 = NL + "\t\t\tpublic void partOpened(IWorkbenchPart p)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Ignore." + NL + "\t\t\t}" + NL + "\t\t};" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Resources that have been removed since last activation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_85 = " removedResources = new ";
+	protected final String TEXT_86 = "();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Resources that have been changed since last activation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_87 = " changedResources = new ";
+	protected final String TEXT_88 = "();" + NL + "" + NL + "\t/**" + NL + "\t * Resources that have been saved." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_89 = " savedResources = new ";
+	protected final String TEXT_90 = "();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Map to store the diagnostic associated with a resource." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_91 = " resourceToDiagnosticMap = new ";
+	protected final String TEXT_92 = "();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Controls whether the problem indication should be updated." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected boolean updateProblemIndication = true;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Adapter used to update the problem indication when resources are demanded loaded." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected EContentAdapter problemIndicationAdapter =" + NL + "\t\tnew EContentAdapter()" + NL
+			+ "\t\t{" + NL + "\t\t\tprotected boolean dispatching;" + NL;
+	protected final String TEXT_93 = NL + "\t\t\tpublic void notifyChanged(Notification notification)" + NL + "\t\t\t{"
+			+ NL + "\t\t\t\tif (notification.getNotifier() instanceof Resource)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tswitch (notification.getFeatureID(Resource.class))" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tcase Resource.RESOURCE__IS_LOADED:" + NL + "\t\t\t\t\t\tcase Resource.RESOURCE__ERRORS:" + NL
+			+ "\t\t\t\t\t\tcase Resource.RESOURCE__WARNINGS:" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tResource resource = (Resource)notification.getNotifier();" + NL
+			+ "\t\t\t\t\t\t\tDiagnostic diagnostic = analyzeResourceProblems(resource, null);" + NL
+			+ "\t\t\t\t\t\t\tif (diagnostic.getSeverity() != Diagnostic.OK)" + NL + "\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\tresourceToDiagnosticMap.put(resource, diagnostic);" + NL + "\t\t\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\t\t\telse" + NL + "\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\tresourceToDiagnosticMap.remove(resource);" + NL + "\t\t\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\t\t\tdispatchUpdateProblemIndication();" + NL + "\t\t\t\t\t\t\tbreak;" + NL + "\t\t\t\t\t\t}";
+	protected final String TEXT_94 = NL + "\t\t\t\t\t\tdefault:" + NL + "\t\t\t\t\t\t\tbreak;";
+	protected final String TEXT_95 = NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t\telse" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tsuper.notifyChanged(notification);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\tprotected void dispatchUpdateProblemIndication()" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tif (updateProblemIndication && !dispatching)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tdispatching = true;" + NL + "\t\t\t\t\tgetSite().getShell().getDisplay().asyncExec" + NL
+			+ "\t\t\t\t\t\t(new Runnable()" + NL + "\t\t\t\t\t\t {";
+	protected final String TEXT_96 = NL + "\t\t\t\t\t\t\t @Override";
+	protected final String TEXT_97 = NL + "\t\t\t\t\t\t\t public void run()" + NL + "\t\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t\t dispatching = false;" + NL + "\t\t\t\t\t\t\t\t updateProblemIndication();" + NL
+			+ "\t\t\t\t\t\t\t }" + NL + "\t\t\t\t\t\t });" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL;
+	protected final String TEXT_98 = NL + "\t\t\tprotected void setTarget(Resource target)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tbasicSetTarget(target);" + NL + "\t\t\t}" + NL;
+	protected final String TEXT_99 = NL + "\t\t\tprotected void unsetTarget(Resource target)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tbasicUnsetTarget(target);" + NL + "\t\t\t\tresourceToDiagnosticMap.remove(target);" + NL
+			+ "\t\t\t\tdispatchUpdateProblemIndication();" + NL + "\t\t\t}" + NL + "\t\t};";
+	protected final String TEXT_100 = NL + NL + "\t/**" + NL + "\t * This listens for workspace changes." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected IResourceChangeListener resourceChangeListener =" + NL
+			+ "\t\tnew IResourceChangeListener()" + NL + "\t\t{";
+	protected final String TEXT_101 = NL + "\t\t\tpublic void resourceChanged(IResourceChangeEvent event)" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tIResourceDelta delta = event.getDelta();" + NL + "\t\t\t\ttry" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tclass ResourceDeltaVisitor implements IResourceDeltaVisitor" + NL
+			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tprotected ResourceSet resourceSet = editingDomain.getResourceSet();"
+			+ NL + "\t\t\t\t\t\tprotected ";
+	protected final String TEXT_102 = "();" + NL + "\t\t\t\t\t\tprotected ";
+	protected final String TEXT_103 = "();" + NL;
+	protected final String TEXT_104 = NL + "\t\t\t\t\t\t@Override";
+	protected final String TEXT_105 = NL + "\t\t\t\t\t\tpublic boolean visit(";
+	protected final String TEXT_106 = "final ";
+	protected final String TEXT_107 = "IResourceDelta delta)" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tif (delta.getResource().getType() == IResource.FILE)" + NL + "\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\tif (delta.getKind() == IResourceDelta.REMOVED ||" + NL
+			+ "\t\t\t\t\t\t\t\t    delta.getKind() == IResourceDelta.CHANGED";
+	protected final String TEXT_108 = " && delta.getFlags() != IResourceDelta.MARKERS";
+	protected final String TEXT_109 = ")" + NL + "\t\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\t\t";
+	protected final String TEXT_110 = "Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);"
+			+ NL + "\t\t\t\t\t\t\t\t\tif (resource != null)" + NL + "\t\t\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\t\t\tif (delta.getKind() == IResourceDelta.REMOVED)" + NL + "\t\t\t\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\tremovedResources.add(resource);" + NL + "\t\t\t\t\t\t\t\t\t\t}";
+	protected final String TEXT_111 = NL + "\t\t\t\t\t\t\t\t\t\telse if (!savedResources.remove(resource))" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\t\t\t\tchangedResources.add(resource);" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t}";
+	protected final String TEXT_112 = NL + "\t\t\t\t\t\t\t\t\t\telse" + NL + "\t\t\t\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\tif ((delta.getFlags() & IResourceDelta.MARKERS) != 0)" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\t\t\t\t\t";
+	protected final String TEXT_113 = ".DiagnosticAdapter.update(resource, markerHelper.getMarkerDiagnostics(resource, (IFile)delta.getResource()";
+	protected final String TEXT_114 = ", false";
+	protected final String TEXT_115 = "));" + NL + "\t\t\t\t\t\t\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\tif ((delta.getFlags() & IResourceDelta.CONTENT) != 0)" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\t\t\t\t\tif (!savedResources.remove(resource))" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\t\t\t\t\t\tchangedResources.add(resource);" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\t\t\t\t\t}";
+	protected final String TEXT_116 = NL + "\t\t\t\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\t\t\t\treturn false;" + NL + "\t\t\t\t\t\t\t}" + NL + "" + NL + "\t\t\t\t\t\t\treturn true;"
+			+ NL + "\t\t\t\t\t\t}" + NL + "" + NL + "\t\t\t\t\t\tpublic ";
+	protected final String TEXT_117 = " getChangedResources()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\treturn changedResources;" + NL + "\t\t\t\t\t\t}" + NL + "" + NL + "\t\t\t\t\t\tpublic ";
+	protected final String TEXT_118 = " getRemovedResources()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\treturn removedResources;" + NL + "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t\tfinal ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();" + NL
+			+ "\t\t\t\t\tdelta.accept(visitor);" + NL + "" + NL
+			+ "\t\t\t\t\tif (!visitor.getRemovedResources().isEmpty())" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tgetSite().getShell().getDisplay().asyncExec" + NL + "\t\t\t\t\t\t\t(new Runnable()" + NL
+			+ "\t\t\t\t\t\t\t {";
+	protected final String TEXT_119 = NL + "\t\t\t\t\t\t\t\t @Override";
+	protected final String TEXT_120 = NL + "\t\t\t\t\t\t\t\t public void run()" + NL + "\t\t\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t\t\t removedResources.addAll(visitor.getRemovedResources());" + NL
+			+ "\t\t\t\t\t\t\t\t\t if (!isDirty())" + NL + "\t\t\t\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t getSite().getPage().closeEditor(";
+	protected final String TEXT_121 = ".this, false);" + NL + "\t\t\t\t\t\t\t\t\t }" + NL + "\t\t\t\t\t\t\t\t }" + NL
+			+ "\t\t\t\t\t\t\t });" + NL + "\t\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t\tif (!visitor.getChangedResources().isEmpty())" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tgetSite().getShell().getDisplay().asyncExec" + NL + "\t\t\t\t\t\t\t(new Runnable()" + NL
+			+ "\t\t\t\t\t\t\t {";
+	protected final String TEXT_122 = NL + "\t\t\t\t\t\t\t\t public void run()" + NL + "\t\t\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t\t\t changedResources.addAll(visitor.getChangedResources());" + NL
+			+ "\t\t\t\t\t\t\t\t\t if (getSite().getPage().getActiveEditor() == ";
+	protected final String TEXT_123 = ".this)" + NL + "\t\t\t\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t handleActivate();" + NL + "\t\t\t\t\t\t\t\t\t }" + NL + "\t\t\t\t\t\t\t\t }" + NL
+			+ "\t\t\t\t\t\t\t });" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tcatch (CoreException exception)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_124 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t};";
+	protected final String TEXT_125 = NL + NL + "\t/**" + NL
+			+ "\t * Handles activation of the editor or it's associated views." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected void handleActivate()" + NL + "\t{" + NL + "\t\t// Recompute the read only state." + NL
+			+ "\t\t//" + NL + "\t\tif (editingDomain.getResourceToReadOnlyMap() != null)" + NL + "\t\t{" + NL
+			+ "\t\t  editingDomain.getResourceToReadOnlyMap().clear();" + NL + "" + NL
+			+ "\t\t  // Refresh any actions that may become enabled or disabled." + NL + "\t\t  //" + NL
+			+ "\t\t  setSelection(getSelection());" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\tif (!removedResources.isEmpty())" + NL + "\t\t{" + NL + "\t\t\tif (handleDirtyConflict())" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tgetSite().getPage().closeEditor(";
+	protected final String TEXT_126 = ".this, false);" + NL + "\t\t\t}" + NL + "\t\t\telse" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tremovedResources.clear();" + NL + "\t\t\t\tchangedResources.clear();" + NL
+			+ "\t\t\t\tsavedResources.clear();" + NL + "\t\t\t}" + NL + "\t\t}" + NL
+			+ "\t\telse if (!changedResources.isEmpty())" + NL + "\t\t{" + NL
+			+ "\t\t\tchangedResources.removeAll(savedResources);" + NL + "\t\t\thandleChangedResources();" + NL
+			+ "\t\t\tchangedResources.clear();" + NL + "\t\t\tsavedResources.clear();" + NL + "\t\t}" + NL + "\t}" + NL
+			+ "" + NL + "\t/**" + NL + "\t * Handles what to do with changed resources on activation." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected void handleChangedResources()" + NL + "\t{" + NL
+			+ "\t\tif (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict()))" + NL + "\t\t{" + NL
+			+ "\t\t\tResourceSet resourceSet = editingDomain.getResourceSet();" + NL + "\t\t\tif (isDirty())" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tchangedResources.addAll(resourceSet.getResources());" + NL + "\t\t\t}" + NL
+			+ "\t\t\teditingDomain.getCommandStack().flush();" + NL + "" + NL
+			+ "\t\t\tupdateProblemIndication = false;";
+	protected final String TEXT_127 = NL + "\t\t\tfor (Resource resource : changedResources)";
+	protected final String TEXT_128 = NL + "\t\t\tfor (Iterator i = changedResources.iterator(); i.hasNext(); )";
+	protected final String TEXT_129 = NL + "\t\t\t{";
+	protected final String TEXT_130 = NL + "\t\t\t\tResource resource = (Resource)i.next();";
+	protected final String TEXT_131 = NL + "\t\t\t\tif (resource.isLoaded())" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tresource.unload();" + NL + "\t\t\t\t\ttry" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tresource.load(resourceSet.getLoadOptions());" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\tcatch (IOException exception)" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tif (!resourceToDiagnosticMap.containsKey(resource))" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tresourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL;
+	protected final String TEXT_132 = NL + "\t\t\tif (AdapterFactoryEditingDomain.isStale(editorSelection))" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tsetSelection(StructuredSelection.EMPTY);" + NL + "\t\t\t}";
+	protected final String TEXT_133 = NL + NL + "\t\t\tupdateProblemIndication = true;" + NL
+			+ "\t\t\tupdateProblemIndication();" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Updates the problems indication with the information described in the specified diagnostic." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected void updateProblemIndication()" + NL + "\t{" + NL + "\t\tif (updateProblemIndication)"
+			+ NL + "\t\t{" + NL + "\t\t\tBasicDiagnostic diagnostic =" + NL + "\t\t\t\tnew BasicDiagnostic" + NL
+			+ "\t\t\t\t\t(Diagnostic.OK," + NL + "\t\t\t\t\t \"";
+	protected final String TEXT_134 = "\",";
+	protected final String TEXT_135 = NL + "\t\t\t\t\t 0," + NL + "\t\t\t\t\t null," + NL
+			+ "\t\t\t\t\t new Object [] { editingDomain.getResourceSet() });";
+	protected final String TEXT_136 = NL + "\t\t\tfor (Diagnostic childDiagnostic : resourceToDiagnosticMap.values())";
+	protected final String TEXT_137 = NL
+			+ "\t\t\tfor (Iterator i = resourceToDiagnosticMap.values().iterator(); i.hasNext(); )";
+	protected final String TEXT_138 = NL + "\t\t\t\tDiagnostic childDiagnostic = (Diagnostic)i.next();";
+	protected final String TEXT_139 = NL + "\t\t\t\tif (childDiagnostic.getSeverity() != Diagnostic.OK)" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tdiagnostic.add(childDiagnostic);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL
+			+ "" + NL + "\t\t\tint lastEditorPage = getPageCount() - 1;" + NL
+			+ "\t\t\tif (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart)" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\t((ProblemEditorPart)getEditor(lastEditorPage)).setDiagnostic(diagnostic);" + NL
+			+ "\t\t\t\tif (diagnostic.getSeverity() != Diagnostic.OK)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tsetActivePage(lastEditorPage);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL
+			+ "\t\t\telse if (diagnostic.getSeverity() != Diagnostic.OK)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tProblemEditorPart problemEditorPart = new ProblemEditorPart();" + NL
+			+ "\t\t\t\tproblemEditorPart.setDiagnostic(diagnostic);";
+	protected final String TEXT_140 = NL + "\t\t\t\tproblemEditorPart.setMarkerHelper(markerHelper);";
+	protected final String TEXT_141 = NL + "\t\t\t\ttry" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\taddPage(++lastEditorPage, problemEditorPart, getEditorInput());" + NL
+			+ "\t\t\t\t\tsetPageText(lastEditorPage, problemEditorPart.getPartName());" + NL
+			+ "\t\t\t\t\tsetActivePage(lastEditorPage);" + NL + "\t\t\t\t\tshowTabs();" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tcatch (PartInitException exception)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_142 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t}" + NL + "\t\t\t}";
+	protected final String TEXT_143 = NL + NL + "\t\t\tif (markerHelper.hasMarkers(editingDomain.getResourceSet()))"
+			+ NL + "\t\t\t{";
+	protected final String TEXT_144 = NL + "\t\t\t\tmarkerHelper.deleteMarkers(editingDomain.getResourceSet());" + NL
+			+ "\t\t\t\tif (diagnostic.getSeverity() != Diagnostic.OK)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\ttry" + NL
+			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tmarkerHelper.createMarkers(diagnostic);" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\tcatch (CoreException exception)" + NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\t";
+	protected final String TEXT_145 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}";
+	protected final String TEXT_146 = NL + "\t\t\t\ttry" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tmarkerHelper.updateMarkers(diagnostic);" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tcatch (CoreException exception)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_147 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t}";
+	protected final String TEXT_148 = NL + "\t\t\t}";
+	protected final String TEXT_149 = NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Shows a dialog that asks if conflicting changes should be discarded." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected boolean handleDirtyConflict()" + NL + "\t{" + NL + "\t\treturn" + NL
+			+ "\t\t\tMessageDialog.openQuestion" + NL + "\t\t\t\t(getSite().getShell()," + NL
+			+ "\t\t\t\t getString(\"_UI_FileConflict_label\"),";
+	protected final String TEXT_150 = NL + "\t\t\t\t getString(\"_WARN_FileConflict\"));";
+	protected final String TEXT_151 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * This creates a model editor."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tpublic ";
+	protected final String TEXT_152 = "()" + NL + "\t{" + NL + "\t\tsuper();" + NL + "\t\tinitializeEditingDomain();"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * This sets up the editing domain for the model editor."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected void initializeEditingDomain()" + NL + "\t{" + NL
+			+ "\t\t// Create an adapter factory that yields item providers." + NL + "\t\t//" + NL
+			+ "\t\tadapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);"
+			+ NL + "" + NL + "\t\tadapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());";
+	protected final String TEXT_153 = NL
+			+ "\t\tadapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());" + NL + "" + NL
+			+ "\t\t// Create the command stack that will notify this editor as commands are executed." + NL + "\t\t//";
+	protected final String TEXT_154 = NL + "\t\tBasicCommandStack commandStack = new BasicCommandStack();";
+	protected final String TEXT_155 = NL + "\t\tBasicCommandStack commandStack =" + NL + "\t\t\tnew BasicCommandStack()"
+			+ NL + "\t\t\t{";
+	protected final String TEXT_156 = NL + "\t\t\t\t@Override";
+	protected final String TEXT_157 = NL + "\t\t\t\tpublic void execute(Command command)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\t// Cancel live validation before executing a command that will trigger a new round of validation."
+			+ NL + "\t\t\t\t\t//" + NL + "\t\t\t\t\tif (!(command instanceof ";
+	protected final String TEXT_158 = ".NonDirtying))" + NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\t";
+	protected final String TEXT_159 = ".cancel(editingDomain);" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\tsuper.execute(command);" + NL + "\t\t\t\t}" + NL + "\t\t\t};";
+	protected final String TEXT_160 = NL + NL
+			+ "\t\t// Add a listener to set the most recent command's affected objects to be the selection of the viewer with focus."
+			+ NL + "\t\t//" + NL + "\t\tcommandStack.addCommandStackListener" + NL + "\t\t\t(new CommandStackListener()"
+			+ NL + "\t\t\t {";
+	protected final String TEXT_161 = NL + "\t\t\t\t @Override";
+	protected final String TEXT_162 = NL + "\t\t\t\t public void commandStackChanged(final EventObject event)" + NL
+			+ "\t\t\t\t {" + NL + "\t\t\t\t\t getContainer().getDisplay().asyncExec" + NL
+			+ "\t\t\t\t\t\t (new Runnable()" + NL + "\t\t\t\t\t\t  {";
+	protected final String TEXT_163 = NL + "\t\t\t\t\t\t\t  @Override";
+	protected final String TEXT_164 = NL + "\t\t\t\t\t\t\t  public void run()" + NL + "\t\t\t\t\t\t\t  {" + NL
+			+ "\t\t\t\t\t\t\t\t  firePropertyChange(IEditorPart.PROP_DIRTY);" + NL + "" + NL
+			+ "\t\t\t\t\t\t\t\t  // Try to select the affected objects." + NL + "\t\t\t\t\t\t\t\t  //" + NL
+			+ "\t\t\t\t\t\t\t\t  Command mostRecentCommand = ((CommandStack)event.getSource()).getMostRecentCommand();"
+			+ NL + "\t\t\t\t\t\t\t\t  if (mostRecentCommand != null)" + NL + "\t\t\t\t\t\t\t\t  {" + NL
+			+ "\t\t\t\t\t\t\t\t\t  setSelectionToViewer(mostRecentCommand.getAffectedObjects());" + NL
+			+ "\t\t\t\t\t\t\t\t  }" + NL + "\t\t\t\t\t\t\t\t  for (Iterator";
+	protected final String TEXT_165 = "<PropertySheetPage>";
+	protected final String TEXT_166 = " i = propertySheetPages.iterator(); i.hasNext(); )" + NL + "\t\t\t\t\t\t\t\t  {"
+			+ NL + "\t\t\t\t\t\t\t\t\t  PropertySheetPage propertySheetPage = ";
+	protected final String TEXT_167 = "(PropertySheetPage)";
+	protected final String TEXT_168 = "i.next();" + NL
+			+ "\t\t\t\t\t\t\t\t\t  if (propertySheetPage.getControl() == null || propertySheetPage.getControl().isDisposed())"
+			+ NL + "\t\t\t\t\t\t\t\t\t  {" + NL + "\t\t\t\t\t\t\t\t\t\t  i.remove();" + NL + "\t\t\t\t\t\t\t\t\t  }"
+			+ NL + "\t\t\t\t\t\t\t\t\t  else" + NL + "\t\t\t\t\t\t\t\t\t  {" + NL
+			+ "\t\t\t\t\t\t\t\t\t\t  propertySheetPage.refresh();" + NL + "\t\t\t\t\t\t\t\t\t  }" + NL
+			+ "\t\t\t\t\t\t\t\t  }" + NL + "\t\t\t\t\t\t\t  }" + NL + "\t\t\t\t\t\t  });" + NL + "\t\t\t\t }" + NL
+			+ "\t\t\t });" + NL + "" + NL + "\t\t// Create the editing domain with a special command stack." + NL
+			+ "\t\t//" + NL + "\t\teditingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new ";
+	protected final String TEXT_169 = "());" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is here for the listener to be able to call it." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_170 = NL + "\tprotected void firePropertyChange(int action)" + NL + "\t{" + NL
+			+ "\t\tsuper.firePropertyChange(action);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This sets the selection into whichever viewer is active." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic void setSelectionToViewer(";
+	protected final String TEXT_171 = " collection)" + NL + "\t{" + NL + "\t\tfinal ";
+	protected final String TEXT_172 = " theSelection = collection;" + NL + "\t\t// Make sure it's okay." + NL + "\t\t//"
+			+ NL + "\t\tif (theSelection != null && !theSelection.isEmpty())" + NL + "\t\t{" + NL
+			+ "\t\t\tRunnable runnable =" + NL + "\t\t\t\tnew Runnable()" + NL + "\t\t\t\t{";
+	protected final String TEXT_173 = NL + "\t\t\t\t\t@Override";
+	protected final String TEXT_174 = NL + "\t\t\t\t\tpublic void run()" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t// Try to select the items in the current content viewer of the editor." + NL
+			+ "\t\t\t\t\t\t//" + NL + "\t\t\t\t\t\tif (currentViewer != null)" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tcurrentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t};" + NL
+			+ "\t\t\tgetSite().getShell().getDisplay().asyncExec(runnable);" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL
+			+ "\t * This returns the editing domain as required by the {@link IEditingDomainProvider} interface." + NL
+			+ "\t * This is important for implementing the static methods of {@link AdapterFactoryEditingDomain}" + NL
+			+ "\t * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_175 = NL + "\t@Override";
+	protected final String TEXT_176 = NL + "\tpublic EditingDomain getEditingDomain()" + NL + "\t{" + NL
+			+ "\t\treturn editingDomain;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider" + NL + "\t{"
+			+ NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tpublic ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory)" + NL + "\t\t{" + NL
+			+ "\t\t\tsuper(adapterFactory);" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */";
+	protected final String TEXT_177 = NL + "\t\t@Override";
+	protected final String TEXT_178 = NL + "\t\tpublic Object [] getElements(Object object)" + NL + "\t\t{" + NL
+			+ "\t\t\tObject parent = super.getParent(object);" + NL
+			+ "\t\t\treturn (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_179 = NL + "\t\tpublic Object [] getChildren(Object object)" + NL + "\t\t{" + NL
+			+ "\t\t\tObject parent = super.getParent(object);" + NL
+			+ "\t\t\treturn (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_180 = NL + "\t\tpublic boolean hasChildren(Object object)" + NL + "\t\t{" + NL
+			+ "\t\t\tObject parent = super.getParent(object);" + NL + "\t\t\treturn parent != null;" + NL + "\t\t}" + NL
+			+ "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_181 = NL + "\t\tpublic Object getParent(Object object)" + NL + "\t\t{" + NL
+			+ "\t\t\treturn null;" + NL + "\t\t}" + NL + "\t}";
+	protected final String TEXT_182 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic void setCurrentViewerPane(ViewerPane viewerPane)" + NL + "\t{" + NL
+			+ "\t\tif (currentViewerPane != viewerPane)" + NL + "\t\t{" + NL + "\t\t\tif (currentViewerPane != null)"
+			+ NL + "\t\t\t{" + NL + "\t\t\t\tcurrentViewerPane.showFocus(false);" + NL + "\t\t\t}" + NL
+			+ "\t\t\tcurrentViewerPane = viewerPane;" + NL + "\t\t}" + NL
+			+ "\t\tsetCurrentViewer(currentViewerPane.getViewer());" + NL + "\t}";
+	protected final String TEXT_183 = NL + NL + "\t/**" + NL
+			+ "\t * This makes sure that one content viewer, either for the current page or the outline view, if it has focus,"
+			+ NL + "\t * is the current one." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic void setCurrentViewer(Viewer viewer)" + NL + "\t{"
+			+ NL + "\t\t// If it is changing..." + NL + "\t\t//" + NL + "\t\tif (currentViewer != viewer)" + NL
+			+ "\t\t{" + NL + "\t\t\tif (selectionChangedListener == null)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Create the listener on demand." + NL + "\t\t\t\t//" + NL
+			+ "\t\t\t\tselectionChangedListener =" + NL + "\t\t\t\t\tnew ISelectionChangedListener()" + NL
+			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\t// This just notifies those things that are affected by the section."
+			+ NL + "\t\t\t\t\t\t//";
+	protected final String TEXT_184 = NL
+			+ "\t\t\t\t\t\tpublic void selectionChanged(SelectionChangedEvent selectionChangedEvent)" + NL
+			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\tsetSelection(selectionChangedEvent.getSelection());" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\t// Stop listening to the old one." + NL + "\t\t\t//" + NL + "\t\t\tif (currentViewer != null)" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tcurrentViewer.removeSelectionChangedListener(selectionChangedListener);" + NL
+			+ "\t\t\t}" + NL + "" + NL + "\t\t\t// Start listening to the new one." + NL + "\t\t\t//" + NL
+			+ "\t\t\tif (viewer != null)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tviewer.addSelectionChangedListener(selectionChangedListener);" + NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\t// Remember it." + NL + "\t\t\t//" + NL + "\t\t\tcurrentViewer = viewer;" + NL + "" + NL
+			+ "\t\t\t// Set the editors selection based on the current viewer's selection." + NL + "\t\t\t//" + NL
+			+ "\t\t\tsetSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection());"
+			+ NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This returns the viewer as required by the {@link IViewerProvider} interface." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_185 = NL + "\tpublic Viewer getViewer()" + NL + "\t{" + NL + "\t\treturn currentViewer;"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This creates a context menu for the viewer and adds a listener as well registering the menu for extension."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected void createContextMenuFor(StructuredViewer viewer)" + NL + "\t{" + NL
+			+ "\t\tMenuManager contextMenu = new MenuManager(\"#PopUp\");";
+	protected final String TEXT_186 = NL + "\t\tcontextMenu.add(new Separator(\"additions\"));";
+	protected final String TEXT_187 = NL + "\t\tcontextMenu.setRemoveAllWhenShown(true);" + NL
+			+ "\t\tcontextMenu.addMenuListener(this);" + NL
+			+ "\t\tMenu menu= contextMenu.createContextMenu(viewer.getControl());" + NL
+			+ "\t\tviewer.getControl().setMenu(menu);";
+	protected final String TEXT_188 = NL
+			+ "\t\tgetSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));";
+	protected final String TEXT_189 = NL + "\t\tgetSite().registerContextMenu(contextMenu, viewer);";
+	protected final String TEXT_190 = NL + NL + "\t\tint dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;"
+			+ NL + "\t\tTransfer[] transfers = new Transfer[] { LocalTransfer.getInstance()";
+	protected final String TEXT_191 = ", LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance()";
+	protected final String TEXT_192 = " };" + NL
+			+ "\t\tviewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));" + NL
+			+ "\t\tviewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer));"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is the method called to load a resource into the editing domain's resource set based on the editor's input."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tpublic void createModel()" + NL + "\t{";
+	protected final String TEXT_193 = NL
+			+ "\t\tURI resourceURI = EditUIUtil.getURI(getEditorInput(), editingDomain.getResourceSet().getURIConverter());";
+	protected final String TEXT_194 = NL + "\t\tURI resourceURI = EditUIUtil.getURI(getEditorInput());";
+	protected final String TEXT_195 = NL + "\t\tURI resourceURI = URI.createURI(getEditorInput().getName());";
+	protected final String TEXT_196 = NL + "\t\t// Assumes that the input is a file object." + NL + "\t\t//" + NL
+			+ "\t\tIFileEditorInput modelFile = (IFileEditorInput)getEditorInput();" + NL
+			+ "\t\tURI resourceURI = URI.createPlatformResourceURI(modelFile.getFile().getFullPath().toString(), true);";
+	protected final String TEXT_197 = NL + "\t\tException exception = null;" + NL + "\t\tResource resource = null;" + NL
+			+ "\t\ttry" + NL + "\t\t{" + NL + "\t\t\t// Load the resource through the editing domain." + NL + "\t\t\t//"
+			+ NL + "\t\t\tresource = editingDomain.getResourceSet().getResource(resourceURI, true);" + NL + "\t\t}" + NL
+			+ "\t\tcatch (Exception e)" + NL + "\t\t{" + NL + "\t\t\texception = e;" + NL
+			+ "\t\t\tresource = editingDomain.getResourceSet().getResource(resourceURI, false);" + NL + "\t\t}" + NL
+			+ "" + NL + "\t\tDiagnostic diagnostic = analyzeResourceProblems(resource, exception);" + NL
+			+ "\t\tif (diagnostic.getSeverity() != Diagnostic.OK)" + NL + "\t\t{" + NL
+			+ "\t\t\tresourceToDiagnosticMap.put(resource,  analyzeResourceProblems(resource, exception));" + NL
+			+ "\t\t}" + NL + "\t\teditingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter);" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns a diagnostic describing the errors and warnings listed in the resource" + NL
+			+ "\t * and the specified exception (if any)." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic Diagnostic analyzeResourceProblems(Resource resource, Exception exception)" + NL + "\t{" + NL
+			+ "\t\tboolean hasErrors = !resource.getErrors().isEmpty();" + NL
+			+ "\t\tif (hasErrors || !resource.getWarnings().isEmpty())" + NL + "\t\t{" + NL
+			+ "\t\t\tBasicDiagnostic basicDiagnostic =" + NL + "\t\t\t\tnew BasicDiagnostic" + NL
+			+ "\t\t\t\t\t(hasErrors ? Diagnostic.ERROR : Diagnostic.WARNING," + NL + "\t\t\t\t\t \"";
+	protected final String TEXT_198 = NL + "\t\t\t\t\t 0," + NL
+			+ "\t\t\t\t\t getString(\"_UI_CreateModelError_message\", resource.getURI()),";
+	protected final String TEXT_199 = NL
+			+ "\t\t\t\t\t new Object [] { exception == null ? (Object)resource : exception });" + NL
+			+ "\t\t\tbasicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));" + NL
+			+ "\t\t\treturn basicDiagnostic;" + NL + "\t\t}" + NL + "\t\telse if (exception != null)" + NL + "\t\t{"
+			+ NL + "\t\t\treturn" + NL + "\t\t\t\tnew BasicDiagnostic" + NL + "\t\t\t\t\t(Diagnostic.ERROR," + NL
+			+ "\t\t\t\t\t \"";
+	protected final String TEXT_200 = NL + "\t\t\t\t\t new Object[] { exception });" + NL + "\t\t}" + NL + "\t\telse"
+			+ NL + "\t\t{" + NL + "\t\t\treturn Diagnostic.OK_INSTANCE;" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * This is the method used by the framework to install your own controls." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_201 = NL + "\tpublic void createPages()" + NL + "\t{" + NL
+			+ "\t\t// Creates the model from the editor input" + NL + "\t\t//" + NL + "\t\tcreateModel();" + NL + ""
+			+ NL + "\t\t// Only creates the other pages if there is something that can be edited" + NL + "\t\t//" + NL
+			+ "\t\tif (!getEditingDomain().getResourceSet().getResources().isEmpty())" + NL + "\t\t{" + NL
+			+ "\t\t\t// Create a page for the selection tree view." + NL + "\t\t\t//";
+	protected final String TEXT_202 = NL + "\t\t\t{" + NL + "\t\t\t\tViewerPane viewerPane =" + NL
+			+ "\t\t\t\t\tnew ViewerPane(getSite().getPage(), ";
+	protected final String TEXT_203 = ".this)" + NL + "\t\t\t\t\t{";
+	protected final String TEXT_204 = NL + "\t\t\t\t\t\tpublic Viewer createViewer(Composite composite)" + NL
+			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\tTree tree = new Tree(composite, SWT.MULTI);" + NL
+			+ "\t\t\t\t\t\t\tTreeViewer newTreeViewer = new TreeViewer(tree);" + NL
+			+ "\t\t\t\t\t\t\treturn newTreeViewer;" + NL + "\t\t\t\t\t\t}";
+	protected final String TEXT_205 = NL + "\t\t\t\t\t\tpublic void requestActivation()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tsuper.requestActivation();" + NL + "\t\t\t\t\t\t\tsetCurrentViewerPane(this);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t\tviewerPane.createControl(getContainer());" + NL + ""
+			+ NL + "\t\t\t\tselectionViewer = (TreeViewer)viewerPane.getViewer();" + NL
+			+ "\t\t\t\tselectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\t\t\tselectionViewer.setUseHashlookup(true);" + NL + "" + NL
+			+ "\t\t\t\tselectionViewer.setLabelProvider(";
+	protected final String TEXT_206 = "new ";
+	protected final String TEXT_207 = "(";
+	protected final String TEXT_208 = "(adapterFactory";
+	protected final String TEXT_209 = ", selectionViewer";
+	protected final String TEXT_210 = ")";
+	protected final String TEXT_211 = ", new ";
+	protected final String TEXT_212 = "(editingDomain";
+	protected final String TEXT_213 = ".getResourceSet()";
+	protected final String TEXT_214 = ".getPlugin().getDialogSettings()";
+	protected final String TEXT_215 = "))";
+	protected final String TEXT_216 = ");" + NL + "\t\t\t\tselectionViewer.setInput(editingDomain.getResourceSet());"
+			+ NL
+			+ "\t\t\t\tselectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);"
+			+ NL + "\t\t\t\tviewerPane.setTitle(editingDomain.getResourceSet());" + NL + "" + NL
+			+ "\t\t\t\tnew AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);";
+	protected final String TEXT_217 = NL + "\t\t\t\tnew ";
+	protected final String TEXT_218 = "(selectionViewer, new ";
+	protected final String TEXT_219 = ".EditingDomainLocationListener(editingDomain, selectionViewer));";
+	protected final String TEXT_220 = NL + NL + "\t\t\t\tcreateContextMenuFor(selectionViewer);" + NL
+			+ "\t\t\t\tint pageIndex = addPage(viewerPane.getControl());" + NL
+			+ "\t\t\t\tsetPageText(pageIndex, getString(\"_UI_SelectionPage_label\"));";
+	protected final String TEXT_221 = NL + "\t\t\t}" + NL + "" + NL + "\t\t\t// Create a page for the parent tree view."
+			+ NL + "\t\t\t//" + NL + "\t\t\t{" + NL + "\t\t\t\tViewerPane viewerPane =" + NL
+			+ "\t\t\t\t\tnew ViewerPane(getSite().getPage(), ";
+	protected final String TEXT_222 = NL + "\t\t\t\t\t\tpublic void requestActivation()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tsuper.requestActivation();" + NL + "\t\t\t\t\t\t\tsetCurrentViewerPane(this);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t\tviewerPane.createControl(getContainer());" + NL + ""
+			+ NL + "\t\t\t\tparentViewer = (TreeViewer)viewerPane.getViewer();" + NL
+			+ "\t\t\t\tparentViewer.setAutoExpandLevel(30);" + NL
+			+ "\t\t\t\tparentViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\t\t\tparentViewer.setLabelProvider(";
+	protected final String TEXT_223 = ", parentViewer";
+	protected final String TEXT_224 = ");" + NL + "" + NL + "\t\t\t\tcreateContextMenuFor(parentViewer);" + NL
+			+ "\t\t\t\tint pageIndex = addPage(viewerPane.getControl());" + NL
+			+ "\t\t\t\tsetPageText(pageIndex, getString(\"_UI_ParentPage_label\"));";
+	protected final String TEXT_225 = NL + "\t\t\t}" + NL + "" + NL + "\t\t\t// This is the page for the list viewer"
+			+ NL + "\t\t\t//" + NL + "\t\t\t{" + NL + "\t\t\t\tViewerPane viewerPane =" + NL
+			+ "\t\t\t\t\tnew ViewerPane(getSite().getPage(), ";
+	protected final String TEXT_226 = NL + "\t\t\t\t\t\tpublic Viewer createViewer(Composite composite)" + NL
+			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\treturn new ListViewer(composite);" + NL + "\t\t\t\t\t\t}";
+	protected final String TEXT_227 = NL + "\t\t\t\t\t\tpublic void requestActivation()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tsuper.requestActivation();" + NL + "\t\t\t\t\t\t\tsetCurrentViewerPane(this);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t\tviewerPane.createControl(getContainer());" + NL
+			+ "\t\t\t\tlistViewer = (ListViewer)viewerPane.getViewer();" + NL
+			+ "\t\t\t\tlistViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\t\t\tlistViewer.setLabelProvider(";
+	protected final String TEXT_228 = ", listViewer";
+	protected final String TEXT_229 = ");" + NL + "" + NL + "\t\t\t\tcreateContextMenuFor(listViewer);" + NL
+			+ "\t\t\t\tint pageIndex = addPage(viewerPane.getControl());" + NL
+			+ "\t\t\t\tsetPageText(pageIndex, getString(\"_UI_ListPage_label\"));";
+	protected final String TEXT_230 = NL + "\t\t\t}" + NL + "" + NL + "\t\t\t// This is the page for the tree viewer"
+			+ NL + "\t\t\t//" + NL + "\t\t\t{" + NL + "\t\t\t\tViewerPane viewerPane =" + NL
+			+ "\t\t\t\t\tnew ViewerPane(getSite().getPage(), ";
+	protected final String TEXT_231 = NL + "\t\t\t\t\t\tpublic Viewer createViewer(Composite composite)" + NL
+			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\treturn new TreeViewer(composite);" + NL + "\t\t\t\t\t\t}";
+	protected final String TEXT_232 = NL + "\t\t\t\t\t\tpublic void requestActivation()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tsuper.requestActivation();" + NL + "\t\t\t\t\t\t\tsetCurrentViewerPane(this);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t\tviewerPane.createControl(getContainer());" + NL
+			+ "\t\t\t\ttreeViewer = (TreeViewer)viewerPane.getViewer();" + NL
+			+ "\t\t\t\ttreeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\t\t\ttreeViewer.setLabelProvider(";
+	protected final String TEXT_233 = ", treeViewer";
+	protected final String TEXT_234 = ", treeViewer))";
+	protected final String TEXT_235 = ");" + NL + "" + NL
+			+ "\t\t\t\tnew AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory);";
+	protected final String TEXT_236 = "(treeViewer, new ";
+	protected final String TEXT_237 = ".EditingDomainLocationListener(editingDomain, treeViewer));";
+	protected final String TEXT_238 = NL + NL + "\t\t\t\tcreateContextMenuFor(treeViewer);" + NL
+			+ "\t\t\t\tint pageIndex = addPage(viewerPane.getControl());" + NL
+			+ "\t\t\t\tsetPageText(pageIndex, getString(\"_UI_TreePage_label\"));";
+	protected final String TEXT_239 = NL + "\t\t\t}" + NL + "" + NL + "\t\t\t// This is the page for the table viewer."
+			+ NL + "\t\t\t//" + NL + "\t\t\t{" + NL + "\t\t\t\tViewerPane viewerPane =" + NL
+			+ "\t\t\t\t\tnew ViewerPane(getSite().getPage(), ";
+	protected final String TEXT_240 = NL + "\t\t\t\t\t\tpublic Viewer createViewer(Composite composite)" + NL
+			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\treturn new TableViewer(composite);" + NL + "\t\t\t\t\t\t}";
+	protected final String TEXT_241 = NL + "\t\t\t\t\t\tpublic void requestActivation()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tsuper.requestActivation();" + NL + "\t\t\t\t\t\t\tsetCurrentViewerPane(this);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t\tviewerPane.createControl(getContainer());" + NL
+			+ "\t\t\t\ttableViewer = (TableViewer)viewerPane.getViewer();" + NL + "" + NL
+			+ "\t\t\t\tTable table = tableViewer.getTable();" + NL + "\t\t\t\tTableLayout layout = new TableLayout();"
+			+ NL + "\t\t\t\ttable.setLayout(layout);" + NL + "\t\t\t\ttable.setHeaderVisible(true);" + NL
+			+ "\t\t\t\ttable.setLinesVisible(true);" + NL + "" + NL
+			+ "\t\t\t\tTableColumn objectColumn = new TableColumn(table, SWT.NONE);" + NL
+			+ "\t\t\t\tlayout.addColumnData(new ColumnWeightData(3, 100, true));" + NL
+			+ "\t\t\t\tobjectColumn.setText(getString(\"_UI_ObjectColumn_label\"));";
+	protected final String TEXT_242 = NL + "\t\t\t\tobjectColumn.setResizable(true);" + NL + "" + NL
+			+ "\t\t\t\tTableColumn selfColumn = new TableColumn(table, SWT.NONE);" + NL
+			+ "\t\t\t\tlayout.addColumnData(new ColumnWeightData(2, 100, true));" + NL
+			+ "\t\t\t\tselfColumn.setText(getString(\"_UI_SelfColumn_label\"));";
+	protected final String TEXT_243 = NL + "\t\t\t\tselfColumn.setResizable(true);" + NL + "" + NL
+			+ "\t\t\t\ttableViewer.setColumnProperties(new String [] {\"a\", \"b\"});";
+	protected final String TEXT_244 = NL
+			+ "\t\t\t\ttableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\t\t\ttableViewer.setLabelProvider(";
+	protected final String TEXT_245 = ", tableViewer";
+	protected final String TEXT_246 = ");" + NL;
+	protected final String TEXT_247 = "(tableViewer, new ";
+	protected final String TEXT_248 = ".EditingDomainLocationListener(editingDomain, tableViewer));" + NL;
+	protected final String TEXT_249 = NL + "\t\t\t\tcreateContextMenuFor(tableViewer);" + NL
+			+ "\t\t\t\tint pageIndex = addPage(viewerPane.getControl());" + NL
+			+ "\t\t\t\tsetPageText(pageIndex, getString(\"_UI_TablePage_label\"));";
+	protected final String TEXT_250 = NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\t// This is the page for the table tree viewer." + NL + "\t\t\t//" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tViewerPane viewerPane =" + NL + "\t\t\t\t\tnew ViewerPane(getSite().getPage(), ";
+	protected final String TEXT_251 = NL + "\t\t\t\t\t\tpublic void requestActivation()" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tsuper.requestActivation();" + NL + "\t\t\t\t\t\t\tsetCurrentViewerPane(this);" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t};" + NL + "\t\t\t\tviewerPane.createControl(getContainer());" + NL + ""
+			+ NL + "\t\t\t\ttreeViewerWithColumns = (TreeViewer)viewerPane.getViewer();" + NL + "" + NL
+			+ "\t\t\t\tTree tree = treeViewerWithColumns.getTree();" + NL
+			+ "\t\t\t\ttree.setLayoutData(new FillLayout());" + NL + "\t\t\t\ttree.setHeaderVisible(true);" + NL
+			+ "\t\t\t\ttree.setLinesVisible(true);" + NL + "" + NL
+			+ "\t\t\t\tTreeColumn objectColumn = new TreeColumn(tree, SWT.NONE);" + NL
+			+ "\t\t\t\tobjectColumn.setText(getString(\"_UI_ObjectColumn_label\"));";
+	protected final String TEXT_252 = NL + "\t\t\t\tobjectColumn.setResizable(true);" + NL
+			+ "\t\t\t\tobjectColumn.setWidth(250);" + NL + "" + NL
+			+ "\t\t\t\tTreeColumn selfColumn = new TreeColumn(tree, SWT.NONE);" + NL
+			+ "\t\t\t\tselfColumn.setText(getString(\"_UI_SelfColumn_label\"));";
+	protected final String TEXT_253 = NL + "\t\t\t\tselfColumn.setResizable(true);" + NL
+			+ "\t\t\t\tselfColumn.setWidth(200);" + NL + "" + NL
+			+ "\t\t\t\ttreeViewerWithColumns.setColumnProperties(new String [] {\"a\", \"b\"});";
+	protected final String TEXT_254 = NL
+			+ "\t\t\t\ttreeViewerWithColumns.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));"
+			+ NL + "\t\t\t\ttreeViewerWithColumns.setLabelProvider(";
+	protected final String TEXT_255 = ", treeViewerWithColumns";
+	protected final String TEXT_256 = "(treeViewerWithColumns, new ";
+	protected final String TEXT_257 = ".EditingDomainLocationListener(editingDomain, treeViewerWithColumns));" + NL;
+	protected final String TEXT_258 = NL + "\t\t\t\tcreateContextMenuFor(treeViewerWithColumns);" + NL
+			+ "\t\t\t\tint pageIndex = addPage(viewerPane.getControl());" + NL
+			+ "\t\t\t\tsetPageText(pageIndex, getString(\"_UI_TreeWithColumnsPage_label\"));";
+	protected final String TEXT_259 = NL + "\t\t\tTree tree = new Tree(getContainer(), SWT.MULTI);" + NL
+			+ "\t\t\tselectionViewer = new TreeViewer(tree);" + NL + "\t\t\tsetCurrentViewer(selectionViewer);" + NL
+			+ "" + NL + "\t\t\tselectionViewer.setUseHashlookup(true);" + NL
+			+ "\t\t\tselectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\t\tselectionViewer.setLabelProvider(";
+	protected final String TEXT_260 = ");" + NL + "\t\t\tselectionViewer.setInput(editingDomain.getResourceSet());" + NL
+			+ "\t\t\tselectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);"
+			+ NL + "" + NL + "\t\t\tnew AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);";
+	protected final String TEXT_261 = NL + "\t\t\tnew ";
+	protected final String TEXT_262 = NL + NL + "\t\t\tcreateContextMenuFor(selectionViewer);" + NL
+			+ "\t\t\tint pageIndex = addPage(tree);" + NL
+			+ "\t\t\tsetPageText(pageIndex, getString(\"_UI_SelectionPage_label\"));";
+	protected final String TEXT_263 = NL + NL + "\t\t\tgetSite().getShell().getDisplay().asyncExec" + NL
+			+ "\t\t\t\t(new Runnable()" + NL + "\t\t\t\t {";
+	protected final String TEXT_264 = NL + "\t\t\t\t\t @Override";
+	protected final String TEXT_265 = NL + "\t\t\t\t\t public void run()" + NL + "\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t if (!getContainer().isDisposed())" + NL + "\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t setActivePage(0);" + NL + "\t\t\t\t\t\t }" + NL + "\t\t\t\t\t }" + NL + "\t\t\t\t });"
+			+ NL + "\t\t}" + NL + "" + NL + "\t\t// Ensures that this editor will only display the page's tab" + NL
+			+ "\t\t// area if there are more than one page" + NL + "\t\t//" + NL
+			+ "\t\tgetContainer().addControlListener" + NL + "\t\t\t(new ControlAdapter()" + NL + "\t\t\t {" + NL
+			+ "\t\t\t\tboolean guard = false;";
+	protected final String TEXT_266 = NL + "\t\t\t\tpublic void controlResized(ControlEvent event)" + NL + "\t\t\t\t{"
+			+ NL + "\t\t\t\t\tif (!guard)" + NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tguard = true;" + NL
+			+ "\t\t\t\t\t\thideTabs();" + NL + "\t\t\t\t\t\tguard = false;" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t });" + NL + "" + NL + "\t\tgetSite().getShell().getDisplay().asyncExec" + NL
+			+ "\t\t\t(new Runnable()" + NL + "\t\t\t {";
+	protected final String TEXT_267 = NL + "\t\t\t\t public void run()" + NL + "\t\t\t\t {" + NL
+			+ "\t\t\t\t\t updateProblemIndication();" + NL + "\t\t\t\t }" + NL + "\t\t\t });" + NL + "\t}" + NL + ""
+			+ NL + "\t/**" + NL + "\t * If there is just one page in the multi-page editor part," + NL
+			+ "\t * this hides the single tab at the bottom." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void hideTabs()"
+			+ NL + "\t{" + NL + "\t\tif (getPageCount() <= 1)" + NL + "\t\t{" + NL + "\t\t\tsetPageText(0, \"\");";
+	protected final String TEXT_268 = NL + "\t\t\tif (getContainer() instanceof CTabFolder)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tPoint point = getContainer().getSize();" + NL
+			+ "\t\t\t\tRectangle clientArea = getContainer().getClientArea();" + NL
+			+ "\t\t\t\tgetContainer().setSize(point.x,  2 * point.y - clientArea.height - clientArea.y);" + NL
+			+ "\t\t\t}" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * If there is more than one page in the multi-page editor part," + NL
+			+ "\t * this shows the tabs at the bottom." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void showTabs()"
+			+ NL + "\t{" + NL + "\t\tif (getPageCount() > 1)" + NL + "\t\t{" + NL
+			+ "\t\t\tsetPageText(0, getString(\"_UI_SelectionPage_label\"));";
+	protected final String TEXT_269 = NL + "\t\t\tif (getContainer() instanceof CTabFolder)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tPoint point = getContainer().getSize();" + NL
+			+ "\t\t\t\tRectangle clientArea = getContainer().getClientArea();" + NL
+			+ "\t\t\t\tgetContainer().setSize(point.x, clientArea.height + clientArea.y);" + NL + "\t\t\t}" + NL
+			+ "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * This is used to track the active viewer." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_270 = NL + "\tprotected void pageChange(int pageIndex)" + NL + "\t{" + NL
+			+ "\t\tsuper.pageChange(pageIndex);" + NL + "" + NL + "\t\tif (contentOutlinePage != null)" + NL + "\t\t{"
+			+ NL + "\t\t\thandleContentOutlineSelection(contentOutlinePage.getSelection());" + NL + "\t\t}" + NL + "\t}"
+			+ NL + "" + NL + "\t/**" + NL + "\t * This is how the framework determines which interfaces we implement."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_271 = NL + "\t@SuppressWarnings(\"";
+	protected final String TEXT_272 = "rawtypes";
+	protected final String TEXT_273 = "unchecked";
+	protected final String TEXT_274 = "\")";
+	protected final String TEXT_275 = NL + "\tpublic <T> T getAdapter(Class<T> key)";
+	protected final String TEXT_276 = NL + "\tpublic Object getAdapter(Class key)";
+	protected final String TEXT_277 = NL + "\t{" + NL + "\t\tif (key.equals(IContentOutlinePage.class))" + NL + "\t\t{";
+	protected final String TEXT_278 = NL + "\t\t\treturn showOutlineView() ? key.cast(getContentOutlinePage()) : null;";
+	protected final String TEXT_279 = NL + "\t\t\treturn showOutlineView() ? getContentOutlinePage() : null;";
+	protected final String TEXT_280 = NL + "\t\t}" + NL + "\t\telse if (key.equals(IPropertySheetPage.class))" + NL
+			+ "\t\t{";
+	protected final String TEXT_281 = NL + "\t\t\treturn key.cast(getPropertySheetPage());";
+	protected final String TEXT_282 = NL + "\t\t\treturn getPropertySheetPage();";
+	protected final String TEXT_283 = NL + "\t\t}";
+	protected final String TEXT_284 = NL + "\t\telse if (key.equals(IGotoMarker.class))" + NL + "\t\t{";
+	protected final String TEXT_285 = NL + "\t\t\treturn key.cast(this);";
+	protected final String TEXT_286 = NL + "\t\t\treturn this;";
+	protected final String TEXT_287 = NL + "\t\telse if (key.equals(";
+	protected final String TEXT_288 = ".class)) " + NL + "\t\t{" + NL + "\t\t\treturn ";
+	protected final String TEXT_289 = ".getAdapter(key, this, ";
+	protected final String TEXT_290 = ".getPlugin());" + NL + "\t\t}";
+	protected final String TEXT_291 = NL + "\t\telse" + NL + "\t\t{" + NL + "\t\t\treturn super.getAdapter(key);" + NL
+			+ "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This accesses a cached version of the content outliner." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic IContentOutlinePage getContentOutlinePage()" + NL + "\t{" + NL
+			+ "\t\tif (contentOutlinePage == null)" + NL + "\t\t{" + NL + "\t\t\t// The content outline is just a tree."
+			+ NL + "\t\t\t//" + NL + "\t\t\tclass MyContentOutlinePage extends ContentOutlinePage" + NL + "\t\t\t{";
+	protected final String TEXT_292 = NL + "\t\t\t\tpublic void createControl(Composite parent)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tsuper.createControl(parent);" + NL + "\t\t\t\t\tcontentOutlineViewer = getTreeViewer();" + NL
+			+ "\t\t\t\t\tcontentOutlineViewer.addSelectionChangedListener(this);" + NL + "" + NL
+			+ "\t\t\t\t\t// Set up the tree viewer." + NL + "\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\tcontentOutlineViewer.setUseHashlookup(true);" + NL
+			+ "\t\t\t\t\tcontentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));"
+			+ NL + "\t\t\t\t\tcontentOutlineViewer.setLabelProvider(";
+	protected final String TEXT_293 = ", contentOutlineViewer";
+	protected final String TEXT_294 = ");" + NL
+			+ "\t\t\t\t\tcontentOutlineViewer.setInput(editingDomain.getResourceSet());" + NL;
+	protected final String TEXT_295 = NL + "\t\t\t\t\tnew ";
+	protected final String TEXT_296 = "(contentOutlineViewer, new ";
+	protected final String TEXT_297 = ".EditingDomainLocationListener(editingDomain, contentOutlineViewer));" + NL;
+	protected final String TEXT_298 = NL + "\t\t\t\t\t// Make sure our popups work." + NL + "\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\tcreateContextMenuFor(contentOutlineViewer);" + NL + "" + NL
+			+ "\t\t\t\t\tif (!editingDomain.getResourceSet().getResources().isEmpty())" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t  // Select the root object in the view." + NL + "\t\t\t\t\t  //" + NL
+			+ "\t\t\t\t\t  contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);"
+			+ NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL;
+	protected final String TEXT_299 = NL
+			+ "\t\t\t\tpublic void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager)"
+			+ NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tsuper.makeContributions(menuManager, toolBarManager, statusLineManager);" + NL
+			+ "\t\t\t\t\tcontentOutlineStatusLineManager = statusLineManager;" + NL + "\t\t\t\t}" + NL;
+	protected final String TEXT_300 = NL + "\t\t\t\tpublic void setActionBars(IActionBars actionBars)" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tsuper.setActionBars(actionBars);" + NL
+			+ "\t\t\t\t\tgetActionBarContributor().shareGlobalActions(this, actionBars);" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t}" + NL + "" + NL + "\t\t\tcontentOutlinePage = new MyContentOutlinePage();" + NL + "" + NL
+			+ "\t\t\t// Listen to selection so that we can handle it is a special way." + NL + "\t\t\t//" + NL
+			+ "\t\t\tcontentOutlinePage.addSelectionChangedListener" + NL + "\t\t\t\t(new ISelectionChangedListener()"
+			+ NL + "\t\t\t\t {" + NL + "\t\t\t\t\t // This ensures that we handle selections correctly." + NL
+			+ "\t\t\t\t\t //";
+	protected final String TEXT_301 = NL + "\t\t\t\t\t public void selectionChanged(SelectionChangedEvent event)" + NL
+			+ "\t\t\t\t\t {" + NL + "\t\t\t\t\t\t handleContentOutlineSelection(event.getSelection());" + NL
+			+ "\t\t\t\t\t }" + NL + "\t\t\t\t });" + NL + "\t\t}" + NL + "" + NL + "\t\treturn contentOutlinePage;" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL + "\t * This accesses a cached version of the property sheet." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic IPropertySheetPage getPropertySheetPage()" + NL + "\t{" + NL
+			+ "\t\tPropertySheetPage propertySheetPage =" + NL + "\t\t\tnew ExtendedPropertySheetPage(editingDomain";
+	protected final String TEXT_302 = ", ExtendedPropertySheetPage.Decoration.MANUAL";
+	protected final String TEXT_303 = ", ExtendedPropertySheetPage.Decoration.LIVE, ";
+	protected final String TEXT_304 = "ExtendedPropertySheetPage.Decoration.NONE, ";
+	protected final String TEXT_305 = "null, ";
+	protected final String TEXT_306 = ")" + NL + "\t\t\t{";
+	protected final String TEXT_307 = NL + "\t\t\t\tpublic void setSelectionToViewer(";
+	protected final String TEXT_308 = " selection)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_309 = ".this.setSelectionToViewer(selection);" + NL + "\t\t\t\t\t";
+	protected final String TEXT_310 = ".this.setFocus();" + NL + "\t\t\t\t}" + NL;
+	protected final String TEXT_311 = NL + "\t\t\t\tpublic void setActionBars(IActionBars actionBars)" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\tsuper.setActionBars(actionBars);" + NL
+			+ "\t\t\t\t\tgetActionBarContributor().shareGlobalActions(this, actionBars);" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t};" + NL
+			+ "\t\tpropertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));" + NL
+			+ "\t\tpropertySheetPages.add(propertySheetPage);" + NL + "" + NL + "\t\treturn propertySheetPage;" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This deals with how we want selection in the outliner to affect the other views." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic void handleContentOutlineSelection(ISelection selection)" + NL + "\t{";
+	protected final String TEXT_312 = NL
+			+ "\t\tif (currentViewerPane != null && !selection.isEmpty() && selection instanceof IStructuredSelection)";
+	protected final String TEXT_313 = NL
+			+ "\t\tif (selectionViewer != null && !selection.isEmpty() && selection instanceof IStructuredSelection)";
+	protected final String TEXT_314 = NL + "\t\t{" + NL + "\t\t\tIterator";
+	protected final String TEXT_315 = "<?>";
+	protected final String TEXT_316 = " selectedElements = ((IStructuredSelection)selection).iterator();" + NL
+			+ "\t\t\tif (selectedElements.hasNext())" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Get the first selected element." + NL + "\t\t\t\t//" + NL
+			+ "\t\t\t\tObject selectedElement = selectedElements.next();" + NL;
+	protected final String TEXT_317 = NL
+			+ "\t\t\t\t// If it's the selection viewer, then we want it to select the same selection as this selection."
+			+ NL + "\t\t\t\t//" + NL + "\t\t\t\tif (currentViewerPane.getViewer() == selectionViewer)" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\t";
+	protected final String TEXT_318 = " selectionList = new ";
+	protected final String TEXT_319 = "();" + NL + "\t\t\t\t\tselectionList.add(selectedElement);" + NL
+			+ "\t\t\t\t\twhile (selectedElements.hasNext())" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tselectionList.add(selectedElements.next());" + NL + "\t\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t\t// Set the selection to the widget." + NL + "\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\tselectionViewer.setSelection(new StructuredSelection(selectionList));" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\telse" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t// Set the input to the widget." + NL + "\t\t\t\t\t//"
+			+ NL + "\t\t\t\t\tif (currentViewerPane.getViewer().getInput() != selectedElement)" + NL + "\t\t\t\t\t{"
+			+ NL + "\t\t\t\t\t\tcurrentViewerPane.getViewer().setInput(selectedElement);" + NL
+			+ "\t\t\t\t\t\tcurrentViewerPane.setTitle(selectedElement);" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}";
+	protected final String TEXT_320 = NL + "\t\t\t\t";
+	protected final String TEXT_321 = "();" + NL + "\t\t\t\tselectionList.add(selectedElement);" + NL
+			+ "\t\t\t\twhile (selectedElements.hasNext())" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tselectionList.add(selectedElements.next());" + NL + "\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t// Set the selection to the widget." + NL + "\t\t\t\t//" + NL
+			+ "\t\t\t\tselectionViewer.setSelection(new StructuredSelection(selectionList));";
+	protected final String TEXT_322 = NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This is for implementing {@link IEditorPart} and simply tests the command stack." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_323 = NL + "\tpublic boolean isDirty()" + NL + "\t{" + NL
+			+ "\t\treturn ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();" + NL + "\t}" + NL;
+	protected final String TEXT_324 = NL + "\t/**" + NL + "\t * This is for implementing {@link IRevertablePart}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_325 = NL + "\tpublic void doRevert()" + NL + "\t{";
+	protected final String TEXT_326 = NL + "\t\tDiagnosticDecorator.cancel(editingDomain);" + NL;
+	protected final String TEXT_327 = "\t\t" + NL + "\t\tResourceSet resourceSet = editingDomain.getResourceSet();" + NL
+			+ "\t\t";
+	protected final String TEXT_328 = " resources = resourceSet.getResources();" + NL + "\t\t";
+	protected final String TEXT_329 = " unloadedResources = new ";
+	protected final String TEXT_330 = "();" + NL + "\t\tupdateProblemIndication = false;" + NL
+			+ "\t\tfor (int i = 0; i < resources.size(); ++i)" + NL + "\t\t{" + NL
+			+ "\t\t\tResource resource = resources.get(i);" + NL + "\t\t\tif (resource.isLoaded())" + NL + "\t\t\t{"
+			+ NL + "\t\t\t\tresource.unload();" + NL + "\t\t\t\tunloadedResources.add(resource);" + NL + "\t\t\t}" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\tresourceToDiagnosticMap.clear();";
+	protected final String TEXT_331 = NL + "\t\tfor (Resource resource : unloadedResources)";
+	protected final String TEXT_332 = NL + "\t\tfor (Iterator i = unloadedResources.iterator(); i.hasNext(); )";
+	protected final String TEXT_333 = NL + "\t\t{";
+	protected final String TEXT_334 = NL + "\t\t\ttry" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tresource.load(resourceSet.getLoadOptions());" + NL + "\t\t\t}" + NL
+			+ "\t\t\tcatch (IOException exception)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tif (!resourceToDiagnosticMap.containsKey(resource))" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tresourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));" + NL
+			+ "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\teditingDomain.getCommandStack().flush();" + NL + "" + NL
+			+ "\t\tif (AdapterFactoryEditingDomain.isStale(editorSelection))" + NL + "\t\t{" + NL
+			+ "\t\t\tsetSelection(StructuredSelection.EMPTY);" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\tupdateProblemIndication = true;" + NL + "\t\tupdateProblemIndication();" + NL + "\t}" + NL;
+	protected final String TEXT_335 = NL + "\t/**" + NL
+			+ "\t * This is for implementing {@link IEditorPart} and simply saves the model file." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_336 = NL + "\tpublic void doSave(IProgressMonitor progressMonitor)" + NL + "\t{" + NL
+			+ "\t\t// Save only resources that have actually changed." + NL + "\t\t//" + NL + "\t\tfinal ";
+	protected final String TEXT_337 = " saveOptions = new ";
+	protected final String TEXT_338 = NL
+			+ "\t\tsaveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);";
+	protected final String TEXT_339 = NL
+			+ "\t\tsaveOptions.put(Resource.OPTION_LINE_DELIMITER, Resource.OPTION_LINE_DELIMITER_UNSPECIFIED);";
+	protected final String TEXT_340 = NL + NL
+			+ "\t\t// Do the work within an operation because this is a long running activity that modifies the workbench."
+			+ NL + "\t\t//" + NL + "\t\t";
+	protected final String TEXT_341 = " operation =" + NL + "\t\t\tnew ";
+	protected final String TEXT_342 = "()" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// This is the method that gets invoked when the operation runs." + NL + "\t\t\t\t//";
+	protected final String TEXT_343 = NL + "\t\t\t\tpublic void ";
+	protected final String TEXT_344 = "(IProgressMonitor monitor)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\t// Save the resources to the file system." + NL + "\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\tboolean first = true;" + NL + "\t\t\t\t\t";
+	protected final String TEXT_345 = " resources = editingDomain.getResourceSet().getResources();" + NL
+			+ "\t\t\t\t\tfor (int i = 0; i < resources.size(); ++i)" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tResource resource = ";
+	protected final String TEXT_346 = "(Resource)";
+	protected final String TEXT_347 = "resources.get(i);" + NL
+			+ "\t\t\t\t\t\tif ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource))"
+			+ NL + "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\ttry" + NL + "\t\t\t\t\t\t\t{";
+	protected final String TEXT_348 = NL + "\t\t\t\t\t\t\t\tlong timeStamp = resource.getTimeStamp();" + NL
+			+ "\t\t\t\t\t\t\t\tresource.save(saveOptions);" + NL
+			+ "\t\t\t\t\t\t\t\tif (resource.getTimeStamp() != timeStamp)" + NL + "\t\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\t\tsavedResources.add(resource);" + NL + "\t\t\t\t\t\t\t\t}";
+	protected final String TEXT_349 = NL + "\t\t\t\t\t\t\t\tresource.save(saveOptions);" + NL
+			+ "\t\t\t\t\t\t\t\tsavedResources.add(resource);";
+	protected final String TEXT_350 = NL + "\t\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\t\tcatch (Exception exception)" + NL
+			+ "\t\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t\tresourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));"
+			+ NL + "\t\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\t\tfirst = false;" + NL + "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}"
+			+ NL + "\t\t\t\t}" + NL + "\t\t\t};" + NL + "" + NL + "\t\tupdateProblemIndication = false;" + NL
+			+ "\t\ttry" + NL + "\t\t{" + NL + "\t\t\t// This runs the options, and shows progress." + NL + "\t\t\t//"
+			+ NL + "\t\t\tnew ProgressMonitorDialog(getSite().getShell()).run(true, false, operation);" + NL + "" + NL
+			+ "\t\t\t// Refresh the necessary state." + NL + "\t\t\t//" + NL
+			+ "\t\t\t((BasicCommandStack)editingDomain.getCommandStack()).saveIsDone();" + NL
+			+ "\t\t\tfirePropertyChange(IEditorPart.PROP_DIRTY);" + NL + "\t\t}" + NL
+			+ "\t\tcatch (Exception exception)" + NL + "\t\t{" + NL + "\t\t\t// Something went wrong that shouldn't."
+			+ NL + "\t\t\t//" + NL + "\t\t\t";
+	protected final String TEXT_351 = ".INSTANCE.log(exception);" + NL + "\t\t}" + NL
+			+ "\t\tupdateProblemIndication = true;" + NL + "\t\tupdateProblemIndication();" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL
+			+ "\t * This returns whether something has been persisted to the URI of the specified resource." + NL
+			+ "\t * The implementation uses the URI converter from the editor's resource set to try to open an input stream."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected boolean isPersisted(Resource resource)" + NL + "\t{" + NL
+			+ "\t\tboolean result = false;" + NL + "\t\ttry" + NL + "\t\t{" + NL
+			+ "\t\t\tInputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI());"
+			+ NL + "\t\t\tif (stream != null)" + NL + "\t\t\t{" + NL + "\t\t\t\tresult = true;" + NL
+			+ "\t\t\t\tstream.close();" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\tcatch (IOException e)" + NL
+			+ "\t\t{" + NL + "\t\t\t// Ignore" + NL + "\t\t}" + NL + "\t\treturn result;" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * This always returns true because it is not currently supported." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_352 = NL + "\tpublic boolean isSaveAsAllowed()" + NL + "\t{" + NL + "\t\treturn true;"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * This also changes the editor's input." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_353 = NL + "\tpublic void doSaveAs()" + NL + "\t{";
+	protected final String TEXT_354 = NL + "\t\tnew ";
+	protected final String TEXT_355 = "(getSite().getShell(), null, SWT.NONE)" + NL + "\t\t\t{";
+	protected final String TEXT_356 = NL + "\t\t\t\tprotected boolean isSave()" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\treturn true;" + NL + "\t\t\t\t}" + NL;
+	protected final String TEXT_357 = NL + "\t\t\t\tprotected boolean processResources()" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\t";
+	protected final String TEXT_358 = " uris = getURIs();" + NL + "\t\t\t\t\tif (uris.size() > 0)" + NL + "\t\t\t\t\t{"
+			+ NL + "\t\t\t\t\t\tURI uri = ";
+	protected final String TEXT_359 = "uris.get(0);" + NL + "\t\t\t\t\t\tdoSaveAs(uri, new ";
+	protected final String TEXT_360 = "(uri));" + NL + "\t\t\t\t\t\treturn true;" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\telse" + NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\treturn false;" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t}" + NL + "\t\t\t}.open();";
+	protected final String TEXT_361 = NL + "\t\tString[] filters = ";
+	protected final String TEXT_362 = "(String[])";
+	protected final String TEXT_363 = "FILE_EXTENSION_FILTERS.toArray(new String[FILE_EXTENSION_FILTERS.size()]);" + NL
+			+ "\t\tString[] files = ";
+	protected final String TEXT_364 = ".openFilePathDialog(getSite().getShell(), ";
+	protected final String TEXT_365 = ".SAVE, filters);" + NL + "\t\tif (files.length > 0)" + NL + "\t\t{" + NL
+			+ "\t\t\tURI uri = URI.createFileURI(files[0]);" + NL + "\t\t\tdoSaveAs(uri, new ";
+	protected final String TEXT_366 = "(uri));" + NL + "\t\t}";
+	protected final String TEXT_367 = NL + "\t\tSaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());"
+			+ NL + "\t\tsaveAsDialog.open();" + NL + "\t\tIPath path = saveAsDialog.getResult();" + NL
+			+ "\t\tif (path != null)" + NL + "\t\t{" + NL
+			+ "\t\t\tIFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);" + NL
+			+ "\t\t\tif (file != null)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tdoSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file));"
+			+ NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_368 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected void doSaveAs(URI uri, IEditorInput editorInput)" + NL + "\t{" + NL + "\t\t(";
+	protected final String TEXT_369 = "editingDomain.getResourceSet().getResources().get(0)).setURI(uri);" + NL
+			+ "\t\tsetInputWithNotify(editorInput);" + NL + "\t\tsetPartName(editorInput.getName());" + NL
+			+ "\t\tIProgressMonitor progressMonitor =" + NL + "\t\t\tgetActionBars().getStatusLineManager() != null ?"
+			+ NL + "\t\t\t\tgetActionBars().getStatusLineManager().getProgressMonitor() :" + NL + "\t\t\t\tnew ";
+	protected final String TEXT_370 = "();" + NL + "\t\tdoSave(progressMonitor);" + NL + "\t}";
+	protected final String TEXT_371 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_372 = NL + "\tpublic void gotoMarker(IMarker marker)" + NL + "\t{";
+	protected final String TEXT_373 = NL + "\t\t";
+	protected final String TEXT_374 = " targetObjects = markerHelper.getTargetObjects(editingDomain, marker);" + NL
+			+ "\t\tif (!targetObjects.isEmpty())" + NL + "\t\t{" + NL + "\t\t\tsetSelectionToViewer(targetObjects);"
+			+ NL + "\t\t}";
+	protected final String TEXT_375 = NL + "\t\ttry" + NL + "\t\t{" + NL
+			+ "\t\t\tif (marker.isSubtypeOf(EValidator.MARKER))" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tString uriAttribute = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);" + NL
+			+ "\t\t\t\tif (uriAttribute != null)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tURI uri = URI.createURI(uriAttribute);" + NL
+			+ "\t\t\t\t\tEObject eObject = editingDomain.getResourceSet().getEObject(uri, true);" + NL
+			+ "\t\t\t\t\tif (eObject != null)" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t  setSelectionToViewer(Collections.singleton(editingDomain.getWrapper(eObject)));" + NL
+			+ "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL
+			+ "\t\tcatch (CoreException exception)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_376 = ".INSTANCE.log(exception);" + NL + "\t\t}";
+	protected final String TEXT_377 = NL + "\t}";
+	protected final String TEXT_378 = NL + NL + "\t/**" + NL + "\t * This is called during startup." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_379 = NL + "\tpublic void init(IEditorSite site, IEditorInput editorInput)" + NL + "\t{"
+			+ NL + "\t\tsetSite(site);" + NL + "\t\tsetInputWithNotify(editorInput);" + NL
+			+ "\t\tsetPartName(editorInput.getName());" + NL + "\t\tsite.setSelectionProvider(this);" + NL
+			+ "\t\tsite.getPage().addPartListener(partListener);";
+	protected final String TEXT_380 = NL
+			+ "\t\tResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);";
+	protected final String TEXT_381 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_382 = NL + "\tpublic void setFocus()" + NL + "\t{";
+	protected final String TEXT_383 = NL + "\t\tif (currentViewerPane != null)" + NL + "\t\t{" + NL
+			+ "\t\t\tcurrentViewerPane.setFocus();" + NL + "\t\t}" + NL + "\t\telse" + NL + "\t\t{" + NL
+			+ "\t\t\tgetControl(getActivePage()).setFocus();" + NL + "\t\t}";
+	protected final String TEXT_384 = NL + "\t\tgetControl(getActivePage()).setFocus();";
+	protected final String TEXT_385 = NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_386 = NL
+			+ "\tpublic void addSelectionChangedListener(ISelectionChangedListener listener)" + NL + "\t{" + NL
+			+ "\t\tselectionChangedListeners.add(listener);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_387 = NL
+			+ "\tpublic void removeSelectionChangedListener(ISelectionChangedListener listener)" + NL + "\t{" + NL
+			+ "\t\tselectionChangedListeners.remove(listener);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to return this editor's overall selection."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_388 = NL + "\tpublic ISelection getSelection()" + NL + "\t{" + NL
+			+ "\t\treturn editorSelection;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to set this editor's overall selection."
+			+ NL + "\t * Calling this result will notify the listeners." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_389 = NL + "\tpublic void setSelection(ISelection selection)" + NL + "\t{" + NL
+			+ "\t\teditorSelection = selection;" + NL;
+	protected final String TEXT_390 = NL + "\t\tfor (ISelectionChangedListener listener : selectionChangedListeners)";
+	protected final String TEXT_391 = NL
+			+ "\t\tfor (Iterator listeners = selectionChangedListeners.iterator(); listeners.hasNext(); )";
+	protected final String TEXT_392 = NL
+			+ "\t\t\tISelectionChangedListener listener = (ISelectionChangedListener)listeners.next();";
+	protected final String TEXT_393 = NL
+			+ "\t\t\tlistener.selectionChanged(new SelectionChangedEvent(this, selection));" + NL + "\t\t}" + NL
+			+ "\t\tsetStatusLineManager(selection);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic void setStatusLineManager(ISelection selection)" + NL + "\t{" + NL
+			+ "\t\tIStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ?"
+			+ NL + "\t\t\tcontentOutlineStatusLineManager : getActionBars().getStatusLineManager();" + NL + "" + NL
+			+ "\t\tif (statusLineManager != null)" + NL + "\t\t{" + NL
+			+ "\t\t\tif (selection instanceof IStructuredSelection)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_394 = " collection = ((IStructuredSelection)selection).toList();" + NL
+			+ "\t\t\t\tswitch (collection.size())" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tcase 0:" + NL + "\t\t\t\t\t{"
+			+ NL + "\t\t\t\t\t\tstatusLineManager.setMessage(getString(\"_UI_NoObjectSelected\"));";
+	protected final String TEXT_395 = NL + "\t\t\t\t\t\tbreak;" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t\tcase 1:" + NL
+			+ "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tString text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());"
+			+ NL + "\t\t\t\t\t\tstatusLineManager.setMessage(getString(\"_UI_SingleObjectSelected\", text));";
+	protected final String TEXT_396 = NL + "\t\t\t\t\t\tbreak;" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t\tdefault:" + NL
+			+ "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tstatusLineManager.setMessage(getString(\"_UI_MultiObjectSelected\", Integer.toString(collection.size())));";
+	protected final String TEXT_397 = NL + "\t\t\t\t\t\tbreak;" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t}"
+			+ NL + "\t\t\telse" + NL + "\t\t\t{" + NL + "\t\t\t\tstatusLineManager.setMessage(\"\");";
+	protected final String TEXT_398 = NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This looks up a string in the plugin's plugin.properties file." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static String getString(String key)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_399 = ".INSTANCE.getString(key);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This looks up a string in plugin.properties, making a substitution." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static String getString(String key, Object s1)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_400 = ".INSTANCE.getString(key, new Object [] { s1 });" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL
+			+ "\t * This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions from the Edit menu."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_401 = NL + "\tpublic void menuAboutToShow(IMenuManager menuManager)" + NL + "\t{" + NL
+			+ "\t\t((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic EditingDomainActionBarContributor getActionBarContributor()" + NL + "\t{" + NL
+			+ "\t\treturn (EditingDomainActionBarContributor)getEditorSite().getActionBarContributor();" + NL + "\t}"
+			+ NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tpublic IActionBars getActionBars()" + NL + "\t{" + NL
+			+ "\t\treturn getActionBarContributor().getActionBars();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic AdapterFactory getAdapterFactory()" + NL + "\t{" + NL + "\t\treturn adapterFactory;" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_402 = NL + "\tpublic void dispose()" + NL + "\t{" + NL
+			+ "\t\tupdateProblemIndication = false;" + NL;
+	protected final String TEXT_403 = NL
+			+ "\t\tResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);" + NL;
+	protected final String TEXT_404 = NL + "\t\tgetSite().getPage().removePartListener(partListener);" + NL + "" + NL
+			+ "\t\tadapterFactory.dispose();" + NL + "" + NL
+			+ "\t\tif (getActionBarContributor().getActiveEditor() == this)" + NL + "\t\t{" + NL
+			+ "\t\t\tgetActionBarContributor().setActiveEditor(null);" + NL + "\t\t}" + NL;
+	protected final String TEXT_405 = NL + "\t\tfor (PropertySheetPage propertySheetPage : propertySheetPages)";
+	protected final String TEXT_406 = NL + "\t\tfor (Iterator i = propertySheetPages.iterator(); i.hasNext(); )";
+	protected final String TEXT_407 = NL + "\t\t\tPropertySheetPage propertySheetPage = (PropertySheetPage)i.next();";
+	protected final String TEXT_408 = NL + "\t\t\tpropertySheetPage.dispose();" + NL + "\t\t}" + NL + "" + NL
+			+ "\t\tif (contentOutlinePage != null)" + NL + "\t\t{" + NL + "\t\t\tcontentOutlinePage.dispose();" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\tsuper.dispose();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns whether the outline view should be presented to the user." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected boolean showOutlineView()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_409 = ";" + NL + "\t}" + NL + "}";
+	protected final String TEXT_410 = NL;
+
+	public Editor() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_410);
+		stringBuffer.append(TEXT_410);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getEditorDirectory();
+		packageName = genPackage.getPresentationPackageName();
+		className = genPackage.getEditorClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2019 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();
+		String importedOperationClassName = genModel
+				.getImportedName(genModel.isRichClientPlatform() ? "org.eclipse.jface.operation.IRunnableWithProgress"
+						: "org.eclipse.ui.actions.WorkspaceModifyOperation");
+		String operationMethodName = genModel.isRichClientPlatform() ? "run" : "execute";
+		String _ArrayListOfObject = "ArrayList" + (genModel.useGenerics() ? "<Object>" : "");
+		String _ArrayListOfSelectionChangedListener = "ArrayList"
+				+ (genModel.useGenerics() ? "<ISelectionChangedListener>" : "");
+		String _CollectionOfSelectionChangedListener = "Collection"
+				+ (genModel.useGenerics() ? "<ISelectionChangedListener>" : "");
+		String _ListOfResource = "List" + (genModel.useGenerics() ? "<Resource>" : "");
+		String _ArrayListOfResource = "ArrayList" + (genModel.useGenerics() ? "<Resource>" : "");
+		String _CollectionOfResource = "Collection" + (genModel.useGenerics() ? "<Resource>" : "");
+		String _MapOfResourceToDiagnostic = "Map" + (genModel.useGenerics() ? "<Resource, Diagnostic>" : "");
+		String _HashMapOfResourceToBoolean = "HashMap" + (genModel.useGenerics() ? "<Resource, Boolean>" : "");
+		String _MapOfObjectToObject = "Map" + (genModel.useGenerics() ? "<Object, Object>" : "");
+		String _HashMapOfObjectToObject = "HashMap" + (genModel.useGenerics() ? "<Object, Object>" : "");
+		String _LinkedHashMapOfResourceToDiagnostic = "LinkedHashMap"
+				+ (genModel.useGenerics() ? "<Resource, Diagnostic>" : "");
+		String _CollectionOfAnything = "Collection" + (genModel.useGenerics() ? "<?>" : "");
+		String _ListOfAnything = "List" + (genModel.useGenerics() ? "<?>" : "");
+		boolean useExtendedLabelProvider = genModel.isStyleProviders() || genModel.isFontProviders()
+				|| genModel.isColorProviders();
+		boolean useStyledLabelProvider = genModel.isStyleProviders();
+		String _AdapterFactoryLabelProvider = (useStyledLabelProvider
+				? "AdapterFactoryLabelProvider.StyledLabelProvider"
+				: "AdapterFactoryLabelProvider"
+						+ (genModel.isFontProviders() && genModel.isColorProviders() ? ".FontAndColorProvider"
+								: genModel.isFontProviders() ? ".FontProvider"
+										: genModel.isColorProviders() ? ".ColorProvider" : ""));
+		String _DelegatingAdapterFactoryLabelProvider = useStyledLabelProvider
+				? genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DelegatingStyledCellLabelProvider")
+						+ (genModel.isFontProviders() && genModel.isColorProviders() ? ".FontAndColorProvider"
+								: genModel.isFontProviders() ? ".FontProvider"
+										: genModel.isColorProviders() ? ".ColorProvider" : "")
+				: "";
+		String _DecoratingColumLabelProvider = genModel.getDecoration() != GenDecoration.NONE
+				? genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider")
+						+ (useStyledLabelProvider ? ".StyledLabelProvider" : "")
+				: "";
+		String _DiagnosticDecorator = genModel.getDecoration() != GenDecoration.NONE
+				? genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DiagnosticDecorator")
+						+ (useStyledLabelProvider ? ".Styled" : "")
+				: "";
+		String _ArrayListOfString = "ArrayList" + (genModel.useGenerics() ? "<String>" : "");
+		String _ListOfString = "List" + (genModel.useGenerics() ? "<String>" : "");
+		String _ListOfPropertySheetPage = "List" + (genModel.useGenerics() ? "<PropertySheetPage>" : "");
+		String _ArrayListOfPropertySheetPage = "ArrayList" + (genModel.useGenerics() ? "<PropertySheetPage>" : "");
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getPresentationPackageName());
+		stringBuffer.append(TEXT_3);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_4);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_6);
+		}
+		stringBuffer.append(TEXT_7);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {
+			stringBuffer.append(TEXT_8);
+		}
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_11);
+		}
+		stringBuffer.append(TEXT_12);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_13);
+		}
+		stringBuffer.append(TEXT_14);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {
+			stringBuffer.append(TEXT_15);
+		}
+		stringBuffer.append(TEXT_16);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_17);
+		}
+		stringBuffer.append(TEXT_18);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_20);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_21);
+		}
+		stringBuffer.append(TEXT_22);
+		if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_25);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_26);
+		}
+		stringBuffer.append(TEXT_27);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_28);
+		}
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_29);
+		}
+		stringBuffer.append(TEXT_30);
+		if (!genModel.isRichClientPlatform()
+				&& genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF23_VALUE) {
+			stringBuffer.append(TEXT_31);
+		}
+		stringBuffer.append(TEXT_32);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {
+			stringBuffer.append(TEXT_33);
+		}
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_34);
+		}
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
+			stringBuffer.append(TEXT_35);
+		}
+		stringBuffer.append(TEXT_36);
+		stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+		stringBuffer.append(TEXT_37);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_38);
+		stringBuffer.append(genPackage.getPrefix());
+		stringBuffer.append(TEXT_39);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_40);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_41);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_42);
+		}
+		stringBuffer.append(TEXT_43);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_44);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_45);
+		}
+		if (genModel.isRevertAction()) {
+			stringBuffer.append(TEXT_46);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.util.IRevertablePart"));
+		}
+		stringBuffer.append(TEXT_47);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_48);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_50);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_5);
+		}
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_51);
+			if (genPackage.isGenerateModelWizard()) {
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(_ListOfString);
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genPackage.getImportedModelWizardClassName());
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_55);
+			} else {
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(_ListOfString);
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genModel.getImportedName("java.util.Arrays"));
+				stringBuffer.append(TEXT_56);
+				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+				stringBuffer.append(TEXT_57);
+				stringBuffer.append(genPackage.getEditorClassName());
+				stringBuffer.append(TEXT_58);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(genModel.getNonNLS(3));
+				stringBuffer.append(TEXT_55);
+			}
+			stringBuffer.append(TEXT_59);
+			stringBuffer.append(_ListOfString);
+			stringBuffer.append(TEXT_60);
+			stringBuffer.append(_ListOfString);
+			stringBuffer.append(TEXT_61);
+			stringBuffer.append(_ListOfString);
+			stringBuffer.append(TEXT_62);
+			stringBuffer.append(_ArrayListOfString);
+			stringBuffer.append(TEXT_63);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_64);
+			} else {
+				stringBuffer.append(TEXT_65);
+			}
+			stringBuffer.append(TEXT_66);
+		}
+		stringBuffer.append(TEXT_67);
+		stringBuffer.append(_ListOfPropertySheetPage);
+		stringBuffer.append(TEXT_68);
+		stringBuffer.append(_ArrayListOfPropertySheetPage);
+		stringBuffer.append(TEXT_69);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_70);
+		}
+		stringBuffer.append(TEXT_71);
+		stringBuffer.append(_CollectionOfSelectionChangedListener);
+		stringBuffer.append(TEXT_72);
+		stringBuffer.append(_ArrayListOfSelectionChangedListener);
+		stringBuffer.append(TEXT_73);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_74);
+		}
+		stringBuffer.append(TEXT_75);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_77);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_78);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_79);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_80);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_81);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_82);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_83);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_84);
+		stringBuffer.append(_CollectionOfResource);
+		stringBuffer.append(TEXT_85);
+		stringBuffer.append(_ArrayListOfResource);
+		stringBuffer.append(TEXT_86);
+		stringBuffer.append(_CollectionOfResource);
+		stringBuffer.append(TEXT_87);
+		stringBuffer.append(_ArrayListOfResource);
+		stringBuffer.append(TEXT_88);
+		stringBuffer.append(_CollectionOfResource);
+		stringBuffer.append(TEXT_89);
+		stringBuffer.append(_ArrayListOfResource);
+		stringBuffer.append(TEXT_90);
+		stringBuffer.append(_MapOfResourceToDiagnostic);
+		stringBuffer.append(TEXT_91);
+		stringBuffer.append(_LinkedHashMapOfResourceToDiagnostic);
+		stringBuffer.append(TEXT_92);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_93);
+		if (forceDefaultCase) {
+			stringBuffer.append(TEXT_94);
+		}
+		stringBuffer.append(TEXT_95);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_96);
+		}
+		stringBuffer.append(TEXT_97);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_98);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_99);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_100);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_76);
+			}
+			stringBuffer.append(TEXT_101);
+			stringBuffer.append(_CollectionOfResource);
+			stringBuffer.append(TEXT_87);
+			stringBuffer.append(_ArrayListOfResource);
+			stringBuffer.append(TEXT_102);
+			stringBuffer.append(_CollectionOfResource);
+			stringBuffer.append(TEXT_85);
+			stringBuffer.append(_ArrayListOfResource);
+			stringBuffer.append(TEXT_103);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_105);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_106);
+			}
+			stringBuffer.append(TEXT_107);
+			if (genModel.getDecoration() == GenDecoration.NONE) {
+				stringBuffer.append(TEXT_108);
+			}
+			stringBuffer.append(TEXT_109);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_106);
+			}
+			stringBuffer.append(TEXT_110);
+			if (genModel.getDecoration() == GenDecoration.NONE) {
+				stringBuffer.append(TEXT_111);
+			} else {
+				stringBuffer.append(TEXT_112);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_113);
+				if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF211_VALUE) {
+					stringBuffer.append(TEXT_114);
+				}
+				stringBuffer.append(TEXT_115);
+			}
+			stringBuffer.append(TEXT_116);
+			stringBuffer.append(_CollectionOfResource);
+			stringBuffer.append(TEXT_117);
+			stringBuffer.append(_CollectionOfResource);
+			stringBuffer.append(TEXT_118);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_119);
+			}
+			stringBuffer.append(TEXT_120);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_121);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_119);
+			}
+			stringBuffer.append(TEXT_122);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_123);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_124);
+		}
+		stringBuffer.append(TEXT_125);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_126);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_127);
+		} else {
+			stringBuffer.append(TEXT_128);
+		}
+		stringBuffer.append(TEXT_129);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_130);
+		}
+		stringBuffer.append(TEXT_131);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+			stringBuffer.append(TEXT_132);
+		}
+		stringBuffer.append(TEXT_133);
+		stringBuffer.append(genPackage.getGenModel().getEditorPluginID());
+		stringBuffer.append(TEXT_134);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_135);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_136);
+		} else {
+			stringBuffer.append(TEXT_137);
+		}
+		stringBuffer.append(TEXT_129);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_138);
+		}
+		stringBuffer.append(TEXT_139);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_140);
+		}
+		stringBuffer.append(TEXT_141);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_142);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_143);
+			if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF213_VALUE) {
+				stringBuffer.append(TEXT_144);
+				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+				stringBuffer.append(TEXT_145);
+			} else {
+				stringBuffer.append(TEXT_146);
+				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+				stringBuffer.append(TEXT_147);
+			}
+			stringBuffer.append(TEXT_148);
+		}
+		stringBuffer.append(TEXT_149);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_150);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_151);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_152);
+		stringBuffer.append(TEXT_5);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.editor.call.Editor.Editor.addItemProviderFactories.override" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,importedOperationClassName:importedOperationClassName,operationMethodName:operationMethodName,_ArrayListOfObject:_ArrayListOfObject,_ArrayListOfSelectionChangedListener:_ArrayListOfSelectionChangedListener,_CollectionOfSelectionChangedListener:_CollectionOfSelectionChangedListener,_ListOfResource:_ListOfResource,_ArrayListOfResource:_ArrayListOfResource,_CollectionOfResource:_CollectionOfResource,_MapOfResourceToDiagnostic:_MapOfResourceToDiagnostic,_HashMapOfResourceToBoolean:_HashMapOfResourceToBoolean,_MapOfObjectToObject:_MapOfObjectToObject,_HashMapOfObjectToObject:_HashMapOfObjectToObject,_LinkedHashMapOfResourceToDiagnostic:_LinkedHashMapOfResourceToDiagnostic,_CollectionOfAnything:_CollectionOfAnything,_ListOfAnything:_ListOfAnything,useExtendedLabelProvider:useExtendedLabelProvider,useStyledLabelProvider:useStyledLabelProvider,_AdapterFactoryLabelProvider:_AdapterFactoryLabelProvider,_DelegatingAdapterFactoryLabelProvider:_DelegatingAdapterFactoryLabelProvider,_DecoratingColumLabelProvider:_DecoratingColumLabelProvider,_DiagnosticDecorator:_DiagnosticDecorator,_ArrayListOfString:_ArrayListOfString,_ListOfString:_ListOfString,_ListOfPropertySheetPage:_ListOfPropertySheetPage,_ArrayListOfPropertySheetPage:_ArrayListOfPropertySheetPage"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("importedOperationClassName", importedOperationClassName);
+			callParameters.put("operationMethodName", operationMethodName);
+			callParameters.put("_ArrayListOfObject", _ArrayListOfObject);
+			callParameters.put("_ArrayListOfSelectionChangedListener", _ArrayListOfSelectionChangedListener);
+			callParameters.put("_CollectionOfSelectionChangedListener", _CollectionOfSelectionChangedListener);
+			callParameters.put("_ListOfResource", _ListOfResource);
+			callParameters.put("_ArrayListOfResource", _ArrayListOfResource);
+			callParameters.put("_CollectionOfResource", _CollectionOfResource);
+			callParameters.put("_MapOfResourceToDiagnostic", _MapOfResourceToDiagnostic);
+			callParameters.put("_HashMapOfResourceToBoolean", _HashMapOfResourceToBoolean);
+			callParameters.put("_MapOfObjectToObject", _MapOfObjectToObject);
+			callParameters.put("_HashMapOfObjectToObject", _HashMapOfObjectToObject);
+			callParameters.put("_LinkedHashMapOfResourceToDiagnostic", _LinkedHashMapOfResourceToDiagnostic);
+			callParameters.put("_CollectionOfAnything", _CollectionOfAnything);
+			callParameters.put("_ListOfAnything", _ListOfAnything);
+			callParameters.put("useExtendedLabelProvider", useExtendedLabelProvider);
+			callParameters.put("useStyledLabelProvider", useStyledLabelProvider);
+			callParameters.put("_AdapterFactoryLabelProvider", _AdapterFactoryLabelProvider);
+			callParameters.put("_DelegatingAdapterFactoryLabelProvider", _DelegatingAdapterFactoryLabelProvider);
+			callParameters.put("_DecoratingColumLabelProvider", _DecoratingColumLabelProvider);
+			callParameters.put("_DiagnosticDecorator", _DiagnosticDecorator);
+			callParameters.put("_ArrayListOfString", _ArrayListOfString);
+			callParameters.put("_ListOfString", _ListOfString);
+			callParameters.put("_ListOfPropertySheetPage", _ListOfPropertySheetPage);
+			callParameters.put("_ArrayListOfPropertySheetPage", _ArrayListOfPropertySheetPage);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_08-MQWJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//Editor/addItemproviderFactories.override.javajetinc"
+		stringBuffer.append(TEXT_153);
+		if (genModel.getDecoration() != GenDecoration.LIVE
+				|| genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF212_VALUE) {
+			stringBuffer.append(TEXT_154);
+		} else {
+			stringBuffer.append(TEXT_155);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_156);
+			}
+			stringBuffer.append(TEXT_157);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.command.AbstractCommand"));
+			stringBuffer.append(TEXT_158);
+			stringBuffer.append(_DiagnosticDecorator);
+			stringBuffer.append(TEXT_159);
+		}
+		stringBuffer.append(TEXT_160);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_161);
+		}
+		stringBuffer.append(TEXT_162);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_163);
+		}
+		stringBuffer.append(TEXT_164);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_165);
+		}
+		stringBuffer.append(TEXT_166);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_167);
+		}
+		stringBuffer.append(TEXT_168);
+		stringBuffer.append(_HashMapOfResourceToBoolean);
+		stringBuffer.append(TEXT_169);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_76);
+		}
+		stringBuffer.append(TEXT_170);
+		stringBuffer.append(_CollectionOfAnything);
+		stringBuffer.append(TEXT_171);
+		stringBuffer.append(_CollectionOfAnything);
+		stringBuffer.append(TEXT_172);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_173);
+		}
+		stringBuffer.append(TEXT_174);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_176);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_177);
+		}
+		stringBuffer.append(TEXT_178);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_177);
+		}
+		stringBuffer.append(TEXT_179);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_177);
+		}
+		stringBuffer.append(TEXT_180);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_177);
+		}
+		stringBuffer.append(TEXT_181);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_182);
+		}
+		stringBuffer.append(TEXT_183);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_104);
+		}
+		stringBuffer.append(TEXT_184);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_185);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_186);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_187);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {
+			stringBuffer.append(TEXT_188);
+		} else {
+			stringBuffer.append(TEXT_189);
+		}
+		stringBuffer.append(TEXT_190);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {
+			stringBuffer.append(TEXT_191);
+		}
+		stringBuffer.append(TEXT_192);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF211_VALUE) {
+			stringBuffer.append(TEXT_193);
+		} else if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {
+			stringBuffer.append(TEXT_194);
+		} else if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_195);
+		} else {
+			stringBuffer.append(TEXT_196);
+		}
+		stringBuffer.append(TEXT_197);
+		stringBuffer.append(genPackage.getGenModel().getEditorPluginID());
+		stringBuffer.append(TEXT_134);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_198);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_199);
+		stringBuffer.append(genPackage.getGenModel().getEditorPluginID());
+		stringBuffer.append(TEXT_134);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_198);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_200);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_201);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_202);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_203);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_204);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_205);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DecoratingColumLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_209);
+			}
+			stringBuffer.append(TEXT_210);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_211);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_212);
+				if (genModel.getDecoration() == GenDecoration.MANUAL) {
+					stringBuffer.append(TEXT_213);
+				}
+				stringBuffer.append(TEXT_209);
+				if (genModel.getDecoration() == GenDecoration.LIVE) {
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+					stringBuffer.append(TEXT_214);
+				}
+				stringBuffer.append(TEXT_215);
+			}
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_216);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_217);
+				stringBuffer.append(genModel.getImportedName(
+						"org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport"));
+				stringBuffer.append(TEXT_218);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_219);
+			}
+			stringBuffer.append(TEXT_220);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_221);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_203);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_204);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_222);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_223);
+			}
+			stringBuffer.append(TEXT_210);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_224);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_225);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_203);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_226);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_227);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_228);
+			}
+			stringBuffer.append(TEXT_210);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_229);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_230);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_203);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_231);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_232);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DecoratingColumLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_233);
+			}
+			stringBuffer.append(TEXT_210);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_211);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_212);
+				if (genModel.getDecoration() == GenDecoration.MANUAL) {
+					stringBuffer.append(TEXT_213);
+				}
+				stringBuffer.append(TEXT_234);
+			}
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_235);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_217);
+				stringBuffer.append(genModel.getImportedName(
+						"org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport"));
+				stringBuffer.append(TEXT_236);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_237);
+			}
+			stringBuffer.append(TEXT_238);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_239);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_203);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_240);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_241);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_242);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_243);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_244);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DecoratingColumLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_245);
+			}
+			stringBuffer.append(TEXT_210);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_211);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_212);
+				if (genModel.getDecoration() == GenDecoration.MANUAL) {
+					stringBuffer.append(TEXT_213);
+				}
+				stringBuffer.append(TEXT_245);
+				if (genModel.getDecoration() == GenDecoration.LIVE) {
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+					stringBuffer.append(TEXT_214);
+				}
+				stringBuffer.append(TEXT_215);
+			}
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_246);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_217);
+				stringBuffer.append(genModel.getImportedName(
+						"org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport"));
+				stringBuffer.append(TEXT_247);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_248);
+			}
+			stringBuffer.append(TEXT_249);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_250);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_203);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_231);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_104);
+			}
+			stringBuffer.append(TEXT_251);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_252);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_253);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_254);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DecoratingColumLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_255);
+			}
+			stringBuffer.append(TEXT_210);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_211);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_212);
+				if (genModel.getDecoration() == GenDecoration.MANUAL) {
+					stringBuffer.append(TEXT_213);
+				}
+				stringBuffer.append(TEXT_255);
+				if (genModel.getDecoration() == GenDecoration.LIVE) {
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+					stringBuffer.append(TEXT_214);
+				}
+				stringBuffer.append(TEXT_215);
+			}
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_246);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_217);
+				stringBuffer.append(genModel.getImportedName(
+						"org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport"));
+				stringBuffer.append(TEXT_256);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_257);
+			}
+			stringBuffer.append(TEXT_258);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_148);
+		} else {
+			stringBuffer.append(TEXT_259);
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_206);
+				stringBuffer.append(_DecoratingColumLabelProvider);
+				stringBuffer.append(TEXT_207);
+			}
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_AdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_208);
+			if (useExtendedLabelProvider) {
+				stringBuffer.append(TEXT_209);
+			}
+			stringBuffer.append(TEXT_210);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_211);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_212);
+				if (genModel.getDecoration() == GenDecoration.MANUAL) {
+					stringBuffer.append(TEXT_213);
+				}
+				stringBuffer.append(TEXT_209);
+				if (genModel.getDecoration() == GenDecoration.LIVE) {
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+					stringBuffer.append(TEXT_214);
+				}
+				stringBuffer.append(TEXT_215);
+			}
+			if (useStyledLabelProvider) {
+				stringBuffer.append(TEXT_210);
+			}
+			stringBuffer.append(TEXT_260);
+			if (genModel.getDecoration() != GenDecoration.NONE) {
+				stringBuffer.append(TEXT_261);
+				stringBuffer.append(genModel.getImportedName(
+						"org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport"));
+				stringBuffer.append(TEXT_218);
+				stringBuffer.append(_DiagnosticDecorator);
+				stringBuffer.append(TEXT_219);
+			}
+			stringBuffer.append(TEXT_262);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		stringBuffer.append(TEXT_263);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_264);
+		}
+		stringBuffer.append(TEXT_265);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_266);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_161);
+		}
+		stringBuffer.append(TEXT_267);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_268);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_269);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_270);
+		if (genModel.useGenerics()
+				&& genModel.getEclipsePlatformVersion().getValue() < GenEclipsePlatformVersion.MARS_VALUE) {
+			stringBuffer.append(TEXT_271);
+			if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF26_VALUE) {
+				stringBuffer.append(TEXT_272);
+			} else {
+				stringBuffer.append(TEXT_273);
+			}
+			stringBuffer.append(TEXT_274);
+		}
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {
+			stringBuffer.append(TEXT_275);
+		} else {
+			stringBuffer.append(TEXT_276);
+		}
+		stringBuffer.append(TEXT_277);
+		if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {
+			stringBuffer.append(TEXT_278);
+		} else {
+			stringBuffer.append(TEXT_279);
+		}
+		stringBuffer.append(TEXT_280);
+		if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {
+			stringBuffer.append(TEXT_281);
+		} else {
+			stringBuffer.append(TEXT_282);
+		}
+		stringBuffer.append(TEXT_283);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_284);
+			if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {
+				stringBuffer.append(TEXT_285);
+			} else {
+				stringBuffer.append(TEXT_286);
+			}
+			stringBuffer.append(TEXT_283);
+		}
+		if (genModel.isFindAction()) {
+			stringBuffer.append(TEXT_287);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.text.IFindReplaceTarget"));
+			stringBuffer.append(TEXT_288);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.ui.util.FindAndReplaceTarget"));
+			stringBuffer.append(TEXT_289);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_290);
+		}
+		stringBuffer.append(TEXT_291);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_292);
+		if (useStyledLabelProvider) {
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_DelegatingAdapterFactoryLabelProvider);
+			stringBuffer.append(TEXT_207);
+		}
+		if (genModel.getDecoration() != GenDecoration.NONE) {
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(_DecoratingColumLabelProvider);
+			stringBuffer.append(TEXT_207);
+		}
+		stringBuffer.append(TEXT_206);
+		stringBuffer.append(_AdapterFactoryLabelProvider);
+		stringBuffer.append(TEXT_208);
+		if (useExtendedLabelProvider) {
+			stringBuffer.append(TEXT_293);
+		}
+		stringBuffer.append(TEXT_210);
+		if (genModel.getDecoration() != GenDecoration.NONE) {
+			stringBuffer.append(TEXT_211);
+			stringBuffer.append(_DiagnosticDecorator);
+			stringBuffer.append(TEXT_212);
+			if (genModel.getDecoration() == GenDecoration.MANUAL) {
+				stringBuffer.append(TEXT_213);
+			}
+			stringBuffer.append(TEXT_293);
+			if (genModel.getDecoration() == GenDecoration.LIVE) {
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+				stringBuffer.append(TEXT_214);
+			}
+			stringBuffer.append(TEXT_215);
+		}
+		if (useStyledLabelProvider) {
+			stringBuffer.append(TEXT_210);
+		}
+		stringBuffer.append(TEXT_294);
+		if (genModel.getDecoration() != GenDecoration.NONE) {
+			stringBuffer.append(TEXT_295);
+			stringBuffer.append(genModel
+					.getImportedName("org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport"));
+			stringBuffer.append(TEXT_296);
+			stringBuffer.append(_DiagnosticDecorator);
+			stringBuffer.append(TEXT_297);
+		}
+		stringBuffer.append(TEXT_298);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_299);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_300);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_264);
+		}
+		stringBuffer.append(TEXT_301);
+		if (genModel.getDecoration() == GenDecoration.MANUAL) {
+			stringBuffer.append(TEXT_302);
+		} else if (genModel.getDecoration() == GenDecoration.LIVE) {
+			stringBuffer.append(TEXT_303);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_214);
+		}
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF214_VALUE) {
+			stringBuffer.append(TEXT_46);
+			if (genModel.getDecoration() == GenDecoration.NONE) {
+				stringBuffer.append(TEXT_304);
+			}
+			if (genModel.getDecoration() != GenDecoration.LIVE) {
+				stringBuffer.append(TEXT_305);
+			}
+			stringBuffer.append(genModel.getAutoExpandProperties());
+			stringBuffer.append(TEXT_46);
+			stringBuffer.append(genModel.isAutoResizeProperties());
+		}
+		stringBuffer.append(TEXT_306);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_307);
+		stringBuffer.append(_ListOfAnything);
+		stringBuffer.append(TEXT_308);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_309);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_310);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_311);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_312);
+		} else {
+			stringBuffer.append(TEXT_313);
+		}
+		stringBuffer.append(TEXT_314);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_315);
+		}
+		stringBuffer.append(TEXT_316);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_317);
+			stringBuffer.append(_ArrayListOfObject);
+			stringBuffer.append(TEXT_318);
+			stringBuffer.append(_ArrayListOfObject);
+			stringBuffer.append(TEXT_319);
+		} else {
+			stringBuffer.append(TEXT_320);
+			stringBuffer.append(_ArrayListOfObject);
+			stringBuffer.append(TEXT_318);
+			stringBuffer.append(_ArrayListOfObject);
+			stringBuffer.append(TEXT_321);
+		}
+		stringBuffer.append(TEXT_322);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_323);
+		if (genModel.isRevertAction()) {
+			stringBuffer.append(TEXT_324);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_175);
+			}
+			stringBuffer.append(TEXT_325);
+			if (genModel.getDecoration() == GenDecoration.LIVE) {
+				stringBuffer.append(TEXT_326);
+			}
+			stringBuffer.append(TEXT_327);
+			stringBuffer.append(_ListOfResource);
+			stringBuffer.append(TEXT_328);
+			stringBuffer.append(_ListOfResource);
+			stringBuffer.append(TEXT_329);
+			stringBuffer.append(_ArrayListOfResource);
+			stringBuffer.append(TEXT_330);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_331);
+			} else {
+				stringBuffer.append(TEXT_332);
+			}
+			stringBuffer.append(TEXT_333);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_130);
+			}
+			stringBuffer.append(TEXT_334);
+		}
+		stringBuffer.append(TEXT_335);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_336);
+		stringBuffer.append(_MapOfObjectToObject);
+		stringBuffer.append(TEXT_337);
+		stringBuffer.append(_HashMapOfObjectToObject);
+		stringBuffer.append(TEXT_63);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {
+			stringBuffer.append(TEXT_338);
+		}
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {
+			stringBuffer.append(TEXT_339);
+		}
+		stringBuffer.append(TEXT_340);
+		stringBuffer.append(importedOperationClassName);
+		stringBuffer.append(TEXT_341);
+		stringBuffer.append(importedOperationClassName);
+		stringBuffer.append(TEXT_342);
+		if (genModel.useInterfaceOverrideAnnotation()
+				|| !genModel.isRichClientPlatform() && genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_156);
+		}
+		stringBuffer.append(TEXT_343);
+		stringBuffer.append(operationMethodName);
+		stringBuffer.append(TEXT_344);
+		stringBuffer.append(_ListOfResource);
+		stringBuffer.append(TEXT_345);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_346);
+		}
+		stringBuffer.append(TEXT_347);
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+			stringBuffer.append(TEXT_348);
+		} else {
+			stringBuffer.append(TEXT_349);
+		}
+		stringBuffer.append(TEXT_350);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_351);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_352);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_353);
+		if (genModel.isRichClientPlatform()) {
+			if (genModel.isRichAjaxPlatform()) {
+				stringBuffer.append(TEXT_354);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.dialogs.ResourceDialog"));
+				stringBuffer.append(TEXT_355);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_156);
+				}
+				stringBuffer.append(TEXT_356);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_156);
+				}
+				stringBuffer.append(TEXT_357);
+				stringBuffer.append("List" + (genModel.useGenerics() ? "<URI>" : ""));
+				stringBuffer.append(TEXT_358);
+				stringBuffer.append(genModel.useGenerics() ? "" : "(URI)");
+				stringBuffer.append(TEXT_359);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.URIEditorInput"));
+				stringBuffer.append(TEXT_360);
+			} else {
+				stringBuffer.append(TEXT_361);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_362);
+				}
+				stringBuffer.append(TEXT_363);
+				stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName()));
+				stringBuffer.append(TEXT_364);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.SWT"));
+				stringBuffer.append(TEXT_365);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.URIEditorInput"));
+				stringBuffer.append(TEXT_366);
+			}
+		} else {
+			stringBuffer.append(TEXT_367);
+		}
+		stringBuffer.append(TEXT_368);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_346);
+		}
+		stringBuffer.append(TEXT_369);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.NullProgressMonitor"));
+		stringBuffer.append(TEXT_370);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_371);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_175);
+			}
+			stringBuffer.append(TEXT_372);
+			if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {
+				stringBuffer.append(TEXT_373);
+				stringBuffer.append(_ListOfAnything);
+				stringBuffer.append(TEXT_374);
+			} else {
+				stringBuffer.append(TEXT_375);
+				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+				stringBuffer.append(TEXT_376);
+			}
+			stringBuffer.append(TEXT_377);
+		}
+		stringBuffer.append(TEXT_378);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_379);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_380);
+		}
+		stringBuffer.append(TEXT_381);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_382);
+		if (genPackage.isMultipleEditorPages()) {
+			stringBuffer.append(TEXT_383);
+		} else {
+			stringBuffer.append(TEXT_384);
+		}
+		stringBuffer.append(TEXT_385);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_386);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_387);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_388);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_389);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_390);
+		} else {
+			stringBuffer.append(TEXT_391);
+		}
+		stringBuffer.append(TEXT_333);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_392);
+		}
+		stringBuffer.append(TEXT_393);
+		stringBuffer.append(_CollectionOfAnything);
+		stringBuffer.append(TEXT_394);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_395);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_396);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_397);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_398);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_399);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_400);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_401);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_175);
+		}
+		stringBuffer.append(TEXT_402);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_403);
+		}
+		stringBuffer.append(TEXT_404);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_405);
+		} else {
+			stringBuffer.append(TEXT_406);
+		}
+		stringBuffer.append(TEXT_333);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_407);
+		}
+		stringBuffer.append(TEXT_408);
+		stringBuffer.append(genPackage.isMultipleEditorPages());
+		stringBuffer.append(TEXT_409);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_5);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genPackage.hasConcreteClasses()
+				&& genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/EntryPoint.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/EntryPoint.java
new file mode 100644
index 0000000..24f16d8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/EntryPoint.java
@@ -0,0 +1,267 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class EntryPoint extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized EntryPoint create(String lineSeparator) {
+		nl = lineSeparator;
+		EntryPoint result = new EntryPoint();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL + "" + NL + "import org.eclipse.emf.edit.ui.EditorEntryPoint;";
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * This is the entry point." + NL
+			+ " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = " extends EditorEntryPoint" + NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL + "\t";
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Override" + NL
+			+ "\tpublic void onModuleLoad()" + NL + "\t{" + NL + "\t\tsuper.onModuleLoad();" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated"
+			+ NL + "\t */" + NL + "\t@Override" + NL + "\tprotected void registerPackages(";
+	protected final String TEXT_16 = ".Registry packageRegistry)" + NL + "\t{";
+	protected final String TEXT_17 = NL + "\t\tpackageRegistry.put(";
+	protected final String TEXT_18 = ".eNS_URI, ";
+	protected final String TEXT_19 = ".eINSTANCE);";
+	protected final String TEXT_20 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Override" + NL
+			+ "\tprotected void configureItemProviderAdapterFactories(";
+	protected final String TEXT_21 = " adapterFactory)" + NL + "\t{";
+	protected final String TEXT_22 = NL + "\t\tadapterFactory.addAdapterFactory(new ";
+	protected final String TEXT_23 = "());";
+	protected final String TEXT_24 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t@Override" + NL
+			+ "\tprotected String getApplicationTitle()" + NL + "\t{" + NL + "\t\treturn \"";
+	protected final String TEXT_25 = " Application\";";
+	protected final String TEXT_26 = NL + "\t}" + NL + "}";
+	protected final String TEXT_27 = NL;
+	protected final String TEXT_28 = NL;
+
+	public EntryPoint() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_28);
+		stringBuffer.append(TEXT_28);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getEditorPluginDirectory();
+		packageName = genModel.getEditorPluginPackageName();
+		className = genModel.getEditorEntryPointClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 20010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditorPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		if (genModel.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genModel.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genModel.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genModel.getAllGenAndUsedGenPackagesWithClassifiers())) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genModel.getEditorEntryPointClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+		stringBuffer.append(TEXT_16);
+		for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ComposedAdapterFactory"));
+		stringBuffer.append(TEXT_21);
+		for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getImportedItemProviderAdapterFactoryClassName());
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_25);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_26);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_27);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/HomeHTML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/HomeHTML.java
new file mode 100644
index 0000000..00dd801
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/HomeHTML.java
@@ -0,0 +1,197 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class HomeHTML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized HomeHTML create(String lineSeparator) {
+		nl = lineSeparator;
+		HomeHTML result = new HomeHTML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL + "<!doctype html>" + NL
+			+ "<html style=\"height : 100%\"> " + NL + "  <head>" + NL
+			+ "    <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">" + NL + "" + NL
+			+ "    <!--                                           -->" + NL
+			+ "    <!-- Any title is fine                         -->" + NL
+			+ "    <!--                                           -->" + NL + "    <title>";
+	protected final String TEXT_2 = " Application</title>" + NL + "    " + NL + "    <style TYPE=\"text/css\">" + NL
+			+ "      <!--" + NL + "        .ToolBar" + NL + "        {" + NL + "          background-color: #d0e4f6;"
+			+ NL + "        }" + NL + "        .ToolBarButton" + NL + "        {" + NL + "          float: left;" + NL
+			+ "          margin-top: 5px;" + NL + "        }" + NL + "        .ToolBarButtonLeftMargin" + NL
+			+ "        {" + NL + "          float: left;" + NL + "          margin-left: 10px;" + NL
+			+ "          margin-top: 5px;" + NL + "        }" + NL + "        .Header" + NL + "        {" + NL
+			+ "          background-color: #628cd5;" + NL + "          color: #FFFFFF;" + NL + "          float: left;"
+			+ NL + "          font-weight: bold;" + NL + "          font-size: xx-large;" + NL + "        }" + NL
+			+ "        .HeaderLabel" + NL + "        {" + NL + "          float: left;" + NL
+			+ "          margin-left: 10px;" + NL + "        }" + NL + "        .PropertiesTitle" + NL + "        {"
+			+ NL + "          background-color: #628cd5;" + NL + "          color: #FFFFFF;" + NL
+			+ "          font-weight: bold;" + NL + "          font-size: large;" + NL + "        }" + NL
+			+ "        .PropertiesTitleLabel" + NL + "        {" + NL + "          float: left;" + NL
+			+ "          margin-left: 5px;" + NL + "        }" + NL + "      -->" + NL + "    </style>" + NL + "" + NL
+			+ "    <!--                                           -->" + NL
+			+ "    <!-- This script loads your compiled module.   -->" + NL
+			+ "    <!-- If you add any GWT meta tags, they must   -->" + NL
+			+ "    <!-- be added before this line.                -->" + NL
+			+ "    <script type=\"text/javascript\" language=\"javascript\" src=\"";
+	protected final String TEXT_3 = "/";
+	protected final String TEXT_4 = ".nocache.js\"></script>" + NL + "  </head>" + NL + "" + NL
+			+ "  <body style=\"height : 100%\">" + NL + "    <div id=\"main\" style=\"height : 100%\">" + NL
+			+ "    </div>" + NL + "  </body>" + NL + "</html>" + NL;
+	protected final String TEXT_5 = NL;
+
+	public HomeHTML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_5);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/war/" + genModel.getEditorHomePageName() + ".html";
+		overwrite = false;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getQualifiedEditorModuleName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getQualifiedEditorModuleName());
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ManifestMF.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ManifestMF.java
new file mode 100644
index 0000000..986a0ec
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ManifestMF.java
@@ -0,0 +1,274 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ManifestMF extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ManifestMF create(String lineSeparator) {
+		nl = lineSeparator;
+		ManifestMF result = new ManifestMF();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "Manifest-Version: 1.0" + NL + "Bundle-ManifestVersion: 2" + NL + "Bundle-Name: ";
+	protected final String TEXT_2 = NL + "Bundle-SymbolicName: ";
+	protected final String TEXT_3 = ";singleton:=true" + NL + "Automatic-Module-Name: ";
+	protected final String TEXT_4 = NL + "Bundle-Version: 1.0.0.qualifier" + NL + "Bundle-ClassPath: ";
+	protected final String TEXT_5 = ".jar";
+	protected final String TEXT_6 = ".";
+	protected final String TEXT_7 = NL + "Bundle-Activator: ";
+	protected final String TEXT_8 = "$Implementation";
+	protected final String TEXT_9 = NL + "Bundle-Vendor: ";
+	protected final String TEXT_10 = NL + "Bundle-Localization: ";
+	protected final String TEXT_11 = NL + "Bundle-RequiredExecutionEnvironment: J2SE-1.5";
+	protected final String TEXT_12 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.6";
+	protected final String TEXT_13 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.7";
+	protected final String TEXT_14 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.8";
+	protected final String TEXT_15 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-9";
+	protected final String TEXT_16 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-10";
+	protected final String TEXT_17 = NL + "Export-Package: ";
+	protected final String TEXT_18 = ",";
+	protected final String TEXT_19 = NL + " ";
+	protected final String TEXT_20 = NL + "Require-Bundle: ";
+	protected final String TEXT_21 = ";visibility:=reexport";
+	protected final String TEXT_22 = NL + "Import-Package: org.eclipse.emf.common.ui," + NL
+			+ " org.eclipse.emf.common.ui.action," + NL + " org.eclipse.emf.common.ui.dialogs," + NL
+			+ " org.eclipse.emf.common.ui.editor," + NL + " org.eclipse.emf.common.ui.viewer," + NL
+			+ " org.eclipse.emf.edit.ui," + NL + " org.eclipse.emf.edit.ui.action," + NL
+			+ " org.eclipse.emf.edit.ui.celleditor," + NL + " org.eclipse.emf.edit.ui.dnd," + NL
+			+ " org.eclipse.emf.edit.ui.provider," + NL + " org.eclipse.emf.edit.ui.util," + NL
+			+ " org.eclipse.emf.edit.ui.view," + NL + " org.eclipse.jface.action," + NL + " org.eclipse.jface.dialogs,"
+			+ NL + " org.eclipse.jface.operation," + NL + " org.eclipse.jface.text," + NL + " org.eclipse.jface.util,"
+			+ NL + " org.eclipse.jface.viewers," + NL + " org.eclipse.jface.window," + NL + " org.eclipse.jface.wizard,"
+			+ NL + " org.eclipse.swt," + NL + " org.eclipse.swt.custom," + NL + " org.eclipse.swt.dnd," + NL
+			+ " org.eclipse.swt.events," + NL + " org.eclipse.swt.graphics," + NL + " org.eclipse.swt.layout," + NL
+			+ " org.eclipse.swt.widgets," + NL + " org.eclipse.ui;ui.workbench=\"split\"," + NL
+			+ " org.eclipse.ui.actions;ui.workbench=\"split\"," + NL + " org.eclipse.ui.application," + NL
+			+ " org.eclipse.ui.part;ui.workbench=\"split\"," + NL + " org.eclipse.ui.plugin," + NL
+			+ " org.eclipse.ui.views," + NL + " org.eclipse.ui.views.contentoutline," + NL
+			+ " org.eclipse.ui.views.properties;ui.views=\"split\"";
+	protected final String TEXT_23 = NL + "Eclipse-LazyStart: true";
+	protected final String TEXT_24 = NL + "Bundle-ActivationPolicy: lazy" + NL;
+	protected final String TEXT_25 = NL;
+
+	public ManifestMF() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_25);
+		stringBuffer.append(TEXT_25);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/META-INF/MANIFEST.MF";
+		overwrite = genModel.isUpdateClasspath();
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genModel.getEditorBundleNameKey());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditorPluginID());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getEditorPluginID());
+		stringBuffer.append(TEXT_4);
+		if (genModel.isRuntimeJar()) {
+			stringBuffer.append(genModel.getEditorPluginID());
+			stringBuffer.append(TEXT_5);
+		} else {
+			stringBuffer.append(TEXT_6);
+		}
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genModel.getQualifiedEditorPluginClassName());
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genModel.getEditorBundleVendorKey());
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getEditorBundleLocalization());
+		if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {
+			stringBuffer.append(TEXT_11);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {
+			stringBuffer.append(TEXT_12);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {
+			stringBuffer.append(TEXT_13);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {
+			stringBuffer.append(TEXT_14);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {
+			stringBuffer.append(TEXT_15);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {
+			stringBuffer.append(TEXT_16);
+		}
+		Iterator<String> packagesIterator = genModel.getEditorQualifiedPackageNames().iterator();
+		if (packagesIterator.hasNext()) {
+			String pack = packagesIterator.next();
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(pack);
+			while (packagesIterator.hasNext()) {
+				pack = packagesIterator.next();
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(pack);
+			}
+		}
+		Iterator<String> requiredPluginIterator = genModel.getEditorRequiredPlugins().iterator();
+		if (requiredPluginIterator.hasNext()) {
+			String pluginID = requiredPluginIterator.next();
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(pluginID);
+			if (!pluginID.startsWith("org.eclipse.core.runtime")) {
+				stringBuffer.append(TEXT_21);
+			}
+			while (requiredPluginIterator.hasNext()) {
+				pluginID = requiredPluginIterator.next();
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(pluginID);
+				if (!pluginID.startsWith("org.eclipse.core.runtime") && !pluginID.equals("org.eclipse.jface.text")
+						&& !pluginID.equals("org.eclipse.xtext.xbase.lib")
+						&& !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {
+					stringBuffer.append(TEXT_21);
+				}
+			}
+		}
+		if (genModel.isRichAjaxPlatform()) {
+			stringBuffer.append(TEXT_22);
+		}
+		if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22
+				|| genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.isBundleManifest());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelIcon.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelIcon.java
new file mode 100644
index 0000000..388ddf9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelIcon.java
@@ -0,0 +1,134 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModelIcon extends org.eclipse.egf.emf.pattern.base.GenPackageGIF {
+	protected static String nl;
+
+	public static synchronized ModelIcon create(String lineSeparator) {
+		nl = lineSeparator;
+		ModelIcon result = new ModelIcon();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ModelIcon() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		if (genPackage.hasConcreteClasses()) {
+			new CodegenGeneratorAdapter(parameter).generateGIF("editor/ModelFile.gif",
+					genPackage.getModelIconFileName(), genPackage.getPrefix(), null, false);
+		} else {
+		}
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelWizard.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelWizard.java
new file mode 100644
index 0000000..3a5dc44
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelWizard.java
@@ -0,0 +1,1198 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModelWizard extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized ModelWizard create(String lineSeparator) {
+		nl = lineSeparator;
+		ModelWizard result = new ModelWizard();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL + "" + NL + "" + NL + "import java.util.ArrayList;" + NL
+			+ "import java.util.Arrays;" + NL + "import java.util.Collection;" + NL + "import java.util.Collections;"
+			+ NL + "import java.util.HashMap;";
+	protected final String TEXT_4 = NL + "import java.util.Iterator;";
+	protected final String TEXT_5 = NL + "import java.util.List;" + NL + "import java.util.Map;" + NL
+			+ "import java.util.MissingResourceException;" + NL + "import java.util.StringTokenizer;" + NL;
+	protected final String TEXT_6 = NL + "import org.eclipse.emf.common.CommonPlugin;" + NL;
+	protected final String TEXT_7 = NL + "import org.eclipse.emf.common.util.URI;" + NL + "" + NL
+			+ "import org.eclipse.emf.ecore.EClass;" + NL + "import org.eclipse.emf.ecore.EClassifier;" + NL + "" + NL
+			+ "import org.eclipse.emf.ecore.resource.Resource;" + NL
+			+ "import org.eclipse.emf.ecore.resource.ResourceSet;" + NL + "" + NL
+			+ "import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;" + NL + "" + NL
+			+ "import org.eclipse.emf.ecore.EObject;" + NL + "" + NL + "import org.eclipse.emf.ecore.xmi.XMLResource;"
+			+ NL + "" + NL + "import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;" + NL;
+	protected final String TEXT_8 = NL + "import org.eclipse.core.resources.IContainer;" + NL
+			+ "import org.eclipse.core.resources.IFile;" + NL + "import org.eclipse.core.resources.IFolder;" + NL
+			+ "import org.eclipse.core.resources.IProject;" + NL + "import org.eclipse.core.resources.IResource;" + NL
+			+ "import org.eclipse.core.resources.ResourcesPlugin;" + NL;
+	protected final String TEXT_9 = NL + "import org.eclipse.core.runtime.IProgressMonitor;" + NL + "" + NL
+			+ "import org.eclipse.jface.dialogs.MessageDialog;" + NL + "" + NL
+			+ "import org.eclipse.jface.viewers.IStructuredSelection;" + NL + "" + NL
+			+ "import org.eclipse.jface.wizard.Wizard;" + NL + "import org.eclipse.jface.wizard.WizardPage;" + NL + ""
+			+ NL + "import org.eclipse.swt.SWT;" + NL + "" + NL + "import org.eclipse.swt.events.ModifyListener;" + NL
+			+ "import org.eclipse.swt.events.ModifyEvent;" + NL + "" + NL + "import org.eclipse.swt.layout.GridData;"
+			+ NL + "import org.eclipse.swt.layout.GridLayout;" + NL + "" + NL + "import org.eclipse.swt.widgets.Combo;"
+			+ NL + "import org.eclipse.swt.widgets.Composite;" + NL + "import org.eclipse.swt.widgets.Label;" + NL + ""
+			+ NL + "import org.eclipse.ui.INewWizard;" + NL + "import org.eclipse.ui.IWorkbench;" + NL;
+	protected final String TEXT_10 = NL + "import org.eclipse.ui.actions.WorkspaceModifyOperation;" + NL + "" + NL
+			+ "import org.eclipse.ui.dialogs.WizardNewFileCreationPage;" + NL + "" + NL
+			+ "import org.eclipse.ui.part.FileEditorInput;" + NL + "import org.eclipse.ui.part.ISetSelectionTarget;"
+			+ NL;
+	protected final String TEXT_11 = NL + "import ";
+	protected final String TEXT_12 = ";";
+	protected final String TEXT_13 = ";" + NL + "import ";
+	protected final String TEXT_14 = ";" + NL + NL;
+	protected final String TEXT_15 = NL + NL + NL + "/**" + NL
+			+ " * This is a simple wizard for creating a new model file." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_16 = NL + " * ";
+	protected final String TEXT_17 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_18 = NL + "@Deprecated";
+	protected final String TEXT_19 = NL + "public class ";
+	protected final String TEXT_20 = " extends Wizard implements INewWizard" + NL + "{";
+	protected final String TEXT_21 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_22 = " copyright = ";
+	protected final String TEXT_23 = NL;
+	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * The supported extensions for created files." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final ";
+	protected final String TEXT_25 = " FILE_EXTENSIONS =" + NL + "\t\tCollections.unmodifiableList(Arrays.asList(";
+	protected final String TEXT_26 = ".INSTANCE.getString(\"_UI_";
+	protected final String TEXT_27 = "FilenameExtensions\").split(\"\\\\s*,\\\\s*\")));";
+	protected final String TEXT_28 = NL + NL + "\t/**" + NL
+			+ "\t * A formatted list of supported file extensions, suitable for display." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final String FORMATTED_FILE_EXTENSIONS =" + NL + "\t\t";
+	protected final String TEXT_29 = "FilenameExtensions\").replaceAll(\"\\\\s*,\\\\s*\", \", \");";
+	protected final String TEXT_30 = NL + NL + "\t/**" + NL + "\t * This caches an instance of the model package." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_31 = " ";
+	protected final String TEXT_32 = " = ";
+	protected final String TEXT_33 = ".eINSTANCE;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This caches an instance of the model factory." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_34 = ".get";
+	protected final String TEXT_35 = "();" + NL;
+	protected final String TEXT_36 = NL + "\t/**" + NL + "\t * This is the file creation page." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_37 = "NewFileCreationPage newFileCreationPage;" + NL;
+	protected final String TEXT_38 = NL + "\t/**" + NL + "\t * This is the initial object creation page." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_39 = "InitialObjectCreationPage initialObjectCreationPage;" + NL + "" + NL + "\t/**"
+			+ NL + "\t * Remember the selection during initialization for populating the default container." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected IStructuredSelection selection;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Remember the workbench during initialization." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected IWorkbench workbench;" + NL + "" + NL + "\t/**";
+	protected final String TEXT_40 = NL + "\t * Caches the names of the types that can be created as the root object.";
+	protected final String TEXT_41 = NL + "\t * Caches the names of the features representing global elements.";
+	protected final String TEXT_42 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_43 = " initialObjectNames;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * This just records the information." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_44 = NL + "\t@Override";
+	protected final String TEXT_45 = NL + "\tpublic void init(IWorkbench workbench, IStructuredSelection selection)"
+			+ NL + "\t{" + NL + "\t\tthis.workbench = workbench;" + NL + "\t\tthis.selection = selection;" + NL
+			+ "\t\tsetWindowTitle(";
+	protected final String TEXT_46 = ".INSTANCE.getString(\"_UI_Wizard_label\"));";
+	protected final String TEXT_47 = NL
+			+ "\t\tsetDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(";
+	protected final String TEXT_48 = ".INSTANCE.getImage(\"full/wizban/New";
+	protected final String TEXT_49 = "\")));";
+	protected final String TEXT_50 = NL + "\t}" + NL + "" + NL + "\t/**";
+	protected final String TEXT_51 = NL + "\t * Returns the names of the types that can be created as the root object.";
+	protected final String TEXT_52 = NL + "\t * Returns the names of the features representing global elements.";
+	protected final String TEXT_53 = " getInitialObjectNames()" + NL + "\t{" + NL
+			+ "\t\tif (initialObjectNames == null)" + NL + "\t\t{" + NL + "\t\t\tinitialObjectNames = new ";
+	protected final String TEXT_54 = "();";
+	protected final String TEXT_55 = NL + "\t\t\tfor (EClassifier eClassifier : ";
+	protected final String TEXT_56 = ".getEClassifiers())";
+	protected final String TEXT_57 = NL + "\t\t\tfor (Iterator classifiers = ";
+	protected final String TEXT_58 = ".getEClassifiers().iterator(); classifiers.hasNext(); )";
+	protected final String TEXT_59 = NL + "\t\t\t{";
+	protected final String TEXT_60 = NL + "\t\t\t\tEClassifier eClassifier = (EClassifier)classifiers.next();";
+	protected final String TEXT_61 = NL + "\t\t\t\tif (eClassifier instanceof EClass)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tEClass eClass = (EClass)eClassifier;" + NL + "\t\t\t\t\tif (!eClass.isAbstract())" + NL
+			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tinitialObjectNames.add(eClass.getName());" + NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t}" + NL + "\t\t\t}";
+	protected final String TEXT_62 = NL + "\t\t\tfor (";
+	protected final String TEXT_63 = " eStructuralFeature : ";
+	protected final String TEXT_64 = ".INSTANCE.getAllElements(";
+	protected final String TEXT_65 = ".INSTANCE.getDocumentRoot(";
+	protected final String TEXT_66 = ")))";
+	protected final String TEXT_67 = NL + "\t\t\tfor (Iterator elements = ";
+	protected final String TEXT_68 = ")).iterator(); elements.hasNext(); )";
+	protected final String TEXT_69 = NL + "\t\t\t\t";
+	protected final String TEXT_70 = " eStructuralFeature = (";
+	protected final String TEXT_71 = ")elements.next();";
+	protected final String TEXT_72 = NL + "\t\t\t\tif (eStructuralFeature.isChangeable())" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tEClassifier eClassifier = eStructuralFeature.getEType();" + NL
+			+ "\t\t\t\t\tif (eClassifier instanceof EClass)" + NL + "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tEClass eClass = (EClass)eClassifier;" + NL + "\t\t\t\t\t\tif (!eClass.isAbstract())" + NL
+			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\tinitialObjectNames.add(eStructuralFeature.getName());" + NL
+			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t}";
+	protected final String TEXT_73 = NL + "\t\t\tCollections.sort(initialObjectNames, ";
+	protected final String TEXT_74 = "CommonPlugin.INSTANCE.getComparator()";
+	protected final String TEXT_75 = "java.text.Collator.getInstance()";
+	protected final String TEXT_76 = ");" + NL + "\t\t}" + NL + "\t\treturn initialObjectNames;" + NL + "\t}" + NL + ""
+			+ NL + "\t/**" + NL + "\t * Create a new model." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected EObject createInitialModel()" + NL + "\t{";
+	protected final String TEXT_77 = NL + "\t\tEClass eClass = (EClass)";
+	protected final String TEXT_78 = ".getEClassifier(initialObjectCreationPage.getInitialObjectName());" + NL
+			+ "\t\tEObject rootObject = ";
+	protected final String TEXT_79 = ".create(eClass);";
+	protected final String TEXT_80 = NL + "\t\tEClass eClass = ";
+	protected final String TEXT_81 = ");" + NL
+			+ "\t\tEStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(initialObjectCreationPage.getInitialObjectName());"
+			+ NL + "\t\tEObject rootObject = ";
+	protected final String TEXT_82 = ".create(eClass);" + NL + "\t\trootObject.eSet(eStructuralFeature, ";
+	protected final String TEXT_83 = ".create((EClass)eStructuralFeature.getEType()));";
+	protected final String TEXT_84 = NL + "\t\treturn rootObject;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Do the work after everything is specified." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_85 = NL + "\tpublic boolean performFinish()" + NL + "\t{" + NL + "\t\ttry" + NL
+			+ "\t\t{";
+	protected final String TEXT_86 = NL + "\t\t\t// Get the URI of the model file." + NL + "\t\t\t//" + NL
+			+ "\t\t\tfinal URI fileURI = getModelURI();" + NL + "\t\t\tif (new ";
+	protected final String TEXT_87 = "(fileURI.toFileString()).exists())" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tif (!MessageDialog.openQuestion" + NL + "\t\t\t\t\t\t(getShell()," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_88 = ".INSTANCE.getString(\"_UI_Question_title\"),";
+	protected final String TEXT_89 = NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_90 = ".INSTANCE.getString(\"_WARN_FileConflict\", new String []{ fileURI.toFileString() })))";
+	protected final String TEXT_91 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tinitialObjectCreationPage.selectFileField();"
+			+ NL + "\t\t\t\t\treturn false;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\t" + NL
+			+ "\t\t\t// Do the work within an operation." + NL + "\t\t\t//" + NL + "\t\t\t";
+	protected final String TEXT_92 = " operation = new ";
+	protected final String TEXT_93 = "()" + NL + "\t\t\t{";
+	protected final String TEXT_94 = NL + "\t\t\t\t@Override";
+	protected final String TEXT_95 = NL + "\t\t\t\tpublic void run(IProgressMonitor progressMonitor)";
+	protected final String TEXT_96 = NL + "\t\t\t// Remember the file." + NL + "\t\t\t//" + NL
+			+ "\t\t\tfinal IFile modelFile = getModelFile();" + NL + "" + NL
+			+ "\t\t\t// Do the work within an operation." + NL + "\t\t\t//" + NL
+			+ "\t\t\tWorkspaceModifyOperation operation =" + NL + "\t\t\t\tnew WorkspaceModifyOperation()" + NL
+			+ "\t\t\t\t{";
+	protected final String TEXT_97 = NL + "\t\t\t\t\t@Override";
+	protected final String TEXT_98 = NL + "\t\t\t\t\tprotected void execute(IProgressMonitor progressMonitor)";
+	protected final String TEXT_99 = NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\ttry" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\t// Create a resource set" + NL + "\t\t\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\t\t\tResourceSet resourceSet = new ResourceSetImpl();" + NL;
+	protected final String TEXT_100 = NL + "\t\t\t\t\t\t\t// Get the URI of the model file." + NL + "\t\t\t\t\t\t\t//"
+			+ NL
+			+ "\t\t\t\t\t\t\tURI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);"
+			+ NL;
+	protected final String TEXT_101 = NL + "\t\t\t\t\t\t\t// Create a resource for this file." + NL + "\t\t\t\t\t\t\t//"
+			+ NL + "\t\t\t\t\t\t\tResource resource = resourceSet.createResource(fileURI";
+	protected final String TEXT_102 = ", ";
+	protected final String TEXT_103 = ".eCONTENT_TYPE";
+	protected final String TEXT_104 = ");" + NL + "" + NL
+			+ "\t\t\t\t\t\t\t// Add the initial model object to the contents." + NL + "\t\t\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\t\t\tEObject rootObject = createInitialModel();" + NL + "\t\t\t\t\t\t\tif (rootObject != null)"
+			+ NL + "\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\tresource.getContents().add(rootObject);" + NL
+			+ "\t\t\t\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t\t\t\t// Save the contents of the resource to the file system." + NL + "\t\t\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\t\t\t";
+	protected final String TEXT_105 = " options = new ";
+	protected final String TEXT_106 = "();" + NL
+			+ "\t\t\t\t\t\t\toptions.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());" + NL
+			+ "\t\t\t\t\t\t\tresource.save(options);" + NL + "\t\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\t\tcatch (Exception exception)" + NL + "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t";
+	protected final String TEXT_107 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\tfinally"
+			+ NL + "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\tprogressMonitor.done();" + NL + "\t\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\t}" + NL + "\t\t\t\t};" + NL + "" + NL + "\t\t\tgetContainer().run(false, false, operation);"
+			+ NL;
+	protected final String TEXT_108 = NL + "\t\t\treturn ";
+	protected final String TEXT_109 = ".openEditor(workbench, fileURI);\t\t\t";
+	protected final String TEXT_110 = NL + "\t\t\t// Select the new file resource in the current view." + NL
+			+ "\t\t\t//" + NL + "\t\t\t";
+	protected final String TEXT_111 = " workbenchWindow = workbench.getActiveWorkbenchWindow();" + NL + "\t\t\t";
+	protected final String TEXT_112 = " page = workbenchWindow.getActivePage();" + NL + "\t\t\tfinal ";
+	protected final String TEXT_113 = " activePart = page.getActivePart();" + NL
+			+ "\t\t\tif (activePart instanceof ISetSelectionTarget)" + NL + "\t\t\t{" + NL + "\t\t\t\tfinal ";
+	protected final String TEXT_114 = " targetSelection = new ";
+	protected final String TEXT_115 = "(modelFile);" + NL + "\t\t\t\tgetShell().getDisplay().asyncExec" + NL
+			+ "\t\t\t\t\t(new Runnable()" + NL + "\t\t\t\t\t {";
+	protected final String TEXT_116 = NL + "\t\t\t\t\t\t @Override";
+	protected final String TEXT_117 = NL + "\t\t\t\t\t\t public void run()" + NL + "\t\t\t\t\t\t {" + NL
+			+ "\t\t\t\t\t\t\t ((ISetSelectionTarget)activePart).selectReveal(targetSelection);" + NL + "\t\t\t\t\t\t }"
+			+ NL + "\t\t\t\t\t });" + NL + "\t\t\t}" + NL + "" + NL + "\t\t\t// Open an editor on the new file." + NL
+			+ "\t\t\t//" + NL + "\t\t\ttry" + NL + "\t\t\t{" + NL + "\t\t\t\tpage.openEditor" + NL
+			+ "\t\t\t\t\t(new FileEditorInput(modelFile)," + NL
+			+ "\t\t\t\t\t workbench.getEditorRegistry().getDefaultEditor";
+	protected final String TEXT_118 = "(modelFile.getFullPath().toString()).getId());";
+	protected final String TEXT_119 = NL + "\t\t\t\t\t \t(modelFile.getFullPath().toString()," + NL + "\t\t\t\t\t \t ";
+	protected final String TEXT_120 = ".getContentTypeManager().getContentType(";
+	protected final String TEXT_121 = ".eCONTENT_TYPE)).getId());";
+	protected final String TEXT_122 = "\t\t\t\t\t \t " + NL + "\t\t\t}" + NL + "\t\t\tcatch (";
+	protected final String TEXT_123 = " exception)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tMessageDialog.openError(workbenchWindow.getShell(), ";
+	protected final String TEXT_124 = ".INSTANCE.getString(\"_UI_OpenEditorError_label\"), exception.getMessage());";
+	protected final String TEXT_125 = NL + "\t\t\t\treturn false;" + NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\treturn true;";
+	protected final String TEXT_126 = NL + "\t\t}" + NL + "\t\tcatch (Exception exception)" + NL + "\t\t{" + NL
+			+ "\t\t\t";
+	protected final String TEXT_127 = ".INSTANCE.log(exception);" + NL + "\t\t\treturn false;" + NL + "\t\t}" + NL
+			+ "\t}" + NL;
+	protected final String TEXT_128 = NL + "\t/**" + NL + "\t * This is the one page of the wizard." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic class ";
+	protected final String TEXT_129 = "NewFileCreationPage extends WizardNewFileCreationPage" + NL + "\t{" + NL
+			+ "\t\t/**" + NL + "\t\t * Pass in the selection." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
+	protected final String TEXT_130 = "NewFileCreationPage(String pageId, IStructuredSelection selection)" + NL
+			+ "\t\t{" + NL + "\t\t\tsuper(pageId, selection);" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
+			+ "\t\t * The framework calls this to see if the file is correct." + NL + "\t\t * <!-- begin-user-doc -->"
+			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_131 = NL + "\t\t@Override";
+	protected final String TEXT_132 = NL + "\t\tprotected boolean validatePage()" + NL + "\t\t{" + NL
+			+ "\t\t\tif (super.validatePage())" + NL + "\t\t\t{" + NL + "\t\t\t\tString extension = new ";
+	protected final String TEXT_133 = "(getFileName()).getFileExtension();" + NL
+			+ "\t\t\t\tif (extension == null || !FILE_EXTENSIONS.contains(extension))" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tString key = FILE_EXTENSIONS.size() > 1 ? \"_WARN_FilenameExtensions\" : \"_WARN_FilenameExtension\";";
+	protected final String TEXT_134 = NL + "\t\t\t\t\tsetErrorMessage(";
+	protected final String TEXT_135 = ".INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));" + NL
+			+ "\t\t\t\t\treturn false;" + NL + "\t\t\t\t}" + NL + "\t\t\t\treturn true;" + NL + "\t\t\t}" + NL
+			+ "\t\t\treturn false;" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
+			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tpublic IFile getModelFile()" + NL + "\t\t{" + NL
+			+ "\t\t\treturn ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));"
+			+ NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_136 = NL + "\t/**" + NL
+			+ "\t * This is the page where the type of object to create is selected." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic class ";
+	protected final String TEXT_137 = "InitialObjectCreationPage extends WizardPage" + NL + "\t{";
+	protected final String TEXT_138 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
+	protected final String TEXT_139 = " fileField;" + NL;
+	protected final String TEXT_140 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tprotected Combo initialObjectField;" + NL + "" + NL + "\t\t/**" + NL + "\t\t * @generated" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t */" + NL
+			+ "\t\tprotected ";
+	protected final String TEXT_141 = " encodings;" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
+			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tprotected Combo encodingField;" + NL + "" + NL + "\t\t/**" + NL + "\t\t * Pass in the selection."
+			+ NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated"
+			+ NL + "\t\t */" + NL + "\t\tpublic ";
+	protected final String TEXT_142 = "InitialObjectCreationPage(String pageId)" + NL + "\t\t{" + NL
+			+ "\t\t\tsuper(pageId);" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
+			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_143 = NL + "\t\tpublic void createControl(Composite parent)" + NL + "\t\t{" + NL
+			+ "\t\t\tComposite composite = new Composite(parent, SWT.NONE);" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tGridLayout layout = new GridLayout();" + NL + "\t\t\t\tlayout.numColumns = 1;" + NL
+			+ "\t\t\t\tlayout.verticalSpacing = 12;" + NL + "\t\t\t\tcomposite.setLayout(layout);" + NL + "" + NL
+			+ "\t\t\t\tGridData data = new GridData();" + NL + "\t\t\t\tdata.verticalAlignment = GridData.FILL;" + NL
+			+ "\t\t\t\tdata.grabExcessVerticalSpace = true;" + NL + "\t\t\t\tdata.horizontalAlignment = GridData.FILL;"
+			+ NL + "\t\t\t\tcomposite.setLayoutData(data);" + NL + "\t\t\t}" + NL;
+	protected final String TEXT_144 = "\t\t\t" + NL + "\t\t\tLabel resourceURILabel = new Label(composite, SWT.LEFT);"
+			+ NL + "\t\t\t{" + NL + "\t\t\t\tresourceURILabel.setText(";
+	protected final String TEXT_145 = ".INSTANCE.getString(\"_UI_File_label\"));";
+	protected final String TEXT_146 = NL + NL + "\t\t\t\tGridData data = new GridData();" + NL
+			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tresourceURILabel.setLayoutData(data);"
+			+ NL + "\t\t\t}" + NL + "" + NL + "\t\t\tComposite fileComposite = new Composite(composite, SWT.NONE);" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tGridData data = new GridData();" + NL
+			+ "\t\t\t\tdata.horizontalAlignment = GridData.END;" + NL + "\t\t\t\tfileComposite.setLayoutData(data);"
+			+ NL + "" + NL + "\t\t\t\tGridLayout layout = new GridLayout();" + NL
+			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tlayout.marginHeight = 0;" + NL
+			+ "\t\t\t\tlayout.marginWidth = 0;" + NL + "\t\t\t\tlayout.numColumns = 2;" + NL
+			+ "\t\t\t\tfileComposite.setLayout(layout);" + NL + "\t\t\t}" + NL + "" + NL + "\t\t\tfileField = new ";
+	protected final String TEXT_147 = "(fileComposite, SWT.BORDER);" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tGridData data = new GridData();" + NL + "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL
+			+ "\t\t\t\tdata.grabExcessHorizontalSpace = true;" + NL + "\t\t\t\tdata.horizontalSpan = 1;" + NL
+			+ "\t\t\t\tfileField.setLayoutData(data);" + NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\tfileField.addModifyListener(validator);" + NL;
+	protected final String TEXT_148 = NL + "\t\t\t";
+	protected final String TEXT_149 = " resourceURIBrowseFileSystemButton = new ";
+	protected final String TEXT_150 = "(fileComposite, SWT.PUSH);" + NL
+			+ "\t\t\tresourceURIBrowseFileSystemButton.setText(";
+	protected final String TEXT_151 = ".INSTANCE.getString(\"_UI_Browse_label\"));";
+	protected final String TEXT_152 = NL + NL + "\t\t\tresourceURIBrowseFileSystemButton.addSelectionListener" + NL
+			+ "\t\t\t\t(new ";
+	protected final String TEXT_153 = "()" + NL + "\t\t\t\t {";
+	protected final String TEXT_154 = NL + "\t\t\t\t\t @Override";
+	protected final String TEXT_155 = NL + "\t\t\t\t\t public void widgetSelected(";
+	protected final String TEXT_156 = " event)" + NL + "\t\t\t\t\t {" + NL + "\t\t\t\t\t\t String[] filters = ";
+	protected final String TEXT_157 = "(String[])";
+	protected final String TEXT_158 = ".FILE_EXTENSION_FILTERS.toArray(new String[";
+	protected final String TEXT_159 = ".FILE_EXTENSION_FILTERS.size()]);" + NL + "\t\t\t\t\t\t String[] files = ";
+	protected final String TEXT_160 = ".openFilePathDialog(getShell(), ";
+	protected final String TEXT_161 = ".SAVE, filters);" + NL + "\t\t\t\t\t\t if (files.length > 0)" + NL
+			+ "\t\t\t\t\t\t {" + NL + "\t\t\t\t\t\t\t fileField.setText(files[0]);" + NL + "\t\t\t\t\t\t }" + NL
+			+ "\t\t\t\t\t }" + NL + "\t\t\t\t });";
+	protected final String TEXT_162 = NL + "\t\t\tLabel containerLabel = new Label(composite, SWT.LEFT);" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tcontainerLabel.setText(";
+	protected final String TEXT_163 = ".INSTANCE.getString(\"_UI_ModelObject\"));";
+	protected final String TEXT_164 = NL + NL + "\t\t\t\tGridData data = new GridData();" + NL
+			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tcontainerLabel.setLayoutData(data);"
+			+ NL + "\t\t\t}" + NL + "" + NL + "\t\t\tinitialObjectField = new Combo(composite, SWT.BORDER);" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tGridData data = new GridData();" + NL
+			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL
+			+ "\t\t\t\tdata.grabExcessHorizontalSpace = true;" + NL + "\t\t\t\tinitialObjectField.setLayoutData(data);"
+			+ NL + "\t\t\t}" + NL;
+	protected final String TEXT_165 = NL + "\t\t\tfor (String objectName : getInitialObjectNames())" + NL + "\t\t\t{"
+			+ NL + "\t\t\t\tinitialObjectField.add(getLabel(objectName));" + NL + "\t\t\t}";
+	protected final String TEXT_166 = NL + "\t\t\tfor (Iterator i = getInitialObjectNames().iterator(); i.hasNext(); )"
+			+ NL + "\t\t\t{" + NL + "\t\t\t\tinitialObjectField.add(getLabel((String)i.next()));" + NL + "\t\t\t}";
+	protected final String TEXT_167 = NL + NL + "\t\t\tif (initialObjectField.getItemCount() == 1)" + NL + "\t\t\t{"
+			+ NL + "\t\t\t\tinitialObjectField.select(0);" + NL + "\t\t\t}" + NL
+			+ "\t\t\tinitialObjectField.addModifyListener(validator);" + NL + "" + NL
+			+ "\t\t\tLabel encodingLabel = new Label(composite, SWT.LEFT);" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tencodingLabel.setText(";
+	protected final String TEXT_168 = ".INSTANCE.getString(\"_UI_XMLEncoding\"));";
+	protected final String TEXT_169 = NL + NL + "\t\t\t\tGridData data = new GridData();" + NL
+			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tencodingLabel.setLayoutData(data);"
+			+ NL + "\t\t\t}" + NL + "\t\t\tencodingField = new Combo(composite, SWT.BORDER);" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tGridData data = new GridData();" + NL + "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL
+			+ "\t\t\t\tdata.grabExcessHorizontalSpace = true;" + NL + "\t\t\t\tencodingField.setLayoutData(data);" + NL
+			+ "\t\t\t}" + NL;
+	protected final String TEXT_170 = NL + "\t\t\tfor (String encoding : getEncodings())" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tencodingField.add(encoding);" + NL + "\t\t\t}";
+	protected final String TEXT_171 = NL + "\t\t\tfor (Iterator i = getEncodings().iterator(); i.hasNext(); )" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tencodingField.add((String)i.next());" + NL + "\t\t\t}";
+	protected final String TEXT_172 = NL + NL + "\t\t\tencodingField.select(0);" + NL
+			+ "\t\t\tencodingField.addModifyListener(validator);" + NL + "" + NL
+			+ "\t\t\tsetPageComplete(validatePage());" + NL + "\t\t\tsetControl(composite);" + NL + "\t\t}" + NL + ""
+			+ NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ModifyListener validator =" + NL
+			+ "\t\t\tnew ModifyListener()" + NL + "\t\t\t{";
+	protected final String TEXT_173 = NL + "\t\t\t\tpublic void modifyText(ModifyEvent e)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tsetPageComplete(validatePage());" + NL + "\t\t\t\t}" + NL + "\t\t\t};" + NL + "" + NL
+			+ "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
+			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected boolean validatePage()" + NL + "\t\t{";
+	protected final String TEXT_174 = NL + "\t\t\tURI fileURI = getFileURI();" + NL
+			+ "\t\t\tif (fileURI == null || fileURI.isEmpty())" + NL + "\t\t\t{" + NL + "\t\t\t\tsetErrorMessage(null);"
+			+ NL + "\t\t\t\treturn false;" + NL + "\t\t\t}" + NL + "" + NL
+			+ "\t\t\tString extension = fileURI.fileExtension();" + NL
+			+ "\t\t\tif (extension == null || !FILE_EXTENSIONS.contains(extension))" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tString key = FILE_EXTENSIONS.size() > 1 ? \"_WARN_FilenameExtensions\" : \"_WARN_FilenameExtension\";";
+	protected final String TEXT_175 = NL + "\t\t\t\tsetErrorMessage(";
+	protected final String TEXT_176 = ".INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));" + NL
+			+ "\t\t\t\treturn false;" + NL + "\t\t\t}" + NL + "" + NL + "\t\t\tsetErrorMessage(null);";
+	protected final String TEXT_177 = NL
+			+ "\t\t\treturn getInitialObjectName() != null && getEncodings().contains(encodingField.getText());" + NL
+			+ "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_178 = NL + "\t\tpublic void setVisible(boolean visible)" + NL + "\t\t{" + NL
+			+ "\t\t\tsuper.setVisible(visible);" + NL + "\t\t\tif (visible)" + NL + "\t\t\t{";
+	protected final String TEXT_179 = NL + "\t\t\t\tif (initialObjectField.getItemCount() == 1)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tinitialObjectField.clearSelection();" + NL + "\t\t\t\t\tencodingField.setFocus();" + NL
+			+ "\t\t\t\t}" + NL + "\t\t\t\telse" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tencodingField.clearSelection();"
+			+ NL + "\t\t\t\t\tinitialObjectField.setFocus();" + NL + "\t\t\t\t}";
+	protected final String TEXT_180 = NL + "\t\t\t\tinitialObjectField.clearSelection();" + NL
+			+ "\t\t\t\tencodingField.clearSelection();" + NL + "\t\t\t\tfileField.setFocus();";
+	protected final String TEXT_181 = NL + "\t\t\t}" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic String getInitialObjectName()" + NL + "\t\t{" + NL
+			+ "\t\t\tString label = initialObjectField.getText();" + NL;
+	protected final String TEXT_182 = NL + "\t\t\tfor (String name : getInitialObjectNames())";
+	protected final String TEXT_183 = NL + "\t\t\tfor (Iterator i = getInitialObjectNames().iterator(); i.hasNext(); )";
+	protected final String TEXT_184 = NL + "\t\t\t\tString name = (String)i.next();";
+	protected final String TEXT_185 = NL + "\t\t\t\tif (getLabel(name).equals(label))" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\treturn name;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\treturn null;" + NL + "\t\t}"
+			+ NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->"
+			+ NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic String getEncoding()" + NL + "\t\t{" + NL
+			+ "\t\t\treturn encodingField.getText();" + NL + "\t\t}";
+	protected final String TEXT_186 = NL + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tpublic URI getFileURI()" + NL + "\t\t{" + NL + "\t\t\ttry" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\treturn URI.createFileURI(fileField.getText());" + NL + "\t\t\t}" + NL
+			+ "\t\t\tcatch (Exception exception)" + NL + "\t\t\t{" + NL + "\t\t\t\t// Ignore" + NL + "\t\t\t}" + NL
+			+ "\t\t\treturn null;" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
+			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tpublic void selectFileField()" + NL + "\t\t{" + NL + "\t\t\t\tinitialObjectField.clearSelection();"
+			+ NL + "\t\t\t\tencodingField.clearSelection();" + NL + "\t\t\t\tfileField.selectAll();" + NL
+			+ "\t\t\t\tfileField.setFocus();" + NL + "\t\t}\t\t";
+	protected final String TEXT_187 = NL + NL + "\t\t/**" + NL + "\t\t * Returns the label for the specified ";
+	protected final String TEXT_188 = " name." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
+			+ "\t\tprotected String getLabel(String ";
+	protected final String TEXT_189 = "Name)" + NL + "\t\t{" + NL + "\t\t\ttry" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\treturn ";
+	protected final String TEXT_190 = ".INSTANCE.getString(\"";
+	protected final String TEXT_191 = "\" + ";
+	protected final String TEXT_192 = "Name + \"_";
+	protected final String TEXT_193 = "\");";
+	protected final String TEXT_194 = NL + "\t\t\t}" + NL + "\t\t\tcatch(MissingResourceException mre)" + NL + "\t\t\t{"
+			+ NL + "\t\t\t\t";
+	protected final String TEXT_195 = ".INSTANCE.log(mre);" + NL + "\t\t\t}" + NL + "\t\t\treturn ";
+	protected final String TEXT_196 = "Name;" + NL + "\t\t}";
+	protected final String TEXT_197 = NL + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
+	protected final String TEXT_198 = " getEncodings()" + NL + "\t\t{" + NL + "\t\t\tif (encodings == null)" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\tencodings = new ";
+	protected final String TEXT_199 = "();" + NL
+			+ "\t\t\t\tfor (StringTokenizer stringTokenizer = new StringTokenizer(";
+	protected final String TEXT_200 = ".INSTANCE.getString(\"_UI_XMLEncodingChoices\")); stringTokenizer.hasMoreTokens(); )";
+	protected final String TEXT_201 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tencodings.add(stringTokenizer.nextToken());"
+			+ NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\treturn encodings;" + NL + "\t\t}" + NL + "\t}" + NL + ""
+			+ NL + "\t/**" + NL + "\t * The framework calls this to create the contents of the wizard." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_202 = NL + "\tpublic void addPages()" + NL + "\t{";
+	protected final String TEXT_203 = NL + "\t\t// Create a page, set the title, and the initial model file name." + NL
+			+ "\t\t//" + NL + "\t\tnewFileCreationPage = new ";
+	protected final String TEXT_204 = "NewFileCreationPage(\"Whatever\", selection);";
+	protected final String TEXT_205 = NL + "\t\tnewFileCreationPage.setTitle(";
+	protected final String TEXT_206 = "_label\"));";
+	protected final String TEXT_207 = NL + "\t\tnewFileCreationPage.setDescription(";
+	protected final String TEXT_208 = "_description\"));";
+	protected final String TEXT_209 = NL + "\t\tnewFileCreationPage.setFileName(";
+	protected final String TEXT_210 = "FilenameDefaultBase\") + \".\" + ";
+	protected final String TEXT_211 = "(String)";
+	protected final String TEXT_212 = "FILE_EXTENSIONS.get(0));";
+	protected final String TEXT_213 = NL + "\t\taddPage(newFileCreationPage);" + NL + "" + NL
+			+ "\t\t// Try and get the resource selection to determine a current directory for the file dialog." + NL
+			+ "\t\t//" + NL + "\t\tif (selection != null && !selection.isEmpty())" + NL + "\t\t{" + NL
+			+ "\t\t\t// Get the resource..." + NL + "\t\t\t//" + NL
+			+ "\t\t\tObject selectedElement = selection.iterator().next();" + NL
+			+ "\t\t\tif (selectedElement instanceof IResource)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Get the resource parent, if its a file." + NL + "\t\t\t\t//" + NL
+			+ "\t\t\t\tIResource selectedResource = (IResource)selectedElement;" + NL
+			+ "\t\t\t\tif (selectedResource.getType() == IResource.FILE)" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tselectedResource = selectedResource.getParent();" + NL + "\t\t\t\t}" + NL + "" + NL
+			+ "\t\t\t\t// This gives us a directory..." + NL + "\t\t\t\t//" + NL
+			+ "\t\t\t\tif (selectedResource instanceof IFolder || selectedResource instanceof IProject)" + NL
+			+ "\t\t\t\t{" + NL + "\t\t\t\t\t// Set this for the container." + NL + "\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\tnewFileCreationPage.setContainerFullPath(selectedResource.getFullPath());" + NL + "" + NL
+			+ "\t\t\t\t\t// Make up a unique new name here." + NL + "\t\t\t\t\t//" + NL
+			+ "\t\t\t\t\tString defaultModelBaseFilename = ";
+	protected final String TEXT_214 = "FilenameDefaultBase\");";
+	protected final String TEXT_215 = NL + "\t\t\t\t\tString defaultModelFilenameExtension = ";
+	protected final String TEXT_216 = "FILE_EXTENSIONS.get(0);" + NL
+			+ "\t\t\t\t\tString modelFilename = defaultModelBaseFilename + \".\" + defaultModelFilenameExtension;";
+	protected final String TEXT_217 = NL
+			+ "\t\t\t\t\tfor (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i)" + NL
+			+ "\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\tmodelFilename = defaultModelBaseFilename + i + \".\" + defaultModelFilenameExtension;";
+	protected final String TEXT_218 = NL + "\t\t\t\t\t}" + NL
+			+ "\t\t\t\t\tnewFileCreationPage.setFileName(modelFilename);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL
+			+ "\t\t}";
+	protected final String TEXT_219 = NL + "\t\tinitialObjectCreationPage = new ";
+	protected final String TEXT_220 = "InitialObjectCreationPage(\"Whatever2\");";
+	protected final String TEXT_221 = NL + "\t\tinitialObjectCreationPage.setTitle(";
+	protected final String TEXT_222 = NL + "\t\tinitialObjectCreationPage.setDescription(";
+	protected final String TEXT_223 = ".INSTANCE.getString(\"_UI_Wizard_initial_object_description\"));";
+	protected final String TEXT_224 = NL + "\t\taddPage(initialObjectCreationPage);" + NL + "\t}" + NL;
+	protected final String TEXT_225 = NL + "\t/**" + NL + "\t * Get the URI from the page." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic URI getModelURI()" + NL + "\t{" + NL + "\t\treturn initialObjectCreationPage.getFileURI();"
+			+ NL + "\t}" + NL;
+	protected final String TEXT_226 = NL + "\t/**" + NL + "\t * Get the file from the page." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic IFile getModelFile()" + NL + "\t{" + NL + "\t\treturn newFileCreationPage.getModelFile();"
+			+ NL + "\t}" + NL;
+	protected final String TEXT_227 = NL + "}";
+	protected final String TEXT_228 = NL;
+
+	public ModelWizard() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_228);
+		stringBuffer.append(TEXT_228);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getEditorDirectory();
+		packageName = genPackage.getPresentationPackageName();
+		className = genPackage.getModelWizardClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		String _ListOfString = "List"
+				+ (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");
+		String _ArrayListOfString = "ArrayList"
+				+ (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");
+		String _CollectionOfString = "Collection"
+				+ (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");
+		String _MapOfObjectToObject = "Map"
+				+ (genModel.useGenerics()
+						? "<" + genModel.getImportedName("java.lang.Object") + ", "
+								+ genModel.getImportedName("java.lang.Object") + ">"
+						: "");
+		String _HashMapOfObjectToObject = "HashMap"
+				+ (genModel.useGenerics()
+						? "<" + genModel.getImportedName("java.lang.Object") + ", "
+								+ genModel.getImportedName("java.lang.Object") + ">"
+						: "");
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getPresentationPackageName());
+		stringBuffer.append(TEXT_3);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_4);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
+			stringBuffer.append(TEXT_6);
+		}
+		stringBuffer.append(TEXT_7);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_10);
+		}
+		if (!genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genPackage.getQualifiedFactoryInterfaceName());
+			stringBuffer.append(TEXT_12);
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(genPackage.getQualifiedEditPluginClassName());
+		stringBuffer.append(TEXT_14);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_15);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_17);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_18);
+		}
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genPackage.getModelWizardClassName());
+		stringBuffer.append(TEXT_20);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(_ListOfString);
+		stringBuffer.append(TEXT_25);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_26);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(genModel.getNonNLS(2));
+		stringBuffer.append(TEXT_28);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_26);
+		stringBuffer.append(genPackage.getEditorClassName());
+		stringBuffer.append(TEXT_29);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(genModel.getNonNLS(2));
+		stringBuffer.append(genModel.getNonNLS(3));
+		stringBuffer.append(TEXT_30);
+		stringBuffer
+				.append(genModel.isSuppressEMFMetaData() ? genModel.getImportedName("org.eclipse.emf.ecore.EPackage")
+						: genPackage.getPackageInterfaceName());
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(genPackage.getUncapPackageName());
+		stringBuffer.append(TEXT_32);
+		stringBuffer.append(genPackage.getPackageInterfaceName());
+		stringBuffer.append(TEXT_33);
+		stringBuffer
+				.append(genModel.isSuppressEMFMetaData() ? genModel.getImportedName("org.eclipse.emf.ecore.EFactory")
+						: genPackage.getFactoryInterfaceName());
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(genPackage.getUncapFactoryName());
+		stringBuffer.append(TEXT_32);
+		stringBuffer.append(genPackage.getUncapPackageName());
+		stringBuffer.append(TEXT_34);
+		stringBuffer.append(genModel.isSuppressEMFMetaData() ? "EFactoryInstance" : genPackage.getFactoryName());
+		stringBuffer.append(TEXT_35);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_37);
+		}
+		stringBuffer.append(TEXT_38);
+		stringBuffer.append(genPackage.getModelWizardClassName());
+		stringBuffer.append(TEXT_39);
+		if (!genPackage.hasDocumentRoot()) {
+			stringBuffer.append(TEXT_40);
+		} else {
+			stringBuffer.append(TEXT_41);
+		}
+		stringBuffer.append(TEXT_42);
+		stringBuffer.append(_ListOfString);
+		stringBuffer.append(TEXT_43);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_44);
+		}
+		stringBuffer.append(TEXT_45);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_46);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_47);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_48);
+		stringBuffer.append(genPackage.getPrefix());
+		stringBuffer.append(TEXT_49);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_50);
+		if (!genPackage.hasDocumentRoot()) {
+			stringBuffer.append(TEXT_51);
+		} else {
+			stringBuffer.append(TEXT_52);
+		}
+		stringBuffer.append(TEXT_42);
+		stringBuffer.append(_CollectionOfString);
+		stringBuffer.append(TEXT_53);
+		stringBuffer.append(_ArrayListOfString);
+		stringBuffer.append(TEXT_54);
+		if (!genPackage.hasDocumentRoot()) {
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_55);
+				stringBuffer.append(genPackage.getUncapPackageName());
+				stringBuffer.append(TEXT_56);
+			} else {
+				stringBuffer.append(TEXT_57);
+				stringBuffer.append(genPackage.getUncapPackageName());
+				stringBuffer.append(TEXT_58);
+			}
+			stringBuffer.append(TEXT_59);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_60);
+			}
+			stringBuffer.append(TEXT_61);
+		} else {
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+				stringBuffer.append(TEXT_63);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
+				stringBuffer.append(TEXT_65);
+				stringBuffer.append(genPackage.getUncapPackageName());
+				stringBuffer.append(TEXT_66);
+			} else {
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
+				stringBuffer.append(TEXT_65);
+				stringBuffer.append(genPackage.getUncapPackageName());
+				stringBuffer.append(TEXT_68);
+			}
+			stringBuffer.append(TEXT_59);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_69);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+				stringBuffer.append(TEXT_70);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+				stringBuffer.append(TEXT_71);
+			}
+			stringBuffer.append(TEXT_72);
+		}
+		stringBuffer.append(TEXT_73);
+		if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
+			stringBuffer.append(TEXT_74);
+		} else {
+			stringBuffer.append(TEXT_75);
+		}
+		stringBuffer.append(TEXT_76);
+		if (!genPackage.hasDocumentRoot()) {
+			stringBuffer.append(TEXT_77);
+			stringBuffer.append(genPackage.getUncapPackageName());
+			stringBuffer.append(TEXT_78);
+			stringBuffer.append(genPackage.getUncapFactoryName());
+			stringBuffer.append(TEXT_79);
+		} else {
+			stringBuffer.append(TEXT_80);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(genPackage.getUncapPackageName());
+			stringBuffer.append(TEXT_81);
+			stringBuffer.append(genPackage.getUncapFactoryName());
+			stringBuffer.append(TEXT_82);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil"));
+			stringBuffer.append(TEXT_83);
+		}
+		stringBuffer.append(TEXT_84);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_44);
+		}
+		stringBuffer.append(TEXT_85);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_86);
+			stringBuffer.append(genModel.getImportedName("java.io.File"));
+			stringBuffer.append(TEXT_87);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_88);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_89);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_90);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_91);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.operation.IRunnableWithProgress"));
+			stringBuffer.append(TEXT_92);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.operation.IRunnableWithProgress"));
+			stringBuffer.append(TEXT_93);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_94);
+			}
+			stringBuffer.append(TEXT_95);
+		} else {
+			stringBuffer.append(TEXT_96);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_97);
+			}
+			stringBuffer.append(TEXT_98);
+		}
+		stringBuffer.append(TEXT_99);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_100);
+		}
+		stringBuffer.append(TEXT_101);
+		if (genPackage.isContentType()) {
+			stringBuffer.append(TEXT_102);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_103);
+		}
+		stringBuffer.append(TEXT_104);
+		stringBuffer.append(_MapOfObjectToObject);
+		stringBuffer.append(TEXT_105);
+		stringBuffer.append(_HashMapOfObjectToObject);
+		stringBuffer.append(TEXT_106);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_107);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_108);
+			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName()));
+			stringBuffer.append(TEXT_109);
+		} else {
+			stringBuffer.append(TEXT_110);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IWorkbenchWindow"));
+			stringBuffer.append(TEXT_111);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IWorkbenchPage"));
+			stringBuffer.append(TEXT_112);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IWorkbenchPart"));
+			stringBuffer.append(TEXT_113);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelection"));
+			stringBuffer.append(TEXT_114);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.StructuredSelection"));
+			stringBuffer.append(TEXT_115);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_116);
+			}
+			stringBuffer.append(TEXT_117);
+			if (!genPackage.isContentType()) {
+				stringBuffer.append(TEXT_118);
+			} else {
+				stringBuffer.append(TEXT_119);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.Platform"));
+				stringBuffer.append(TEXT_120);
+				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+				stringBuffer.append(TEXT_121);
+			}
+			stringBuffer.append(TEXT_122);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.PartInitException"));
+			stringBuffer.append(TEXT_123);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_124);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_125);
+		}
+		stringBuffer.append(TEXT_126);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_127);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_128);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_129);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_130);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_131);
+			}
+			stringBuffer.append(TEXT_132);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.Path"));
+			stringBuffer.append(TEXT_133);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_134);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_135);
+		}
+		stringBuffer.append(TEXT_136);
+		stringBuffer.append(genPackage.getModelWizardClassName());
+		stringBuffer.append(TEXT_137);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_138);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Text"));
+			stringBuffer.append(TEXT_139);
+		}
+		stringBuffer.append(TEXT_140);
+		stringBuffer.append(_ListOfString);
+		stringBuffer.append(TEXT_141);
+		stringBuffer.append(genPackage.getModelWizardClassName());
+		stringBuffer.append(TEXT_142);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_131);
+		}
+		stringBuffer.append(TEXT_143);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_144);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_145);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_146);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Text"));
+			stringBuffer.append(TEXT_147);
+			if (!genModel.isRichAjaxPlatform()) {
+				stringBuffer.append(TEXT_148);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Button"));
+				stringBuffer.append(TEXT_149);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Button"));
+				stringBuffer.append(TEXT_150);
+				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+				stringBuffer.append(TEXT_151);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_152);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.events.SelectionAdapter"));
+				stringBuffer.append(TEXT_153);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_154);
+				}
+				stringBuffer.append(TEXT_155);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.events.SelectionEvent"));
+				stringBuffer.append(TEXT_156);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_157);
+				}
+				stringBuffer.append(genPackage.getImportedEditorClassName());
+				stringBuffer.append(TEXT_158);
+				stringBuffer.append(genPackage.getImportedEditorClassName());
+				stringBuffer.append(TEXT_159);
+				stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName()));
+				stringBuffer.append(TEXT_160);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.SWT"));
+				stringBuffer.append(TEXT_161);
+			}
+		}
+		stringBuffer.append(TEXT_162);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_163);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_164);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_165);
+		} else {
+			stringBuffer.append(TEXT_166);
+		}
+		stringBuffer.append(TEXT_167);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_168);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_169);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_170);
+		} else {
+			stringBuffer.append(TEXT_171);
+		}
+		stringBuffer.append(TEXT_172);
+		if (genModel.useInterfaceOverrideAnnotation()) {
+			stringBuffer.append(TEXT_94);
+		}
+		stringBuffer.append(TEXT_173);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_174);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_175);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_176);
+		}
+		stringBuffer.append(TEXT_177);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_131);
+		}
+		stringBuffer.append(TEXT_178);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_179);
+		} else {
+			stringBuffer.append(TEXT_180);
+		}
+		stringBuffer.append(TEXT_181);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_182);
+		} else {
+			stringBuffer.append(TEXT_183);
+		}
+		stringBuffer.append(TEXT_59);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_184);
+		}
+		stringBuffer.append(TEXT_185);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_186);
+		}
+		{
+			String type = genPackage.hasDocumentRoot() ? "feature" : "type";
+			String prefix = genPackage.hasDocumentRoot() ? "_UI_DocumentRoot_" : "_UI_";
+			stringBuffer.append(TEXT_187);
+			stringBuffer.append(type);
+			stringBuffer.append(TEXT_188);
+			stringBuffer.append(type);
+			stringBuffer.append(TEXT_189);
+			stringBuffer.append(genPackage.getEditPluginClassName());
+			stringBuffer.append(TEXT_190);
+			stringBuffer.append(prefix);
+			stringBuffer.append(TEXT_191);
+			stringBuffer.append(type);
+			stringBuffer.append(TEXT_192);
+			stringBuffer.append(type);
+			stringBuffer.append(TEXT_193);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_194);
+			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorPluginClassName()));
+			stringBuffer.append(TEXT_195);
+			stringBuffer.append(type);
+			stringBuffer.append(TEXT_196);
+		}
+		stringBuffer.append(TEXT_197);
+		stringBuffer.append(_CollectionOfString);
+		stringBuffer.append(TEXT_198);
+		stringBuffer.append(_ArrayListOfString);
+		stringBuffer.append(TEXT_199);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_200);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_201);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_131);
+		}
+		stringBuffer.append(TEXT_202);
+		if (!genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_203);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_204);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_205);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_206);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_207);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getModelWizardClassName());
+			stringBuffer.append(TEXT_208);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_209);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_210);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_211);
+			}
+			stringBuffer.append(TEXT_212);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_213);
+			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getEditorClassName());
+			stringBuffer.append(TEXT_214);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_215);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_211);
+			}
+			stringBuffer.append(TEXT_216);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_217);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_218);
+		}
+		stringBuffer.append(TEXT_219);
+		stringBuffer.append(genPackage.getModelWizardClassName());
+		stringBuffer.append(TEXT_220);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_221);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_26);
+		stringBuffer.append(genPackage.getModelWizardClassName());
+		stringBuffer.append(TEXT_206);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_222);
+		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
+		stringBuffer.append(TEXT_223);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_224);
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_225);
+		} else {
+			stringBuffer.append(TEXT_226);
+		}
+		stringBuffer.append(TEXT_227);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_23);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard()
+				&& genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelWizardIcon.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelWizardIcon.java
new file mode 100644
index 0000000..60c23df
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModelWizardIcon.java
@@ -0,0 +1,134 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModelWizardIcon extends org.eclipse.egf.emf.pattern.base.GenPackageGIF {
+	protected static String nl;
+
+	public static synchronized ModelWizardIcon create(String lineSeparator) {
+		nl = lineSeparator;
+		ModelWizardIcon result = new ModelWizardIcon();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ModelWizardIcon() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		if (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard()) {
+			new CodegenGeneratorAdapter(parameter).generateGIF("editor/NewModel.gif",
+					genPackage.getModelWizardIconFileName(), genPackage.getPrefix(), null, false);
+		} else {
+		}
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModuleGWTXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModuleGWTXML.java
new file mode 100644
index 0000000..09462c1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/ModuleGWTXML.java
@@ -0,0 +1,207 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModuleGWTXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ModuleGWTXML create(String lineSeparator) {
+		nl = lineSeparator;
+		ModuleGWTXML result = new ModuleGWTXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL
+			+ "<!DOCTYPE module PUBLIC \"-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN\" \"http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd\">"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + NL + "<module>" + NL
+			+ "  <inherits name='com.google.gwt.user.theme.standard.Standard'/>";
+	protected final String TEXT_4 = NL + "  <inherits name=\"";
+	protected final String TEXT_5 = "\" />";
+	protected final String TEXT_6 = NL + NL + "  <entry-point class='";
+	protected final String TEXT_7 = "'/>" + NL;
+	protected final String TEXT_8 = NL + "  <source path=\"";
+	protected final String TEXT_9 = "\"/>";
+	protected final String TEXT_10 = NL + "</module>" + NL;
+	protected final String TEXT_11 = NL;
+
+	public ModuleGWTXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(TEXT_11);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorDirectory() + "/" + genModel.getQualifiedEditorModuleName().replace(".", "/")
+				+ ".gwt.xml";
+		overwrite = false;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		for (String inherits : genModel.getEditorModuleInherits()) {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(inherits);
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genModel.getQualifiedEditorEntryPointClassName());
+		stringBuffer.append(TEXT_7);
+		for (String source : genModel.getEditorModuleSources()) {
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(source);
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Plugin.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Plugin.java
new file mode 100644
index 0000000..6442a4b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/Plugin.java
@@ -0,0 +1,313 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Plugin extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized Plugin create(String lineSeparator) {
+		nl = lineSeparator;
+		Plugin result = new Plugin();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * This is the central singleton for the ";
+	protected final String TEXT_5 = " editor plugin." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "public final class ";
+	protected final String TEXT_10 = " extends EMFPlugin" + NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL + "\t";
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * Keep track of the singleton." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final ";
+	protected final String TEXT_16 = " INSTANCE = new ";
+	protected final String TEXT_17 = "();" + NL + "\t";
+	protected final String TEXT_18 = NL + "\t/**" + NL + "\t * Keep track of the singleton." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static Implementation plugin;" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * Create the instance." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_20 = "()" + NL + "\t{" + NL + "\t\tsuper" + NL + "\t\t\t(new ResourceLocator [] " + NL
+			+ "\t\t\t{";
+	protected final String TEXT_21 = NL + "\t\t\t\t";
+	protected final String TEXT_22 = ".INSTANCE,";
+	protected final String TEXT_23 = NL + "\t\t\t});" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns the singleton instance of the Eclipse plugin." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the singleton instance." + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_24 = NL + "\t@Override";
+	protected final String TEXT_25 = NL + "\tpublic ResourceLocator getPluginResourceLocator()" + NL + "\t{";
+	protected final String TEXT_26 = NL + "\t\treturn null;";
+	protected final String TEXT_27 = NL + "\t\treturn plugin;";
+	protected final String TEXT_28 = NL + "\t}" + NL + "\t";
+	protected final String TEXT_29 = NL + "\t/**" + NL + "\t * Returns the singleton instance of the Eclipse plugin."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the singleton instance." + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static Implementation getPlugin()" + NL + "\t{" + NL + "\t\treturn plugin;" + NL + "\t}" + NL
+			+ "\t" + NL + "\t/**" + NL + "\t * The actual implementation of the Eclipse <b>Plugin</b>." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static class Implementation extends ";
+	protected final String TEXT_30 = NL + "\t{" + NL + "\t\t/**" + NL + "\t\t * Creates an instance." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_31 = NL + "\t\t * @param descriptor the description of the plugin.";
+	protected final String TEXT_32 = NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic Implementation(";
+	protected final String TEXT_33 = " descriptor";
+	protected final String TEXT_34 = ")" + NL + "\t\t{" + NL + "\t\t\tsuper(";
+	protected final String TEXT_35 = "descriptor";
+	protected final String TEXT_36 = ");" + NL + "\t" + NL + "\t\t\t// Remember the static instance." + NL + "\t\t\t//"
+			+ NL + "\t\t\tplugin = this;" + NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_37 = NL + "}";
+	protected final String TEXT_38 = NL;
+	protected final String TEXT_39 = NL;
+
+	public Plugin() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_39);
+		stringBuffer.append(TEXT_39);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getEditorPluginDirectory();
+		packageName = genModel.getEditorPluginPackageName();
+		className = genModel.getEditorPluginClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2004 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditorPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("org.eclipse.emf.common.EMFPlugin");
+		genModel.addImport("org.eclipse.emf.common.util.ResourceLocator");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_5);
+		if (genModel.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genModel.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genModel.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genModel.getEditorPluginClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genModel.getEditorPluginClassName());
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genModel.getEditorPluginClassName());
+		stringBuffer.append(TEXT_17);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_18);
+		}
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genModel.getEditorPluginClassName());
+		stringBuffer.append(TEXT_20);
+		for (String pluginClassName : genModel.getEditResourceDelegateImportedPluginClassNames()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(pluginClassName);
+			stringBuffer.append(TEXT_22);
+		}
+		stringBuffer.append(TEXT_23);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_24);
+		}
+		stringBuffer.append(TEXT_25);
+		if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_26);
+		} else {
+			stringBuffer.append(TEXT_27);
+		}
+		stringBuffer.append(TEXT_28);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.ui.EclipseUIPlugin"));
+			stringBuffer.append(TEXT_30);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(TEXT_31);
+			}
+			stringBuffer.append(TEXT_32);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.IPluginDescriptor"));
+				stringBuffer.append(TEXT_33);
+			}
+			stringBuffer.append(TEXT_34);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(TEXT_35);
+			}
+			stringBuffer.append(TEXT_36);
+		}
+		stringBuffer.append(TEXT_37);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_38);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/PluginProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/PluginProperties.java
new file mode 100644
index 0000000..5a4da4a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/PluginProperties.java
@@ -0,0 +1,318 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginProperties extends org.eclipse.egf.emf.pattern.base.GenModelProperties {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "pluginName = ";
+	protected final String TEXT_3 = NL + "providerName = ";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "_UI_";
+	protected final String TEXT_6 = "_menu = &";
+	protected final String TEXT_7 = " Editor";
+	protected final String TEXT_8 = NL + "_UI_CreateChild_menu_item = &New Child" + NL
+			+ "_UI_CreateSibling_menu_item = N&ew Sibling" + NL;
+	protected final String TEXT_9 = NL + "_UI_ShowPropertiesView_menu_item = Show &Properties View" + NL
+			+ "_UI_RefreshViewer_menu_item = &Refresh" + NL + "" + NL + "_UI_SelectionPage_label = Selection";
+	protected final String TEXT_10 = NL + "_UI_ParentPage_label = Parent" + NL + "_UI_ListPage_label = List" + NL
+			+ "_UI_TreePage_label = Tree" + NL + "_UI_TablePage_label = Table" + NL
+			+ "_UI_TreeWithColumnsPage_label = Tree with Columns" + NL + "_UI_ObjectColumn_label = Object" + NL
+			+ "_UI_SelfColumn_label = Self";
+	protected final String TEXT_11 = NL + NL + "_UI_NoObjectSelected = Selected Nothing" + NL
+			+ "_UI_SingleObjectSelected = Selected Object: {0}" + NL + "_UI_MultiObjectSelected = Selected {0} Objects"
+			+ NL + "" + NL + "_UI_OpenEditorError_label = Open Editor" + NL + "" + NL
+			+ "_UI_Wizard_category = Example EMF Model Creation Wizards" + NL + "" + NL
+			+ "_UI_CreateModelError_message = Problems encountered in file \"{0}\"" + NL;
+	protected final String TEXT_12 = "_label = ";
+	protected final String TEXT_13 = " Model" + NL + "_UI_";
+	protected final String TEXT_14 = "_description = Create a new ";
+	protected final String TEXT_15 = " model" + NL;
+	protected final String TEXT_16 = " Model Editor" + NL + "" + NL + "_UI_";
+	protected final String TEXT_17 = "FilenameDefaultBase = My" + NL + "_UI_";
+	protected final String TEXT_18 = "FilenameExtensions = ";
+	protected final String TEXT_19 = NL + "_UI_Wizard_label = New" + NL + "" + NL
+			+ "_WARN_FilenameExtension = The file name must end in ''.{0}''" + NL
+			+ "_WARN_FilenameExtensions = The file name must have one of the following extensions: {0}" + NL + "" + NL
+			+ "_UI_ModelObject = &Model Object" + NL + "_UI_XMLEncoding = &XML Encoding" + NL
+			+ "_UI_XMLEncodingChoices = ";
+	protected final String TEXT_20 = NL
+			+ "_UI_Wizard_initial_object_description = Specify a file name and select a model object to create";
+	protected final String TEXT_21 = NL + "_UI_Wizard_initial_object_description = Select a model object to create";
+	protected final String TEXT_22 = NL + NL + "_UI_FileConflict_label = File Conflict" + NL
+			+ "_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?"
+			+ NL;
+	protected final String TEXT_23 = "_ActionSet_label = ";
+	protected final String TEXT_24 = " Action Set" + NL + "_UI_Perspective_label = ";
+	protected final String TEXT_25 = NL + NL + "_UI_Browse_label = &Browse..." + NL + "_UI_File_label = &File" + NL
+			+ "_UI_Question_title = Question" + NL
+			+ "_WARN_FileConflict = The file \"{0}\" already exists.  Do you want to replace the existing file?" + NL
+			+ "_UI_Error_title = Error" + NL + "_WARN_No_Editor = There is no editor registered for the file \"{0}\"."
+			+ NL + "" + NL + "_UI_Application_title = ";
+	protected final String TEXT_26 = " Application" + NL + "_UI_Menu_File_label = &File" + NL
+			+ "_UI_Menu_New_label = &New" + NL + "_UI_Menu_Open_label = &Open..." + NL
+			+ "_UI_Menu_Open_description = Opens a model object file" + NL + "_UI_Menu_OpenURI_label = &Open URI..."
+			+ NL + "_UI_Menu_OpenURI_description = Opens a model object loading it from a URI" + NL
+			+ "_UI_Menu_Edit_label = &Edit" + NL + "_UI_Menu_Window_label = &Window" + NL
+			+ "_UI_Menu_Help_label = &Help" + NL + "_UI_Menu_About_label = ";
+	protected final String TEXT_27 = " &About..." + NL + "_UI_About_title = ";
+	protected final String TEXT_28 = " Application" + NL + "_UI_About_text = ";
+	protected final String TEXT_29 = " Application about box goes here." + NL;
+	protected final String TEXT_30 = " Model Action Set";
+	protected final String TEXT_31 = NL;
+
+	public PluginProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(TEXT_31);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/" + genModel.getEditorBundleLocalization()
+				+ ".properties";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2006 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getEditorBundleName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getEditorBundleVendorName());
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_4);
+			boolean hasMultiPageEditor = false;
+			for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+				if (genPackage.isMultipleEditorPages()) {
+					hasMultiPageEditor = true;
+				}
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genPackage.getEditorClassName());
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genPackage.getPrefix());
+				stringBuffer.append(TEXT_7);
+			}
+			stringBuffer.append(TEXT_4);
+			if (genModel.isCreationCommands()) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			if (hasMultiPageEditor) {
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+				if (genPackage.isGenerateModelWizard()) {
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(genPackage.getModelWizardClassName());
+					stringBuffer.append(TEXT_12);
+					stringBuffer.append(genPackage.getPrefix());
+					stringBuffer.append(TEXT_13);
+					stringBuffer.append(genPackage.getModelWizardClassName());
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genPackage.getPrefix());
+					stringBuffer.append(TEXT_15);
+				}
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genPackage.getEditorClassName());
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genPackage.getPrefix());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genPackage.getEditorClassName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genPackage.getEditorClassName());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genPackage.getFileExtensions());
+				stringBuffer.append(TEXT_4);
+			}
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genModel.getXMLEncodingChoices());
+			if (genModel.isRichClientPlatform()) {
+				stringBuffer.append(TEXT_20);
+			} else {
+				stringBuffer.append(TEXT_21);
+			}
+			stringBuffer.append(TEXT_22);
+			if (genModel.isRichClientPlatform()) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genModel.getEditorAdvisorClassName());
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genModel.getModelName());
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(genModel.getModelName());
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genModel.getModelName());
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genModel.getModelName());
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(genModel.getModelName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genModel.getModelName());
+				stringBuffer.append(TEXT_29);
+				for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+					if (genPackage.isGenerateModelWizard()) {
+						stringBuffer.append(TEXT_5);
+						stringBuffer.append(genPackage.getModelWizardClassName());
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genPackage.getPrefix());
+						stringBuffer.append(TEXT_30);
+					}
+				}
+				stringBuffer.append(TEXT_4);
+			}
+		}
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/PluginXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/PluginXML.java
new file mode 100644
index 0000000..03f9353
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/PluginXML.java
@@ -0,0 +1,613 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized PluginXML create(String lineSeparator) {
+		nl = lineSeparator;
+		PluginXML result = new PluginXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL + "<?eclipse version=\"3.0\"?>"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "<plugin>";
+	protected final String TEXT_4 = NL + "<plugin" + NL + "      name=\"%pluginName\"" + NL + "      id=\"";
+	protected final String TEXT_5 = "\"" + NL + "      version=\"1.0.0\"" + NL + "      provider-name=\"%providerName\""
+			+ NL + "      class=\"";
+	protected final String TEXT_6 = "$Implementation\">" + NL + "" + NL + "   <requires>";
+	protected final String TEXT_7 = NL + "      <import plugin=\"";
+	protected final String TEXT_8 = "\"";
+	protected final String TEXT_9 = " export=\"true\"";
+	protected final String TEXT_10 = "/>";
+	protected final String TEXT_11 = NL + "   </requires>" + NL + "" + NL + "   <runtime>";
+	protected final String TEXT_12 = NL + "      <library name=\"";
+	protected final String TEXT_13 = ".jar\">";
+	protected final String TEXT_14 = NL + "      <library name=\".\">";
+	protected final String TEXT_15 = NL + "         <export name=\"*\"/>" + NL + "      </library>" + NL
+			+ "   </runtime>";
+	protected final String TEXT_16 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.generated_package\">";
+	protected final String TEXT_17 = NL + "      <!-- @generated ";
+	protected final String TEXT_18 = " -->";
+	protected final String TEXT_19 = NL + "      <package" + NL + "            uri=\"";
+	protected final String TEXT_20 = NL + "            class=\"";
+	protected final String TEXT_21 = "\"" + NL + "            genModel=\"";
+	protected final String TEXT_22 = "\"/>";
+	protected final String TEXT_23 = NL + "   </extension>";
+	protected final String TEXT_24 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.content_parser\">";
+	protected final String TEXT_25 = NL + "      <parser" + NL + "            contentTypeIdentifier=\"";
+	protected final String TEXT_26 = "\"" + NL + "            class=\"";
+	protected final String TEXT_27 = "\"/>" + NL + "   </extension>" + NL + "" + NL
+			+ "   <extension point=\"org.eclipse.core.contenttype.contentTypes\">";
+	protected final String TEXT_28 = NL + "      <content-type" + NL + "            base-type=\"";
+	protected final String TEXT_29 = "\"" + NL + "            file-extensions=\"";
+	protected final String TEXT_30 = "\"" + NL + "            id=\"";
+	protected final String TEXT_31 = "\"" + NL + "            name=\"%_UI_";
+	protected final String TEXT_32 = "_content_type\"" + NL + "            priority=\"normal\">" + NL
+			+ "         <describer class=\"org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer\">";
+	protected final String TEXT_33 = NL + "            <parameter name=\"namespace\" value=\"";
+	protected final String TEXT_34 = NL + "            <parameter name=\"kind\" value=\"xmi\"/>";
+	protected final String TEXT_35 = NL + "         </describer>" + NL + "      </content-type>" + NL
+			+ "   </extension>";
+	protected final String TEXT_36 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.extension_parser\">";
+	protected final String TEXT_37 = NL + "      <parser" + NL + "            type=\"";
+	protected final String TEXT_38 = NL + NL
+			+ "   <extension point=\"org.eclipse.emf.edit.itemProviderAdapterFactories\">";
+	protected final String TEXT_39 = NL + "      <factory" + NL + "            uri=\"";
+	protected final String TEXT_40 = "\"" + NL + "            supportedTypes=";
+	protected final String TEXT_41 = NL + "              ";
+	protected final String TEXT_42 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.childCreationExtenders\">";
+	protected final String TEXT_43 = NL + "      <extender" + NL + "            uri=\"";
+	protected final String TEXT_44 = "$";
+	protected final String TEXT_45 = NL + NL + "   <extension" + NL
+			+ "         point=\"org.eclipse.core.runtime.applications\"" + NL + "         id=\"";
+	protected final String TEXT_46 = "Application\">";
+	protected final String TEXT_47 = NL + "      <application>" + NL + "         <run class=\"";
+	protected final String TEXT_48 = "$Application\"/>" + NL + "      </application>" + NL + "   </extension>" + NL + ""
+			+ NL + "   <extension point=\"org.eclipse.ui.perspectives\">";
+	protected final String TEXT_49 = NL + "      <perspective" + NL + "            name=\"%_UI_Perspective_label\"" + NL
+			+ "            class=\"";
+	protected final String TEXT_50 = "$Perspective\"" + NL + "            id=\"";
+	protected final String TEXT_51 = "Perspective\">" + NL + "      </perspective>" + NL + "   </extension>" + NL + ""
+			+ NL + "   <extension point=\"org.eclipse.ui.commands\">";
+	protected final String TEXT_52 = NL + "      <command" + NL + "            name=\"%_UI_Menu_OpenURI_label\"" + NL
+			+ "            description=\"%_UI_Menu_OpenURI_description\"" + NL
+			+ "            categoryId=\"org.eclipse.ui.category.file\"" + NL + "            id=\"";
+	protected final String TEXT_53 = "OpenURICommand\"/>";
+	protected final String TEXT_54 = NL + "      <command" + NL + "            name=\"%_UI_Menu_Open_label\"" + NL
+			+ "            description=\"%_UI_Menu_Open_description\"" + NL
+			+ "            categoryId=\"org.eclipse.ui.category.file\"" + NL + "            id=\"";
+	protected final String TEXT_55 = "OpenCommand\"/>";
+	protected final String TEXT_56 = NL + "   </extension>" + NL;
+	protected final String TEXT_57 = NL + "   <extension point=\"org.eclipse.ui.bindings\">";
+	protected final String TEXT_58 = NL + "      <key" + NL + "            commandId=\"";
+	protected final String TEXT_59 = "OpenURICommand\"" + NL + "            sequence=\"M1+U\"" + NL
+			+ "            schemeId=\"org.eclipse.ui.defaultAcceleratorConfiguration\"/>" + NL + "      <key" + NL
+			+ "            commandId=\"";
+	protected final String TEXT_60 = "OpenCommand\"" + NL + "            sequence=\"M1+O\"" + NL
+			+ "            schemeId=\"org.eclipse.ui.defaultAcceleratorConfiguration\"/>" + NL + "   </extension>";
+	protected final String TEXT_61 = NL + NL + "   <extension point=\"org.eclipse.ui.actionSets\">";
+	protected final String TEXT_62 = NL + "      <actionSet" + NL + "            label=\"%_UI_";
+	protected final String TEXT_63 = "_ActionSet_label\"" + NL + "            visible=\"true\"" + NL
+			+ "            id=\"";
+	protected final String TEXT_64 = "ActionSet\">" + NL + "         <action" + NL
+			+ "               label=\"%_UI_Menu_About_label\"" + NL + "               class=\"";
+	protected final String TEXT_65 = "$AboutAction\"" + NL + "               menubarPath=\"help/additions\"" + NL
+			+ "               id=\"";
+	protected final String TEXT_66 = "AboutAction\"/>" + NL + "         <action" + NL
+			+ "               label=\"%_UI_Menu_OpenURI_label\"" + NL + "               definitionId=\"";
+	protected final String TEXT_67 = "OpenURICommand\"" + NL + "               class=\"";
+	protected final String TEXT_68 = "$OpenURIAction\"" + NL + "               menubarPath=\"file/additions\"" + NL
+			+ "               id=\"";
+	protected final String TEXT_69 = "OpenURIAction\"/>";
+	protected final String TEXT_70 = NL + "         <action" + NL + "               label=\"%_UI_Menu_Open_label\"" + NL
+			+ "               definitionId=\"";
+	protected final String TEXT_71 = "OpenCommand\"" + NL + "               class=\"";
+	protected final String TEXT_72 = "$OpenAction\"" + NL + "               menubarPath=\"file/additions\"" + NL
+			+ "               id=\"";
+	protected final String TEXT_73 = "OpenAction\"/>";
+	protected final String TEXT_74 = NL + "      </actionSet>" + NL + "   </extension>";
+	protected final String TEXT_75 = "ActionSet\">" + NL + "         <action" + NL + "               label=\"%_UI_";
+	protected final String TEXT_76 = "_label\"" + NL + "               class=\"";
+	protected final String TEXT_77 = "$NewAction\"" + NL + "               menubarPath=\"file/new/additions\"" + NL
+			+ "               id=\"";
+	protected final String TEXT_78 = "NewAction\"/>" + NL + "      </actionSet>" + NL + "   </extension>";
+	protected final String TEXT_79 = NL + NL + "   <extension point=\"org.eclipse.ui.newWizards\">";
+	protected final String TEXT_80 = NL + "      <category" + NL
+			+ "            id=\"org.eclipse.emf.ecore.Wizard.category.ID\"" + NL
+			+ "            name=\"%_UI_Wizard_category\"/>" + NL + "      <wizard" + NL + "            id=\"";
+	protected final String TEXT_81 = "ID\"" + NL + "            name=\"%_UI_";
+	protected final String TEXT_82 = "_label\"" + NL + "            class=\"";
+	protected final String TEXT_83 = "\"" + NL + "            category=\"org.eclipse.emf.ecore.Wizard.category.ID\""
+			+ NL + "            icon=\"icons/full/obj16/";
+	protected final String TEXT_84 = "ModelFile.gif\">" + NL + "         <description>%_UI_";
+	protected final String TEXT_85 = "_description</description>" + NL
+			+ "         <selection class=\"org.eclipse.core.resources.IResource\"/>" + NL + "      </wizard>" + NL
+			+ "   </extension>";
+	protected final String TEXT_86 = NL + NL + "   <extension point=\"org.eclipse.ui.editors\">";
+	protected final String TEXT_87 = NL + "      <editor" + NL + "            id=\"";
+	protected final String TEXT_88 = "_label\"" + NL + "            icon=\"icons/full/obj16/";
+	protected final String TEXT_89 = "ModelFile.gif\"";
+	protected final String TEXT_90 = NL + "            extensions=\"";
+	protected final String TEXT_91 = "\"" + NL + "            contributorClass=\"";
+	protected final String TEXT_92 = "\">";
+	protected final String TEXT_93 = NL + "         <contentTypeBinding contentTypeId=\"";
+	protected final String TEXT_94 = NL + "      </editor>" + NL + "   </extension>";
+	protected final String TEXT_95 = NL + NL + "</plugin>" + NL;
+	protected final String TEXT_96 = NL;
+
+	public PluginXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_96);
+		stringBuffer.append(TEXT_96);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/plugin.xml";
+		overwrite = true;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String key = genModel.getPluginKey();
+		boolean hasKey = key != null && !key.equals("");
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getEditorPluginID());
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genModel.getQualifiedEditorPluginClassName());
+			stringBuffer.append(TEXT_6);
+			for (String pluginID : genModel.getEditorRequiredPlugins()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(pluginID);
+				stringBuffer.append(TEXT_8);
+				if (!pluginID.startsWith("org.eclipse.core.runtime")) {
+					stringBuffer.append(TEXT_9);
+				}
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			if (genModel.isRuntimeJar()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genModel.getEditorPluginID());
+				stringBuffer.append(TEXT_13);
+			} else {
+				stringBuffer.append(TEXT_14);
+			}
+			stringBuffer.append(TEXT_15);
+		}
+		if (genModel.sameModelEditorProject()) {
+			for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+				stringBuffer.append(TEXT_16);
+				if (hasKey) {
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genPackage.getNSURI());
+				stringBuffer.append(TEXT_8);
+				if (genModel.hasLocalGenModel()) {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+					stringBuffer.append(TEXT_21);
+					stringBuffer.append(genModel.getRelativeGenModelLocation());
+					stringBuffer.append(TEXT_22);
+				} else {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+					stringBuffer.append(TEXT_22);
+				}
+				stringBuffer.append(TEXT_23);
+				if (genPackage.isContentType()) {
+					stringBuffer.append(TEXT_24);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genPackage.getContentTypeIdentifier());
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genPackage.getQualifiedEffectiveResourceFactoryClassName());
+					stringBuffer.append(TEXT_27);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(
+							genPackage.isXMIResource() ? "org.eclipse.emf.ecore.xmi" : "org.eclipse.core.runtime.xml");
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genPackage.getFileExtensions());
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genPackage.getContentTypeIdentifier());
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genPackage.getPrefix());
+					stringBuffer.append(TEXT_32);
+					if (genPackage.hasTargetNamespace()) {
+						stringBuffer.append(TEXT_33);
+						stringBuffer.append(genPackage.getNSURI());
+						stringBuffer.append(TEXT_22);
+					}
+					if (genPackage.isXMIResource()) {
+						stringBuffer.append(TEXT_34);
+					}
+					stringBuffer.append(TEXT_35);
+				} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {
+					stringBuffer.append(TEXT_36);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					for (String fileExtension : genPackage.getFileExtensionList()) {
+						stringBuffer.append(TEXT_37);
+						stringBuffer.append(fileExtension);
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
+						stringBuffer.append(TEXT_22);
+					}
+					stringBuffer.append(TEXT_23);
+				}
+			}
+		}
+		if (genModel.sameEditEditorProject()) {
+			for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+				if (!genPackage.getGenClasses().isEmpty()) {
+					stringBuffer.append(TEXT_38);
+					if (hasKey) {
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(key);
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genPackage.getNSURI());
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+					stringBuffer.append(TEXT_40);
+					for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext();) {
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(j.hasPrevious() ? " " : "\"");
+						stringBuffer.append(j.next());
+						if (!j.hasNext()) {
+							stringBuffer.append(TEXT_22);
+						}
+					}
+					stringBuffer.append(TEXT_23);
+					if (genPackage.isChildCreationExtenders()) {
+						Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> extendedChildCreationData = genPackage
+								.getExtendedChildCreationData();
+						if (!extendedChildCreationData.isEmpty()) {
+							stringBuffer.append(TEXT_42);
+							for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> entry : extendedChildCreationData
+									.entrySet()) {
+								if (hasKey) {
+									stringBuffer.append(TEXT_17);
+									stringBuffer.append(key);
+									stringBuffer.append(TEXT_18);
+								}
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(entry.getKey().getNSURI());
+								stringBuffer.append(TEXT_26);
+								stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+								stringBuffer.append(TEXT_44);
+								stringBuffer.append(genPackage.getChildCreationExtenderName(entry.getKey()));
+								stringBuffer.append(TEXT_22);
+							}
+							stringBuffer.append(TEXT_23);
+						}
+					}
+				}
+			}
+		}
+		if (genModel.isRichClientPlatform()) {
+			stringBuffer.append(TEXT_45);
+			stringBuffer.append(genModel.getEditorAdvisorClassName());
+			stringBuffer.append(TEXT_46);
+			if (hasKey) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(key);
+				stringBuffer.append(TEXT_18);
+			}
+			stringBuffer.append(TEXT_47);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_48);
+			if (hasKey) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(key);
+				stringBuffer.append(TEXT_18);
+			}
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_50);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_51);
+			if (hasKey) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(key);
+				stringBuffer.append(TEXT_18);
+			}
+			stringBuffer.append(TEXT_52);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_53);
+			if (!genModel.isRichAjaxPlatform()) {
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+				stringBuffer.append(TEXT_55);
+			}
+			stringBuffer.append(TEXT_56);
+			if (!genModel.isRichAjaxPlatform()) {
+				stringBuffer.append(TEXT_57);
+				if (hasKey) {
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_58);
+				stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+				stringBuffer.append(TEXT_59);
+				stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+				stringBuffer.append(TEXT_60);
+			}
+			stringBuffer.append(TEXT_61);
+			if (hasKey) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(key);
+				stringBuffer.append(TEXT_18);
+			}
+			stringBuffer.append(TEXT_62);
+			stringBuffer.append(genModel.getEditorAdvisorClassName());
+			stringBuffer.append(TEXT_63);
+			stringBuffer.append(genModel.getEditorAdvisorClassName());
+			stringBuffer.append(TEXT_64);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_66);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_67);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_68);
+			stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+			stringBuffer.append(TEXT_69);
+			if (!genModel.isRichAjaxPlatform()) {
+				stringBuffer.append(TEXT_70);
+				stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+				stringBuffer.append(TEXT_71);
+				stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+				stringBuffer.append(TEXT_72);
+				stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+				stringBuffer.append(TEXT_73);
+			}
+			stringBuffer.append(TEXT_74);
+		}
+		for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+			if (genPackage.hasConcreteClasses()) {
+				if (genPackage.isGenerateModelWizard()) {
+					if (genModel.isRichClientPlatform()) {
+						stringBuffer.append(TEXT_61);
+						if (hasKey) {
+							stringBuffer.append(TEXT_17);
+							stringBuffer.append(key);
+							stringBuffer.append(TEXT_18);
+						}
+						stringBuffer.append(TEXT_62);
+						stringBuffer.append(genPackage.getModelWizardClassName());
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
+						stringBuffer.append(TEXT_75);
+						stringBuffer.append(genPackage.getModelWizardClassName());
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
+						stringBuffer.append(TEXT_78);
+					} else {
+						stringBuffer.append(TEXT_79);
+						if (hasKey) {
+							stringBuffer.append(TEXT_17);
+							stringBuffer.append(key);
+							stringBuffer.append(TEXT_18);
+						}
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genPackage.getQualifiedModelWizardClassName());
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genPackage.getModelWizardClassName());
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genPackage.getQualifiedModelWizardClassName());
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genPackage.getPrefix());
+						stringBuffer.append(TEXT_84);
+						stringBuffer.append(genPackage.getModelWizardClassName());
+						stringBuffer.append(TEXT_85);
+					}
+				}
+				stringBuffer.append(TEXT_86);
+				if (hasKey) {
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_87);
+				stringBuffer.append(genPackage.getQualifiedEditorClassName());
+				stringBuffer.append(TEXT_81);
+				stringBuffer.append(genPackage.getEditorClassName());
+				stringBuffer.append(TEXT_88);
+				stringBuffer.append(genPackage.getPrefix());
+				stringBuffer.append(TEXT_89);
+				if (!genPackage.isContentType()) {
+					stringBuffer.append(TEXT_90);
+					stringBuffer.append(genPackage.getFileExtensions());
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genPackage.getQualifiedEditorClassName());
+				stringBuffer.append(TEXT_91);
+				stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
+				stringBuffer.append(TEXT_92);
+				if (genPackage.isContentType()) {
+					stringBuffer.append(TEXT_93);
+					stringBuffer.append(genPackage.getQualifiedContentTypeIdentifier());
+					stringBuffer.append(TEXT_22);
+				}
+				stringBuffer.append(TEXT_94);
+			}
+		}
+		stringBuffer.append(TEXT_95);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/WebXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/WebXML.java
new file mode 100644
index 0000000..979366c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/WebXML.java
@@ -0,0 +1,194 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class WebXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized WebXML create(String lineSeparator) {
+		nl = lineSeparator;
+		WebXML result = new WebXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL
+			+ "<!DOCTYPE web-app PUBLIC \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\" \"http://java.sun.com/dtd/web-app_2_3.dtd\">";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "<web-app>" + NL + "  <servlet>" + NL
+			+ "    <servlet-name>uriServlet</servlet-name>" + NL
+			+ "    <servlet-class>org.eclipse.emf.server.ecore.resource.URIServiceImpl</servlet-class>" + NL
+			+ "  </servlet>" + NL + "  " + NL + "  <servlet-mapping>" + NL
+			+ "    <servlet-name>uriServlet</servlet-name>" + NL + "    <url-pattern>/";
+	protected final String TEXT_4 = "/uriService</url-pattern>" + NL + "  </servlet-mapping>" + NL + "" + NL
+			+ "  <welcome-file-list>" + NL + "    <welcome-file>";
+	protected final String TEXT_5 = ".html</welcome-file>" + NL + "  </welcome-file-list>" + NL + "</web-app>" + NL;
+	protected final String TEXT_6 = NL;
+
+	public WebXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(TEXT_6);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getEditorProjectDirectory() + "/war/WEB-INF/web.xml";
+		overwrite = false;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
+				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getQualifiedEditorModuleName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getEditorHomePageName());
+		stringBuffer.append(TEXT_5);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/call/Editor/EditoraddItemProviderFactoriesinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/call/Editor/EditoraddItemProviderFactoriesinsert.java
new file mode 100644
index 0000000..f387c8f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/call/Editor/EditoraddItemProviderFactoriesinsert.java
@@ -0,0 +1,477 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor.call.Editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class EditoraddItemProviderFactoriesinsert {
+	protected static String nl;
+
+	public static synchronized EditoraddItemProviderFactoriesinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		EditoraddItemProviderFactoriesinsert result = new EditoraddItemProviderFactoriesinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public EditoraddItemProviderFactoriesinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> importedOperationClassNameList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> operationMethodNameList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfObjectList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfSelectionChangedListenerList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _CollectionOfSelectionChangedListenerList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfResourceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfResourceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _CollectionOfResourceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _MapOfResourceToDiagnosticList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _HashMapOfResourceToBooleanList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _MapOfObjectToObjectList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _HashMapOfObjectToObjectList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _LinkedHashMapOfResourceToDiagnosticList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _CollectionOfAnythingList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfAnythingList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useExtendedLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useStyledLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _AdapterFactoryLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _DelegatingAdapterFactoryLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _DecoratingColumLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _DiagnosticDecoratorList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfStringList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfStringList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfPropertySheetPageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfPropertySheetPageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genPackageParameter : genPackageList) {
+			for (Object genModelParameter : genModelList) {
+				for (Object isJDK50Parameter : isJDK50List) {
+					for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+						for (Object importedOperationClassNameParameter : importedOperationClassNameList) {
+							for (Object operationMethodNameParameter : operationMethodNameList) {
+								for (Object _ArrayListOfObjectParameter : _ArrayListOfObjectList) {
+									for (Object _ArrayListOfSelectionChangedListenerParameter : _ArrayListOfSelectionChangedListenerList) {
+										for (Object _CollectionOfSelectionChangedListenerParameter : _CollectionOfSelectionChangedListenerList) {
+											for (Object _ListOfResourceParameter : _ListOfResourceList) {
+												for (Object _ArrayListOfResourceParameter : _ArrayListOfResourceList) {
+													for (Object _CollectionOfResourceParameter : _CollectionOfResourceList) {
+														for (Object _MapOfResourceToDiagnosticParameter : _MapOfResourceToDiagnosticList) {
+															for (Object _HashMapOfResourceToBooleanParameter : _HashMapOfResourceToBooleanList) {
+																for (Object _MapOfObjectToObjectParameter : _MapOfObjectToObjectList) {
+																	for (Object _HashMapOfObjectToObjectParameter : _HashMapOfObjectToObjectList) {
+																		for (Object _LinkedHashMapOfResourceToDiagnosticParameter : _LinkedHashMapOfResourceToDiagnosticList) {
+																			for (Object _CollectionOfAnythingParameter : _CollectionOfAnythingList) {
+																				for (Object _ListOfAnythingParameter : _ListOfAnythingList) {
+																					for (Object useExtendedLabelProviderParameter : useExtendedLabelProviderList) {
+																						for (Object useStyledLabelProviderParameter : useStyledLabelProviderList) {
+																							for (Object _AdapterFactoryLabelProviderParameter : _AdapterFactoryLabelProviderList) {
+																								for (Object _DelegatingAdapterFactoryLabelProviderParameter : _DelegatingAdapterFactoryLabelProviderList) {
+																									for (Object _DecoratingColumLabelProviderParameter : _DecoratingColumLabelProviderList) {
+																										for (Object _DiagnosticDecoratorParameter : _DiagnosticDecoratorList) {
+																											for (Object _ArrayListOfStringParameter : _ArrayListOfStringList) {
+																												for (Object _ListOfStringParameter : _ListOfStringList) {
+																													for (Object _ListOfPropertySheetPageParameter : _ListOfPropertySheetPageList) {
+																														for (Object _ArrayListOfPropertySheetPageParameter : _ArrayListOfPropertySheetPageList) {
+
+																															this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																															this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																															this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																															this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																															this.importedOperationClassName = (java.lang.String) importedOperationClassNameParameter;
+																															this.operationMethodName = (java.lang.String) operationMethodNameParameter;
+																															this._ArrayListOfObject = (java.lang.String) _ArrayListOfObjectParameter;
+																															this._ArrayListOfSelectionChangedListener = (java.lang.String) _ArrayListOfSelectionChangedListenerParameter;
+																															this._CollectionOfSelectionChangedListener = (java.lang.String) _CollectionOfSelectionChangedListenerParameter;
+																															this._ListOfResource = (java.lang.String) _ListOfResourceParameter;
+																															this._ArrayListOfResource = (java.lang.String) _ArrayListOfResourceParameter;
+																															this._CollectionOfResource = (java.lang.String) _CollectionOfResourceParameter;
+																															this._MapOfResourceToDiagnostic = (java.lang.String) _MapOfResourceToDiagnosticParameter;
+																															this._HashMapOfResourceToBoolean = (java.lang.String) _HashMapOfResourceToBooleanParameter;
+																															this._MapOfObjectToObject = (java.lang.String) _MapOfObjectToObjectParameter;
+																															this._HashMapOfObjectToObject = (java.lang.String) _HashMapOfObjectToObjectParameter;
+																															this._LinkedHashMapOfResourceToDiagnostic = (java.lang.String) _LinkedHashMapOfResourceToDiagnosticParameter;
+																															this._CollectionOfAnything = (java.lang.String) _CollectionOfAnythingParameter;
+																															this._ListOfAnything = (java.lang.String) _ListOfAnythingParameter;
+																															this.useExtendedLabelProvider = (java.lang.Boolean) useExtendedLabelProviderParameter;
+																															this.useStyledLabelProvider = (java.lang.Boolean) useStyledLabelProviderParameter;
+																															this._AdapterFactoryLabelProvider = (java.lang.String) _AdapterFactoryLabelProviderParameter;
+																															this._DelegatingAdapterFactoryLabelProvider = (java.lang.String) _DelegatingAdapterFactoryLabelProviderParameter;
+																															this._DecoratingColumLabelProvider = (java.lang.String) _DecoratingColumLabelProviderParameter;
+																															this._DiagnosticDecorator = (java.lang.String) _DiagnosticDecoratorParameter;
+																															this._ArrayListOfString = (java.lang.String) _ArrayListOfStringParameter;
+																															this._ListOfString = (java.lang.String) _ListOfStringParameter;
+																															this._ListOfPropertySheetPage = (java.lang.String) _ListOfPropertySheetPageParameter;
+																															this._ArrayListOfPropertySheetPage = (java.lang.String) _ArrayListOfPropertySheetPageParameter;
+
+																															if (preCondition(
+																																	ctx)) {
+																																ctx.setNode(
+																																		new Node.Container(
+																																				currentNode,
+																																				getClass()));
+																																orchestration(
+																																		ctx);
+																															}
+
+																														}
+																													}
+																												}
+																											}
+																										}
+																									}
+																								}
+																							}
+																						}
+																					}
+																				}
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("importedOperationClassName", this.importedOperationClassName);
+			parameterValues.put("operationMethodName", this.operationMethodName);
+			parameterValues.put("_ArrayListOfObject", this._ArrayListOfObject);
+			parameterValues.put("_ArrayListOfSelectionChangedListener", this._ArrayListOfSelectionChangedListener);
+			parameterValues.put("_CollectionOfSelectionChangedListener", this._CollectionOfSelectionChangedListener);
+			parameterValues.put("_ListOfResource", this._ListOfResource);
+			parameterValues.put("_ArrayListOfResource", this._ArrayListOfResource);
+			parameterValues.put("_CollectionOfResource", this._CollectionOfResource);
+			parameterValues.put("_MapOfResourceToDiagnostic", this._MapOfResourceToDiagnostic);
+			parameterValues.put("_HashMapOfResourceToBoolean", this._HashMapOfResourceToBoolean);
+			parameterValues.put("_MapOfObjectToObject", this._MapOfObjectToObject);
+			parameterValues.put("_HashMapOfObjectToObject", this._HashMapOfObjectToObject);
+			parameterValues.put("_LinkedHashMapOfResourceToDiagnostic", this._LinkedHashMapOfResourceToDiagnostic);
+			parameterValues.put("_CollectionOfAnything", this._CollectionOfAnything);
+			parameterValues.put("_ListOfAnything", this._ListOfAnything);
+			parameterValues.put("useExtendedLabelProvider", this.useExtendedLabelProvider);
+			parameterValues.put("useStyledLabelProvider", this.useStyledLabelProvider);
+			parameterValues.put("_AdapterFactoryLabelProvider", this._AdapterFactoryLabelProvider);
+			parameterValues.put("_DelegatingAdapterFactoryLabelProvider", this._DelegatingAdapterFactoryLabelProvider);
+			parameterValues.put("_DecoratingColumLabelProvider", this._DecoratingColumLabelProvider);
+			parameterValues.put("_DiagnosticDecorator", this._DiagnosticDecorator);
+			parameterValues.put("_ArrayListOfString", this._ArrayListOfString);
+			parameterValues.put("_ListOfString", this._ListOfString);
+			parameterValues.put("_ListOfPropertySheetPage", this._ListOfPropertySheetPage);
+			parameterValues.put("_ArrayListOfPropertySheetPage", this._ArrayListOfPropertySheetPage);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String importedOperationClassName = null;
+
+	public void set_importedOperationClassName(java.lang.String object) {
+		this.importedOperationClassName = object;
+	}
+
+	protected java.lang.String operationMethodName = null;
+
+	public void set_operationMethodName(java.lang.String object) {
+		this.operationMethodName = object;
+	}
+
+	protected java.lang.String _ArrayListOfObject = null;
+
+	public void set__ArrayListOfObject(java.lang.String object) {
+		this._ArrayListOfObject = object;
+	}
+
+	protected java.lang.String _ArrayListOfSelectionChangedListener = null;
+
+	public void set__ArrayListOfSelectionChangedListener(java.lang.String object) {
+		this._ArrayListOfSelectionChangedListener = object;
+	}
+
+	protected java.lang.String _CollectionOfSelectionChangedListener = null;
+
+	public void set__CollectionOfSelectionChangedListener(java.lang.String object) {
+		this._CollectionOfSelectionChangedListener = object;
+	}
+
+	protected java.lang.String _ListOfResource = null;
+
+	public void set__ListOfResource(java.lang.String object) {
+		this._ListOfResource = object;
+	}
+
+	protected java.lang.String _ArrayListOfResource = null;
+
+	public void set__ArrayListOfResource(java.lang.String object) {
+		this._ArrayListOfResource = object;
+	}
+
+	protected java.lang.String _CollectionOfResource = null;
+
+	public void set__CollectionOfResource(java.lang.String object) {
+		this._CollectionOfResource = object;
+	}
+
+	protected java.lang.String _MapOfResourceToDiagnostic = null;
+
+	public void set__MapOfResourceToDiagnostic(java.lang.String object) {
+		this._MapOfResourceToDiagnostic = object;
+	}
+
+	protected java.lang.String _HashMapOfResourceToBoolean = null;
+
+	public void set__HashMapOfResourceToBoolean(java.lang.String object) {
+		this._HashMapOfResourceToBoolean = object;
+	}
+
+	protected java.lang.String _MapOfObjectToObject = null;
+
+	public void set__MapOfObjectToObject(java.lang.String object) {
+		this._MapOfObjectToObject = object;
+	}
+
+	protected java.lang.String _HashMapOfObjectToObject = null;
+
+	public void set__HashMapOfObjectToObject(java.lang.String object) {
+		this._HashMapOfObjectToObject = object;
+	}
+
+	protected java.lang.String _LinkedHashMapOfResourceToDiagnostic = null;
+
+	public void set__LinkedHashMapOfResourceToDiagnostic(java.lang.String object) {
+		this._LinkedHashMapOfResourceToDiagnostic = object;
+	}
+
+	protected java.lang.String _CollectionOfAnything = null;
+
+	public void set__CollectionOfAnything(java.lang.String object) {
+		this._CollectionOfAnything = object;
+	}
+
+	protected java.lang.String _ListOfAnything = null;
+
+	public void set__ListOfAnything(java.lang.String object) {
+		this._ListOfAnything = object;
+	}
+
+	protected java.lang.Boolean useExtendedLabelProvider = null;
+
+	public void set_useExtendedLabelProvider(java.lang.Boolean object) {
+		this.useExtendedLabelProvider = object;
+	}
+
+	protected java.lang.Boolean useStyledLabelProvider = null;
+
+	public void set_useStyledLabelProvider(java.lang.Boolean object) {
+		this.useStyledLabelProvider = object;
+	}
+
+	protected java.lang.String _AdapterFactoryLabelProvider = null;
+
+	public void set__AdapterFactoryLabelProvider(java.lang.String object) {
+		this._AdapterFactoryLabelProvider = object;
+	}
+
+	protected java.lang.String _DelegatingAdapterFactoryLabelProvider = null;
+
+	public void set__DelegatingAdapterFactoryLabelProvider(java.lang.String object) {
+		this._DelegatingAdapterFactoryLabelProvider = object;
+	}
+
+	protected java.lang.String _DecoratingColumLabelProvider = null;
+
+	public void set__DecoratingColumLabelProvider(java.lang.String object) {
+		this._DecoratingColumLabelProvider = object;
+	}
+
+	protected java.lang.String _DiagnosticDecorator = null;
+
+	public void set__DiagnosticDecorator(java.lang.String object) {
+		this._DiagnosticDecorator = object;
+	}
+
+	protected java.lang.String _ArrayListOfString = null;
+
+	public void set__ArrayListOfString(java.lang.String object) {
+		this._ArrayListOfString = object;
+	}
+
+	protected java.lang.String _ListOfString = null;
+
+	public void set__ListOfString(java.lang.String object) {
+		this._ListOfString = object;
+	}
+
+	protected java.lang.String _ListOfPropertySheetPage = null;
+
+	public void set__ListOfPropertySheetPage(java.lang.String object) {
+		this._ListOfPropertySheetPage = object;
+	}
+
+	protected java.lang.String _ArrayListOfPropertySheetPage = null;
+
+	public void set__ArrayListOfPropertySheetPage(java.lang.String object) {
+		this._ArrayListOfPropertySheetPage = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("importedOperationClassName", this.importedOperationClassName);
+		parameters.put("operationMethodName", this.operationMethodName);
+		parameters.put("_ArrayListOfObject", this._ArrayListOfObject);
+		parameters.put("_ArrayListOfSelectionChangedListener", this._ArrayListOfSelectionChangedListener);
+		parameters.put("_CollectionOfSelectionChangedListener", this._CollectionOfSelectionChangedListener);
+		parameters.put("_ListOfResource", this._ListOfResource);
+		parameters.put("_ArrayListOfResource", this._ArrayListOfResource);
+		parameters.put("_CollectionOfResource", this._CollectionOfResource);
+		parameters.put("_MapOfResourceToDiagnostic", this._MapOfResourceToDiagnostic);
+		parameters.put("_HashMapOfResourceToBoolean", this._HashMapOfResourceToBoolean);
+		parameters.put("_MapOfObjectToObject", this._MapOfObjectToObject);
+		parameters.put("_HashMapOfObjectToObject", this._HashMapOfObjectToObject);
+		parameters.put("_LinkedHashMapOfResourceToDiagnostic", this._LinkedHashMapOfResourceToDiagnostic);
+		parameters.put("_CollectionOfAnything", this._CollectionOfAnything);
+		parameters.put("_ListOfAnything", this._ListOfAnything);
+		parameters.put("useExtendedLabelProvider", this.useExtendedLabelProvider);
+		parameters.put("useStyledLabelProvider", this.useStyledLabelProvider);
+		parameters.put("_AdapterFactoryLabelProvider", this._AdapterFactoryLabelProvider);
+		parameters.put("_DelegatingAdapterFactoryLabelProvider", this._DelegatingAdapterFactoryLabelProvider);
+		parameters.put("_DecoratingColumLabelProvider", this._DecoratingColumLabelProvider);
+		parameters.put("_DiagnosticDecorator", this._DiagnosticDecorator);
+		parameters.put("_ArrayListOfString", this._ArrayListOfString);
+		parameters.put("_ListOfString", this._ListOfString);
+		parameters.put("_ListOfPropertySheetPage", this._ListOfPropertySheetPage);
+		parameters.put("_ArrayListOfPropertySheetPage", this._ArrayListOfPropertySheetPage);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/call/Editor/EditoraddItemProviderFactoriesoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/call/Editor/EditoraddItemProviderFactoriesoverride.java
new file mode 100644
index 0000000..83b662c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/editor/call/Editor/EditoraddItemProviderFactoriesoverride.java
@@ -0,0 +1,540 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.editor.call.Editor;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class EditoraddItemProviderFactoriesoverride {
+	protected static String nl;
+
+	public static synchronized EditoraddItemProviderFactoriesoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		EditoraddItemProviderFactoriesoverride result = new EditoraddItemProviderFactoriesoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t\tadapterFactory.addAdapterFactory(new ";
+	protected final String TEXT_3 = "());";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL;
+
+	public EditoraddItemProviderFactoriesoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> importedOperationClassNameList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> operationMethodNameList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfObjectList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfSelectionChangedListenerList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _CollectionOfSelectionChangedListenerList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfResourceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfResourceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _CollectionOfResourceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _MapOfResourceToDiagnosticList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _HashMapOfResourceToBooleanList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _MapOfObjectToObjectList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _HashMapOfObjectToObjectList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _LinkedHashMapOfResourceToDiagnosticList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _CollectionOfAnythingList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfAnythingList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useExtendedLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useStyledLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _AdapterFactoryLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _DelegatingAdapterFactoryLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _DecoratingColumLabelProviderList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _DiagnosticDecoratorList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfStringList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfStringList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ListOfPropertySheetPageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _ArrayListOfPropertySheetPageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genPackageParameter : genPackageList) {
+			for (Object genModelParameter : genModelList) {
+				for (Object isJDK50Parameter : isJDK50List) {
+					for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+						for (Object importedOperationClassNameParameter : importedOperationClassNameList) {
+							for (Object operationMethodNameParameter : operationMethodNameList) {
+								for (Object _ArrayListOfObjectParameter : _ArrayListOfObjectList) {
+									for (Object _ArrayListOfSelectionChangedListenerParameter : _ArrayListOfSelectionChangedListenerList) {
+										for (Object _CollectionOfSelectionChangedListenerParameter : _CollectionOfSelectionChangedListenerList) {
+											for (Object _ListOfResourceParameter : _ListOfResourceList) {
+												for (Object _ArrayListOfResourceParameter : _ArrayListOfResourceList) {
+													for (Object _CollectionOfResourceParameter : _CollectionOfResourceList) {
+														for (Object _MapOfResourceToDiagnosticParameter : _MapOfResourceToDiagnosticList) {
+															for (Object _HashMapOfResourceToBooleanParameter : _HashMapOfResourceToBooleanList) {
+																for (Object _MapOfObjectToObjectParameter : _MapOfObjectToObjectList) {
+																	for (Object _HashMapOfObjectToObjectParameter : _HashMapOfObjectToObjectList) {
+																		for (Object _LinkedHashMapOfResourceToDiagnosticParameter : _LinkedHashMapOfResourceToDiagnosticList) {
+																			for (Object _CollectionOfAnythingParameter : _CollectionOfAnythingList) {
+																				for (Object _ListOfAnythingParameter : _ListOfAnythingList) {
+																					for (Object useExtendedLabelProviderParameter : useExtendedLabelProviderList) {
+																						for (Object useStyledLabelProviderParameter : useStyledLabelProviderList) {
+																							for (Object _AdapterFactoryLabelProviderParameter : _AdapterFactoryLabelProviderList) {
+																								for (Object _DelegatingAdapterFactoryLabelProviderParameter : _DelegatingAdapterFactoryLabelProviderList) {
+																									for (Object _DecoratingColumLabelProviderParameter : _DecoratingColumLabelProviderList) {
+																										for (Object _DiagnosticDecoratorParameter : _DiagnosticDecoratorList) {
+																											for (Object _ArrayListOfStringParameter : _ArrayListOfStringList) {
+																												for (Object _ListOfStringParameter : _ListOfStringList) {
+																													for (Object _ListOfPropertySheetPageParameter : _ListOfPropertySheetPageList) {
+																														for (Object _ArrayListOfPropertySheetPageParameter : _ArrayListOfPropertySheetPageList) {
+
+																															this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																															this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																															this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																															this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																															this.importedOperationClassName = (java.lang.String) importedOperationClassNameParameter;
+																															this.operationMethodName = (java.lang.String) operationMethodNameParameter;
+																															this._ArrayListOfObject = (java.lang.String) _ArrayListOfObjectParameter;
+																															this._ArrayListOfSelectionChangedListener = (java.lang.String) _ArrayListOfSelectionChangedListenerParameter;
+																															this._CollectionOfSelectionChangedListener = (java.lang.String) _CollectionOfSelectionChangedListenerParameter;
+																															this._ListOfResource = (java.lang.String) _ListOfResourceParameter;
+																															this._ArrayListOfResource = (java.lang.String) _ArrayListOfResourceParameter;
+																															this._CollectionOfResource = (java.lang.String) _CollectionOfResourceParameter;
+																															this._MapOfResourceToDiagnostic = (java.lang.String) _MapOfResourceToDiagnosticParameter;
+																															this._HashMapOfResourceToBoolean = (java.lang.String) _HashMapOfResourceToBooleanParameter;
+																															this._MapOfObjectToObject = (java.lang.String) _MapOfObjectToObjectParameter;
+																															this._HashMapOfObjectToObject = (java.lang.String) _HashMapOfObjectToObjectParameter;
+																															this._LinkedHashMapOfResourceToDiagnostic = (java.lang.String) _LinkedHashMapOfResourceToDiagnosticParameter;
+																															this._CollectionOfAnything = (java.lang.String) _CollectionOfAnythingParameter;
+																															this._ListOfAnything = (java.lang.String) _ListOfAnythingParameter;
+																															this.useExtendedLabelProvider = (java.lang.Boolean) useExtendedLabelProviderParameter;
+																															this.useStyledLabelProvider = (java.lang.Boolean) useStyledLabelProviderParameter;
+																															this._AdapterFactoryLabelProvider = (java.lang.String) _AdapterFactoryLabelProviderParameter;
+																															this._DelegatingAdapterFactoryLabelProvider = (java.lang.String) _DelegatingAdapterFactoryLabelProviderParameter;
+																															this._DecoratingColumLabelProvider = (java.lang.String) _DecoratingColumLabelProviderParameter;
+																															this._DiagnosticDecorator = (java.lang.String) _DiagnosticDecoratorParameter;
+																															this._ArrayListOfString = (java.lang.String) _ArrayListOfStringParameter;
+																															this._ListOfString = (java.lang.String) _ListOfStringParameter;
+																															this._ListOfPropertySheetPage = (java.lang.String) _ListOfPropertySheetPageParameter;
+																															this._ArrayListOfPropertySheetPage = (java.lang.String) _ArrayListOfPropertySheetPageParameter;
+
+																															if (preCondition(
+																																	ctx)) {
+																																ctx.setNode(
+																																		new Node.Container(
+																																				currentNode,
+																																				getClass()));
+																																orchestration(
+																																		ctx);
+																															}
+
+																														}
+																													}
+																												}
+																											}
+																										}
+																									}
+																								}
+																							}
+																						}
+																					}
+																				}
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_5);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("importedOperationClassName", this.importedOperationClassName);
+			parameterValues.put("operationMethodName", this.operationMethodName);
+			parameterValues.put("_ArrayListOfObject", this._ArrayListOfObject);
+			parameterValues.put("_ArrayListOfSelectionChangedListener", this._ArrayListOfSelectionChangedListener);
+			parameterValues.put("_CollectionOfSelectionChangedListener", this._CollectionOfSelectionChangedListener);
+			parameterValues.put("_ListOfResource", this._ListOfResource);
+			parameterValues.put("_ArrayListOfResource", this._ArrayListOfResource);
+			parameterValues.put("_CollectionOfResource", this._CollectionOfResource);
+			parameterValues.put("_MapOfResourceToDiagnostic", this._MapOfResourceToDiagnostic);
+			parameterValues.put("_HashMapOfResourceToBoolean", this._HashMapOfResourceToBoolean);
+			parameterValues.put("_MapOfObjectToObject", this._MapOfObjectToObject);
+			parameterValues.put("_HashMapOfObjectToObject", this._HashMapOfObjectToObject);
+			parameterValues.put("_LinkedHashMapOfResourceToDiagnostic", this._LinkedHashMapOfResourceToDiagnostic);
+			parameterValues.put("_CollectionOfAnything", this._CollectionOfAnything);
+			parameterValues.put("_ListOfAnything", this._ListOfAnything);
+			parameterValues.put("useExtendedLabelProvider", this.useExtendedLabelProvider);
+			parameterValues.put("useStyledLabelProvider", this.useStyledLabelProvider);
+			parameterValues.put("_AdapterFactoryLabelProvider", this._AdapterFactoryLabelProvider);
+			parameterValues.put("_DelegatingAdapterFactoryLabelProvider", this._DelegatingAdapterFactoryLabelProvider);
+			parameterValues.put("_DecoratingColumLabelProvider", this._DecoratingColumLabelProvider);
+			parameterValues.put("_DiagnosticDecorator", this._DiagnosticDecorator);
+			parameterValues.put("_ArrayListOfString", this._ArrayListOfString);
+			parameterValues.put("_ListOfString", this._ListOfString);
+			parameterValues.put("_ListOfPropertySheetPage", this._ListOfPropertySheetPage);
+			parameterValues.put("_ArrayListOfPropertySheetPage", this._ArrayListOfPropertySheetPage);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String importedOperationClassName = null;
+
+	public void set_importedOperationClassName(java.lang.String object) {
+		this.importedOperationClassName = object;
+	}
+
+	protected java.lang.String operationMethodName = null;
+
+	public void set_operationMethodName(java.lang.String object) {
+		this.operationMethodName = object;
+	}
+
+	protected java.lang.String _ArrayListOfObject = null;
+
+	public void set__ArrayListOfObject(java.lang.String object) {
+		this._ArrayListOfObject = object;
+	}
+
+	protected java.lang.String _ArrayListOfSelectionChangedListener = null;
+
+	public void set__ArrayListOfSelectionChangedListener(java.lang.String object) {
+		this._ArrayListOfSelectionChangedListener = object;
+	}
+
+	protected java.lang.String _CollectionOfSelectionChangedListener = null;
+
+	public void set__CollectionOfSelectionChangedListener(java.lang.String object) {
+		this._CollectionOfSelectionChangedListener = object;
+	}
+
+	protected java.lang.String _ListOfResource = null;
+
+	public void set__ListOfResource(java.lang.String object) {
+		this._ListOfResource = object;
+	}
+
+	protected java.lang.String _ArrayListOfResource = null;
+
+	public void set__ArrayListOfResource(java.lang.String object) {
+		this._ArrayListOfResource = object;
+	}
+
+	protected java.lang.String _CollectionOfResource = null;
+
+	public void set__CollectionOfResource(java.lang.String object) {
+		this._CollectionOfResource = object;
+	}
+
+	protected java.lang.String _MapOfResourceToDiagnostic = null;
+
+	public void set__MapOfResourceToDiagnostic(java.lang.String object) {
+		this._MapOfResourceToDiagnostic = object;
+	}
+
+	protected java.lang.String _HashMapOfResourceToBoolean = null;
+
+	public void set__HashMapOfResourceToBoolean(java.lang.String object) {
+		this._HashMapOfResourceToBoolean = object;
+	}
+
+	protected java.lang.String _MapOfObjectToObject = null;
+
+	public void set__MapOfObjectToObject(java.lang.String object) {
+		this._MapOfObjectToObject = object;
+	}
+
+	protected java.lang.String _HashMapOfObjectToObject = null;
+
+	public void set__HashMapOfObjectToObject(java.lang.String object) {
+		this._HashMapOfObjectToObject = object;
+	}
+
+	protected java.lang.String _LinkedHashMapOfResourceToDiagnostic = null;
+
+	public void set__LinkedHashMapOfResourceToDiagnostic(java.lang.String object) {
+		this._LinkedHashMapOfResourceToDiagnostic = object;
+	}
+
+	protected java.lang.String _CollectionOfAnything = null;
+
+	public void set__CollectionOfAnything(java.lang.String object) {
+		this._CollectionOfAnything = object;
+	}
+
+	protected java.lang.String _ListOfAnything = null;
+
+	public void set__ListOfAnything(java.lang.String object) {
+		this._ListOfAnything = object;
+	}
+
+	protected java.lang.Boolean useExtendedLabelProvider = null;
+
+	public void set_useExtendedLabelProvider(java.lang.Boolean object) {
+		this.useExtendedLabelProvider = object;
+	}
+
+	protected java.lang.Boolean useStyledLabelProvider = null;
+
+	public void set_useStyledLabelProvider(java.lang.Boolean object) {
+		this.useStyledLabelProvider = object;
+	}
+
+	protected java.lang.String _AdapterFactoryLabelProvider = null;
+
+	public void set__AdapterFactoryLabelProvider(java.lang.String object) {
+		this._AdapterFactoryLabelProvider = object;
+	}
+
+	protected java.lang.String _DelegatingAdapterFactoryLabelProvider = null;
+
+	public void set__DelegatingAdapterFactoryLabelProvider(java.lang.String object) {
+		this._DelegatingAdapterFactoryLabelProvider = object;
+	}
+
+	protected java.lang.String _DecoratingColumLabelProvider = null;
+
+	public void set__DecoratingColumLabelProvider(java.lang.String object) {
+		this._DecoratingColumLabelProvider = object;
+	}
+
+	protected java.lang.String _DiagnosticDecorator = null;
+
+	public void set__DiagnosticDecorator(java.lang.String object) {
+		this._DiagnosticDecorator = object;
+	}
+
+	protected java.lang.String _ArrayListOfString = null;
+
+	public void set__ArrayListOfString(java.lang.String object) {
+		this._ArrayListOfString = object;
+	}
+
+	protected java.lang.String _ListOfString = null;
+
+	public void set__ListOfString(java.lang.String object) {
+		this._ListOfString = object;
+	}
+
+	protected java.lang.String _ListOfPropertySheetPage = null;
+
+	public void set__ListOfPropertySheetPage(java.lang.String object) {
+		this._ListOfPropertySheetPage = object;
+	}
+
+	protected java.lang.String _ArrayListOfPropertySheetPage = null;
+
+	public void set__ArrayListOfPropertySheetPage(java.lang.String object) {
+		this._ArrayListOfPropertySheetPage = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("importedOperationClassName", this.importedOperationClassName);
+		parameters.put("operationMethodName", this.operationMethodName);
+		parameters.put("_ArrayListOfObject", this._ArrayListOfObject);
+		parameters.put("_ArrayListOfSelectionChangedListener", this._ArrayListOfSelectionChangedListener);
+		parameters.put("_CollectionOfSelectionChangedListener", this._CollectionOfSelectionChangedListener);
+		parameters.put("_ListOfResource", this._ListOfResource);
+		parameters.put("_ArrayListOfResource", this._ArrayListOfResource);
+		parameters.put("_CollectionOfResource", this._CollectionOfResource);
+		parameters.put("_MapOfResourceToDiagnostic", this._MapOfResourceToDiagnostic);
+		parameters.put("_HashMapOfResourceToBoolean", this._HashMapOfResourceToBoolean);
+		parameters.put("_MapOfObjectToObject", this._MapOfObjectToObject);
+		parameters.put("_HashMapOfObjectToObject", this._HashMapOfObjectToObject);
+		parameters.put("_LinkedHashMapOfResourceToDiagnostic", this._LinkedHashMapOfResourceToDiagnostic);
+		parameters.put("_CollectionOfAnything", this._CollectionOfAnything);
+		parameters.put("_ListOfAnything", this._ListOfAnything);
+		parameters.put("useExtendedLabelProvider", this.useExtendedLabelProvider);
+		parameters.put("useStyledLabelProvider", this.useStyledLabelProvider);
+		parameters.put("_AdapterFactoryLabelProvider", this._AdapterFactoryLabelProvider);
+		parameters.put("_DelegatingAdapterFactoryLabelProvider", this._DelegatingAdapterFactoryLabelProvider);
+		parameters.put("_DecoratingColumLabelProvider", this._DecoratingColumLabelProvider);
+		parameters.put("_DiagnosticDecorator", this._DiagnosticDecorator);
+		parameters.put("_ArrayListOfString", this._ArrayListOfString);
+		parameters.put("_ListOfString", this._ListOfString);
+		parameters.put("_ListOfPropertySheetPage", this._ListOfPropertySheetPage);
+		parameters.put("_ArrayListOfPropertySheetPage", this._ArrayListOfPropertySheetPage);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		for (GenPackage aGenPackage : genModel.getAllGenPackagesWithClassifiers()) {
+			if (!aGenPackage.getGenClasses().isEmpty() && aGenPackage.getGenModel().hasEditSupport()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(aGenPackage.getImportedItemProviderAdapterFactoryClassName());
+				stringBuffer.append(TEXT_3);
+			}
+		}
+		for (GenPackage aGenPackage : genModel.getAllUsedGenPackagesWithClassifiers()) {
+			if (!aGenPackage.getGenClasses().isEmpty() && aGenPackage.getGenModel().hasEditSupport()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(aGenPackage.getImportedItemProviderAdapterFactoryClassName());
+				stringBuffer.append(TEXT_3);
+			}
+		}
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.editor.call.Editor.Editor.addItemProviderFactories.insert" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,importedOperationClassName:importedOperationClassName,operationMethodName:operationMethodName,_ArrayListOfObject:_ArrayListOfObject,_ArrayListOfSelectionChangedListener:_ArrayListOfSelectionChangedListener,_CollectionOfSelectionChangedListener:_CollectionOfSelectionChangedListener,_ListOfResource:_ListOfResource,_ArrayListOfResource:_ArrayListOfResource,_CollectionOfResource:_CollectionOfResource,_MapOfResourceToDiagnostic:_MapOfResourceToDiagnostic,_HashMapOfResourceToBoolean:_HashMapOfResourceToBoolean,_MapOfObjectToObject:_MapOfObjectToObject,_HashMapOfObjectToObject:_HashMapOfObjectToObject,_LinkedHashMapOfResourceToDiagnostic:_LinkedHashMapOfResourceToDiagnostic,_CollectionOfAnything:_CollectionOfAnything,_ListOfAnything:_ListOfAnything,useExtendedLabelProvider:useExtendedLabelProvider,useStyledLabelProvider:useStyledLabelProvider,_AdapterFactoryLabelProvider:_AdapterFactoryLabelProvider,_DelegatingAdapterFactoryLabelProvider:_DelegatingAdapterFactoryLabelProvider,_DecoratingColumLabelProvider:_DecoratingColumLabelProvider,_DiagnosticDecorator:_DiagnosticDecorator,_ArrayListOfString:_ArrayListOfString,_ListOfString:_ListOfString,_ListOfPropertySheetPage:_ListOfPropertySheetPage,_ArrayListOfPropertySheetPage:_ArrayListOfPropertySheetPage"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("importedOperationClassName", importedOperationClassName);
+			callParameters.put("operationMethodName", operationMethodName);
+			callParameters.put("_ArrayListOfObject", _ArrayListOfObject);
+			callParameters.put("_ArrayListOfSelectionChangedListener", _ArrayListOfSelectionChangedListener);
+			callParameters.put("_CollectionOfSelectionChangedListener", _CollectionOfSelectionChangedListener);
+			callParameters.put("_ListOfResource", _ListOfResource);
+			callParameters.put("_ArrayListOfResource", _ArrayListOfResource);
+			callParameters.put("_CollectionOfResource", _CollectionOfResource);
+			callParameters.put("_MapOfResourceToDiagnostic", _MapOfResourceToDiagnostic);
+			callParameters.put("_HashMapOfResourceToBoolean", _HashMapOfResourceToBoolean);
+			callParameters.put("_MapOfObjectToObject", _MapOfObjectToObject);
+			callParameters.put("_HashMapOfObjectToObject", _HashMapOfObjectToObject);
+			callParameters.put("_LinkedHashMapOfResourceToDiagnostic", _LinkedHashMapOfResourceToDiagnostic);
+			callParameters.put("_CollectionOfAnything", _CollectionOfAnything);
+			callParameters.put("_ListOfAnything", _ListOfAnything);
+			callParameters.put("useExtendedLabelProvider", useExtendedLabelProvider);
+			callParameters.put("useStyledLabelProvider", useStyledLabelProvider);
+			callParameters.put("_AdapterFactoryLabelProvider", _AdapterFactoryLabelProvider);
+			callParameters.put("_DelegatingAdapterFactoryLabelProvider", _DelegatingAdapterFactoryLabelProvider);
+			callParameters.put("_DecoratingColumLabelProvider", _DecoratingColumLabelProvider);
+			callParameters.put("_DiagnosticDecorator", _DiagnosticDecorator);
+			callParameters.put("_ArrayListOfString", _ArrayListOfString);
+			callParameters.put("_ListOfString", _ListOfString);
+			callParameters.put("_ListOfPropertySheetPage", _ListOfPropertySheetPage);
+			callParameters.put("_ArrayListOfPropertySheetPage", _ArrayListOfPropertySheetPage);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_09RHMGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/AdapterFactoryClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/AdapterFactoryClass.java
new file mode 100644
index 0000000..cbfdcfb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/AdapterFactoryClass.java
@@ -0,0 +1,366 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class AdapterFactoryClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized AdapterFactoryClass create(String lineSeparator) {
+		nl = lineSeparator;
+		AdapterFactoryClass result = new AdapterFactoryClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Adapter Factory</b> for the model." + NL
+			+ " * It provides an adapter <code>createXXX</code> method for each class of the model." + NL
+			+ " * <!-- end-user-doc -->" + NL + " * @see ";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = " extends AdapterFactoryImpl" + NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * The cached model package." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected static ";
+	protected final String TEXT_16 = " modelPackage;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates an instance of the adapter factory." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_17 = "()" + NL + "\t{" + NL + "\t\tif (modelPackage == null)" + NL + "\t\t{" + NL
+			+ "\t\t\tmodelPackage = ";
+	protected final String TEXT_18 = ".eINSTANCE;" + NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns whether this factory is applicable for the type of the object." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model."
+			+ NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return whether this factory is applicable for the type of the object." + NL + "\t * @generated"
+			+ NL + "\t */";
+	protected final String TEXT_19 = NL + "\t@Override";
+	protected final String TEXT_20 = NL + "\tpublic boolean isFactoryForType(Object object)" + NL + "\t{" + NL
+			+ "\t\tif (object == modelPackage)" + NL + "\t\t{" + NL + "\t\t\treturn true;" + NL + "\t\t}" + NL
+			+ "\t\tif (object instanceof EObject)" + NL + "\t\t{" + NL
+			+ "\t\t\treturn ((EObject)object).eClass().getEPackage() == modelPackage;" + NL + "\t\t}" + NL
+			+ "\t\treturn false;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * The switch that delegates to the <code>createXXX</code> methods." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_21 = " modelSwitch =" + NL + "\t\tnew ";
+	protected final String TEXT_22 = "()" + NL + "\t\t{";
+	protected final String TEXT_23 = NL + "\t\t\t@Override";
+	protected final String TEXT_24 = NL + "\t\t\tpublic ";
+	protected final String TEXT_25 = " case";
+	protected final String TEXT_26 = "(";
+	protected final String TEXT_27 = " object)" + NL + "\t\t\t{" + NL + "\t\t\t\treturn create";
+	protected final String TEXT_28 = "Adapter();" + NL + "\t\t\t}";
+	protected final String TEXT_29 = " defaultCase(EObject object)" + NL + "\t\t\t{" + NL + "\t\t\t\treturn create";
+	protected final String TEXT_30 = "Adapter();" + NL + "\t\t\t}" + NL + "\t\t};" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates an adapter for the <code>target</code>." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @param target the object to adapt." + NL
+			+ "\t * @return the adapter for the <code>target</code>." + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_31 = NL + "\tpublic Adapter createAdapter(Notifier target)" + NL + "\t{" + NL
+			+ "\t\treturn ";
+	protected final String TEXT_32 = "modelSwitch.doSwitch((EObject)target);" + NL + "\t}" + NL;
+	protected final String TEXT_33 = NL + NL + "\t/**" + NL
+			+ "\t * Creates a new adapter for an object of class '{@link ";
+	protected final String TEXT_34 = " <em>";
+	protected final String TEXT_35 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * This default implementation returns null so that we can easily ignore cases;" + NL
+			+ "\t * it's useful to ignore a case when inheritance will catch all the cases anyway." + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the new adapter." + NL + "\t * @see ";
+	protected final String TEXT_36 = NL + "\t * ";
+	protected final String TEXT_37 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_38 = NL + "\t\t@Deprecated";
+	protected final String TEXT_39 = NL + "\tpublic Adapter create";
+	protected final String TEXT_40 = "Adapter()" + NL + "\t{" + NL + "\t\treturn null;" + NL + "\t}";
+	protected final String TEXT_41 = NL + NL + "\t/**" + NL + "\t * Creates a new adapter for the default case." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * This default implementation returns null." + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the new adapter." + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tpublic Adapter create";
+	protected final String TEXT_42 = "Adapter()" + NL + "\t{" + NL + "\t\treturn null;" + NL + "\t}" + NL + "" + NL
+			+ "} //";
+	protected final String TEXT_43 = NL;
+
+	public AdapterFactoryClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_43);
+		stringBuffer.append(TEXT_43);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getUtilitiesPackageName();
+		className = genPackage.getAdapterFactoryClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2006 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getUtilitiesPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("org.eclipse.emf.common.notify.Adapter");
+		genModel.addImport("org.eclipse.emf.common.notify.Notifier");
+		genModel.addImport("org.eclipse.emf.common.notify.impl.AdapterFactoryImpl");
+		genModel.addImport("org.eclipse.emf.ecore.EObject");
+		if (!genPackage.hasJavaLangConflict()
+				&& !genPackage.getUtilitiesPackageName().equals(genPackage.getInterfacePackageName()))
+			genModel.addImport(genPackage.getInterfacePackageName() + ".*");
+		String typeArgument = genModel.useGenerics() ? "<Adapter>" : "";
+		String returnType = genModel.useGenerics() ? "Adapter" : genModel.getImportedName("java.lang.Object");
+		String adapterCast = genModel.useGenerics() ? "" : "(Adapter)";
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getAllSwitchGenClasses())) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getAdapterFactoryClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genPackage.getAdapterFactoryClassName());
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_18);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(genPackage.getSwitchClassName());
+		stringBuffer.append(typeArgument);
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(genPackage.getSwitchClassName());
+		stringBuffer.append(typeArgument);
+		stringBuffer.append(TEXT_22);
+		for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_23);
+			}
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genClass.getTypeParameters());
+			stringBuffer.append(returnType);
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genPackage.getClassUniqueName(genClass));
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			stringBuffer.append(genClass.getInterfaceTypeArguments());
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genPackage.getClassUniqueName(genClass));
+			stringBuffer.append(TEXT_28);
+		}
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(returnType);
+		stringBuffer.append(TEXT_29);
+		stringBuffer.append(genPackage.getClassUniqueName(null));
+		stringBuffer.append(TEXT_30);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(adapterCast);
+		stringBuffer.append(TEXT_32);
+		for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+			if (genClass.hasAPITags()) {
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_37);
+			if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_39);
+			stringBuffer.append(genPackage.getClassUniqueName(genClass));
+			stringBuffer.append(TEXT_40);
+		}
+		stringBuffer.append(TEXT_41);
+		stringBuffer.append(genPackage.getClassUniqueName(null));
+		stringBuffer.append(TEXT_42);
+		stringBuffer.append(genPackage.getAdapterFactoryClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.isAdapterFactory()
+				&& !genPackage.getGenClasses().isEmpty());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/BuildProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/BuildProperties.java
new file mode 100644
index 0000000..ce86b98
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/BuildProperties.java
@@ -0,0 +1,236 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class BuildProperties extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "bin.includes = ";
+	protected final String TEXT_3 = ",\\" + NL + "               model/,\\";
+	protected final String TEXT_4 = NL + "               icons/,\\";
+	protected final String TEXT_5 = NL + "               META-INF/,\\";
+	protected final String TEXT_6 = NL + "               plugin.xml,\\";
+	protected final String TEXT_7 = NL + "               ";
+	protected final String TEXT_8 = ".properties";
+	protected final String TEXT_9 = NL + "jars.compile.order = ";
+	protected final String TEXT_10 = NL + "source.";
+	protected final String TEXT_11 = " = ";
+	protected final String TEXT_12 = NL + "output.";
+	protected final String TEXT_13 = " = bin/" + NL;
+	protected final String TEXT_14 = NL;
+
+	public BuildProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_14);
+		stringBuffer.append(TEXT_14);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getModelProjectDirectory() + "/build.properties";
+		overwrite = genModel.isUpdateClasspath()
+				&& !new CodegenGeneratorAdapter(parameter).exists(new CodegenGeneratorAdapter(parameter)
+						.toURI(genModel.getModelProjectDirectory()).appendSegment("plugin.xml"));
+		encoding = "ISO-8859-1";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getModelPluginID() + ".jar" : ".";
+		List<String> sourceFolders = genModel.getModelSourceFolders();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_3);
+		if (genModel.sameModelEditProject() || genModel.sameModelEditorProject()) {
+			stringBuffer.append(TEXT_4);
+		}
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_5);
+		}
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_6);
+		}
+		String modelBundleLocalization = genModel.getModelBundleLocalization();
+		int index = modelBundleLocalization.indexOf("/");
+		if (index == -1) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(modelBundleLocalization);
+			stringBuffer.append(TEXT_8);
+		} else {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(modelBundleLocalization.substring(0, index + 1));
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(pluginClassesLocation);
+		boolean first = true;
+		for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) {
+			String sourceFolder = i.next();
+			if (i.hasNext()) {
+				sourceFolder += ",\\";
+			}
+			if (first) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(pluginClassesLocation);
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(sourceFolder);
+				first = false;
+			} else {
+				stringBuffer.append(sourceFolder);
+			}
+		}
+		stringBuffer.append(TEXT_12);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_13);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genModel.hasPluginSupport());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Class.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Class.java
new file mode 100644
index 0000000..538cf4a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Class.java
@@ -0,0 +1,2262 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Class extends org.eclipse.egf.emf.pattern.base.GenClassJava {
+	protected static String nl;
+
+	public static synchronized Class create(String lineSeparator) {
+		nl = lineSeparator;
+		Class result = new Class();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * An implementation of the model object '<em><b>";
+	protected final String TEXT_6 = "</b></em>'." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_7 = NL + " * <p>" + NL + " * The following features are implemented:" + NL + " * </p>"
+			+ NL + " * <ul>";
+	protected final String TEXT_8 = NL + " *   <li>{@link ";
+	protected final String TEXT_9 = "#";
+	protected final String TEXT_10 = " <em>";
+	protected final String TEXT_11 = "</em>}</li>";
+	protected final String TEXT_12 = NL + " * </ul>";
+	protected final String TEXT_13 = NL + " *";
+	protected final String TEXT_14 = NL + " * ";
+	protected final String TEXT_15 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_16 = NL + "@Deprecated";
+	protected final String TEXT_17 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_18 = NL + "public";
+	protected final String TEXT_19 = " abstract";
+	protected final String TEXT_20 = " class ";
+	protected final String TEXT_21 = NL + "public interface ";
+	protected final String TEXT_22 = NL + "{";
+	protected final String TEXT_23 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_24 = " copyright = ";
+	protected final String TEXT_25 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_26 = " mofDriverNumber = \"";
+	protected final String TEXT_27 = "\";";
+	protected final String TEXT_28 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate static final long serialVersionUID = 1L;" + NL;
+	protected final String TEXT_29 = NL + "\t/**" + NL
+			+ "\t * An array of objects representing the values of non-primitive features." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_30 = NL + "\t@";
+	protected final String TEXT_31 = NL + "\tprotected Object[] ";
+	protected final String TEXT_32 = ";" + NL;
+	protected final String TEXT_33 = NL + "\t/**" + NL
+			+ "\t * A bit field representing the indices of non-primitive feature values." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_34 = NL + "\tprotected int ";
+	protected final String TEXT_35 = NL + "\t/**" + NL
+			+ "\t * A set of bit flags representing the values of boolean attributes and whether unsettable features have been set."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_36 = " = 0;" + NL;
+	protected final String TEXT_37 = NL + "\t/**" + NL + "\t * The empty value for the '{@link #";
+	protected final String TEXT_38 = "() <em>";
+	protected final String TEXT_39 = "</em>}' array accessor." + NL
+			+ "\t * This is specialized for the more specific element type known in this context." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_40 = "()";
+	protected final String TEXT_41 = NL + "\t * ";
+	protected final String TEXT_42 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_43 = NL + "\t@Deprecated";
+	protected final String TEXT_44 = NL + "\t@SuppressWarnings(\"rawtypes\")";
+	protected final String TEXT_45 = NL + "\tprotected static final ";
+	protected final String TEXT_46 = "[] ";
+	protected final String TEXT_47 = "_EEMPTY_ARRAY = new ";
+	protected final String TEXT_48 = " [0]";
+	protected final String TEXT_49 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate static final int ";
+	protected final String TEXT_50 = " = ";
+	protected final String TEXT_51 = ".getFeatureID(";
+	protected final String TEXT_52 = ") - ";
+	protected final String TEXT_53 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_54 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_55 = NL + "\tprivate static final int ";
+	protected final String TEXT_56 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate static final int EOPERATION_OFFSET_CORRECTION = ";
+	protected final String TEXT_57 = ".getOperationID(";
+	protected final String TEXT_58 = "public";
+	protected final String TEXT_59 = "protected";
+	protected final String TEXT_60 = " ";
+	protected final String TEXT_61 = "()" + NL + "\t{";
+	protected final String TEXT_62 = NL + "\t\t";
+	protected final String TEXT_63 = " |= ";
+	protected final String TEXT_64 = "_EFLAG";
+	protected final String TEXT_65 = "_DEFAULT";
+	protected final String TEXT_66 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_67 = NL + "\t@Override";
+	protected final String TEXT_68 = NL + "\tprotected ";
+	protected final String TEXT_69 = " eStaticClass()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_70 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_71 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_72 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_73 = NL + "\tpublic ";
+	protected final String TEXT_74 = " eInverseAdd(";
+	protected final String TEXT_75 = " otherEnd, int featureID, ";
+	protected final String TEXT_76 = " msgs)" + NL + "\t{" + NL + "\t\tswitch (featureID";
+	protected final String TEXT_77 = ")" + NL + "\t\t{";
+	protected final String TEXT_78 = NL + "\t\t\tcase ";
+	protected final String TEXT_79 = ":";
+	protected final String TEXT_80 = NL + "\t\t\t\treturn ((";
+	protected final String TEXT_81 = "(";
+	protected final String TEXT_82 = ".InternalMapView";
+	protected final String TEXT_83 = ")";
+	protected final String TEXT_84 = "()).eMap()).basicAdd(otherEnd, msgs);";
+	protected final String TEXT_85 = NL + "\t\t\t\treturn (";
+	protected final String TEXT_86 = "()).basicAdd(otherEnd, msgs);";
+	protected final String TEXT_87 = NL + "\t\t\t\tif (eInternalContainer() != null)" + NL
+			+ "\t\t\t\t\tmsgs = eBasicRemoveFromContainer(msgs);";
+	protected final String TEXT_88 = NL + "\t\t\t\treturn basicSet";
+	protected final String TEXT_89 = "((";
+	protected final String TEXT_90 = ")otherEnd, msgs);";
+	protected final String TEXT_91 = NL + "\t\t\t\treturn eBasicSetContainer(otherEnd, ";
+	protected final String TEXT_92 = ", msgs);";
+	protected final String TEXT_93 = NL + "\t\t\t\t";
+	protected final String TEXT_94 = " = (";
+	protected final String TEXT_95 = ")eVirtualGet(";
+	protected final String TEXT_96 = ");";
+	protected final String TEXT_97 = "basicGet";
+	protected final String TEXT_98 = "();";
+	protected final String TEXT_99 = NL + "\t\t\t\tif (";
+	protected final String TEXT_100 = " != null)";
+	protected final String TEXT_101 = NL + "\t\t\t\t\tmsgs = ";
+	protected final String TEXT_102 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_103 = ", null, msgs);";
+	protected final String TEXT_104 = ".eInverseRemove(this, ";
+	protected final String TEXT_105 = ", ";
+	protected final String TEXT_106 = ".class, msgs);";
+	protected final String TEXT_107 = NL + "\t\t\tdefault:";
+	protected final String TEXT_108 = NL + "\t\t}";
+	protected final String TEXT_109 = "\t\treturn super.eInverseAdd(otherEnd, featureID, msgs);";
+	protected final String TEXT_110 = "\t\treturn eDynamicInverseAdd(otherEnd, featureID, msgs);";
+	protected final String TEXT_111 = NL + "\t}" + NL;
+	protected final String TEXT_112 = " eInverseRemove(";
+	protected final String TEXT_113 = ")((";
+	protected final String TEXT_114 = "()).eMap()).basicRemove(otherEnd, msgs);";
+	protected final String TEXT_115 = ".Internal.Wrapper)";
+	protected final String TEXT_116 = "()).featureMap()).basicRemove(otherEnd, msgs);";
+	protected final String TEXT_117 = "()).basicRemove(otherEnd, msgs);";
+	protected final String TEXT_118 = NL + "\t\t\t\treturn eBasicSetContainer(null, ";
+	protected final String TEXT_119 = NL + "\t\t\t\treturn basicUnset";
+	protected final String TEXT_120 = "(msgs);";
+	protected final String TEXT_121 = "(null, msgs);";
+	protected final String TEXT_122 = "\t\treturn super.eInverseRemove(otherEnd, featureID, msgs);";
+	protected final String TEXT_123 = "\t\treturn eDynamicInverseRemove(otherEnd, featureID, msgs);";
+	protected final String TEXT_124 = " eBasicRemoveFromContainerFeature(";
+	protected final String TEXT_125 = " msgs)" + NL + "\t{" + NL + "\t\tswitch (eContainerFeatureID()";
+	protected final String TEXT_126 = ":" + NL + "\t\t\t\treturn eInternalContainer().eInverseRemove(this, ";
+	protected final String TEXT_127 = "\t\treturn super.eBasicRemoveFromContainerFeature(msgs);";
+	protected final String TEXT_128 = "\t\treturn eDynamicBasicRemoveFromContainer(msgs);";
+	protected final String TEXT_129 = NL + "\tpublic Object eGet(int featureID, boolean resolve, boolean coreType)" + NL
+			+ "\t{" + NL + "\t\tswitch (featureID";
+	protected final String TEXT_130 = NL + "\t\t\t\treturn ";
+	protected final String TEXT_131 = "() ? Boolean.TRUE : Boolean.FALSE;";
+	protected final String TEXT_132 = NL + "\t\t\t\treturn new ";
+	protected final String TEXT_133 = "());";
+	protected final String TEXT_134 = NL + "\t\t\t\tif (resolve) return ";
+	protected final String TEXT_135 = "();" + NL + "\t\t\t\treturn basicGet";
+	protected final String TEXT_136 = NL + "\t\t\t\tif (coreType) return ((";
+	protected final String TEXT_137 = "()).eMap();" + NL + "\t\t\t\telse return ";
+	protected final String TEXT_138 = NL + "\t\t\t\tif (coreType) return ";
+	protected final String TEXT_139 = "();" + NL + "\t\t\t\telse return ";
+	protected final String TEXT_140 = "().map();";
+	protected final String TEXT_141 = "()).featureMap();" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_142 = "();" + NL + "\t\t\t\treturn ((";
+	protected final String TEXT_143 = ".Internal)";
+	protected final String TEXT_144 = "()).getWrapper();";
+	protected final String TEXT_145 = "\t\treturn super.eGet(featureID, resolve, coreType);";
+	protected final String TEXT_146 = "\t\treturn eDynamicGet(featureID, resolve, coreType);";
+	protected final String TEXT_147 = NL + "\tpublic void eSet(int featureID, Object newValue)" + NL + "\t{" + NL
+			+ "\t\tswitch (featureID";
+	protected final String TEXT_148 = NL + "\t\t\t\t((";
+	protected final String TEXT_149 = ".Internal)((";
+	protected final String TEXT_150 = "()).featureMap()).set(newValue);";
+	protected final String TEXT_151 = "()).set(newValue);";
+	protected final String TEXT_152 = ".Setting)((";
+	protected final String TEXT_153 = "()).eMap()).set(newValue);";
+	protected final String TEXT_154 = ".Setting)";
+	protected final String TEXT_155 = "().clear();" + NL + "\t\t\t\t";
+	protected final String TEXT_156 = "().addAll((";
+	protected final String TEXT_157 = "<? extends ";
+	protected final String TEXT_158 = ">";
+	protected final String TEXT_159 = ")newValue);";
+	protected final String TEXT_160 = NL + "\t\t\t\tset";
+	protected final String TEXT_161 = "(((";
+	protected final String TEXT_162 = ")newValue).";
+	protected final String TEXT_163 = "newValue);";
+	protected final String TEXT_164 = NL + "\t\t\t\treturn;";
+	protected final String TEXT_165 = "\t\tsuper.eSet(featureID, newValue);";
+	protected final String TEXT_166 = "\t\teDynamicSet(featureID, newValue);";
+	protected final String TEXT_167 = NL + "\tpublic int eBaseStructuralFeatureID(int derivedFeatureID, Class";
+	protected final String TEXT_168 = " baseClass)" + NL + "\t{";
+	protected final String TEXT_169 = NL + "\t\tif (baseClass == ";
+	protected final String TEXT_170 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (derivedFeatureID";
+	protected final String TEXT_171 = ")" + NL + "\t\t\t{";
+	protected final String TEXT_172 = NL + "\t\t\t\tcase ";
+	protected final String TEXT_173 = ": return ";
+	protected final String TEXT_174 = NL + "\t\t\t\tdefault: return -1;" + NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_175 = NL + "\t\treturn super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);"
+			+ NL + "\t}";
+	protected final String TEXT_176 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_177 = NL + "\tpublic int eDerivedStructuralFeatureID(int baseFeatureID, Class";
+	protected final String TEXT_178 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseFeatureID)" + NL + "\t\t\t{";
+	protected final String TEXT_179 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseFeatureID";
+	protected final String TEXT_180 = NL + "\t\treturn super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);"
+			+ NL + "\t}" + NL;
+	protected final String TEXT_181 = NL + "\tpublic int eDerivedOperationID(int baseOperationID, Class";
+	protected final String TEXT_182 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseOperationID)" + NL + "\t\t\t{";
+	protected final String TEXT_183 = NL
+			+ "\t\t\t\tdefault: return super.eDerivedOperationID(baseOperationID, baseClass);" + NL + "\t\t\t}" + NL
+			+ "\t\t}";
+	protected final String TEXT_184 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseOperationID";
+	protected final String TEXT_185 = NL + "\t\treturn super.eDerivedOperationID(baseOperationID, baseClass);" + NL
+			+ "\t}" + NL;
+	protected final String TEXT_186 = NL + "\tprotected Object[] eVirtualValues()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_187 = ";" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_188 = NL + "\tprotected void eSetVirtualValues(Object[] newValues)" + NL + "\t{" + NL
+			+ "\t\t";
+	protected final String TEXT_189 = " = newValues;" + NL + "\t}" + NL;
+	protected final String TEXT_190 = NL + "\tprotected int eVirtualIndexBits(int offset)" + NL + "\t{" + NL
+			+ "\t\tswitch (offset)" + NL + "\t\t{";
+	protected final String TEXT_191 = " :" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_192 = NL + "\t\t\tdefault :" + NL + "\t\t\t\tthrow new IndexOutOfBoundsException();"
+			+ NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_193 = NL + "\tprotected void eSetVirtualIndexBits(int offset, int newIndexBits)" + NL
+			+ "\t{" + NL + "\t\tswitch (offset)" + NL + "\t\t{";
+	protected final String TEXT_194 = " :" + NL + "\t\t\t\t";
+	protected final String TEXT_195 = " = newIndexBits;" + NL + "\t\t\t\tbreak;";
+	protected final String TEXT_196 = NL + "\t\t\tdefault :" + NL + "\t\t\t\tthrow new IndexOutOfBoundsException();"
+			+ NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_197 = NL + "\t@SuppressWarnings(";
+	protected final String TEXT_198 = "\"unchecked\"";
+	protected final String TEXT_199 = "{\"rawtypes\", \"unchecked\" }";
+	protected final String TEXT_200 = NL + "\tpublic Object eInvoke(int operationID, ";
+	protected final String TEXT_201 = " arguments) throws ";
+	protected final String TEXT_202 = NL + "\t{" + NL + "\t\tswitch (operationID";
+	protected final String TEXT_203 = NL + "\t\t\t\ttry" + NL + "\t\t\t\t{";
+	protected final String TEXT_204 = "arguments.get(";
+	protected final String TEXT_205 = ").";
+	protected final String TEXT_206 = ");" + NL + "\t\t\t\t";
+	protected final String TEXT_207 = "return null;";
+	protected final String TEXT_208 = "return ";
+	protected final String TEXT_209 = "new ";
+	protected final String TEXT_210 = NL + "\t\t\t\t}" + NL + "\t\t\t\tcatch (";
+	protected final String TEXT_211 = " throwable)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tthrow new ";
+	protected final String TEXT_212 = "(throwable);" + NL + "\t\t\t\t}";
+	protected final String TEXT_213 = "\t\treturn super.eInvoke(operationID, arguments);";
+	protected final String TEXT_214 = "\t\treturn eDynamicInvoke(operationID, arguments);";
+	protected final String TEXT_215 = NL + "\tpublic String toString()" + NL + "\t{" + NL
+			+ "\t\tif (eIsProxy()) return super.toString();" + NL + "" + NL + "\t\t";
+	protected final String TEXT_216 = " result = new ";
+	protected final String TEXT_217 = "(super.toString());";
+	protected final String TEXT_218 = NL + "\t\tresult.append(\" (";
+	protected final String TEXT_219 = ": \");";
+	protected final String TEXT_220 = NL + "\t\tresult.append(\", ";
+	protected final String TEXT_221 = NL + "\t\tif (eVirtualIsSet(";
+	protected final String TEXT_222 = ")) result.append(eVirtualGet(";
+	protected final String TEXT_223 = ")); else result.append(\"<unset>\");";
+	protected final String TEXT_224 = NL + "\t\tif (";
+	protected final String TEXT_225 = " & ";
+	protected final String TEXT_226 = "_ESETFLAG) != 0";
+	protected final String TEXT_227 = "ESet";
+	protected final String TEXT_228 = ") result.append((";
+	protected final String TEXT_229 = "_EFLAG) != 0); else result.append(\"<unset>\");";
+	protected final String TEXT_230 = ") result.append(";
+	protected final String TEXT_231 = "_EFLAG_VALUES[(";
+	protected final String TEXT_232 = "_EFLAG) >>> ";
+	protected final String TEXT_233 = "_EFLAG_OFFSET]); else result.append(\"<unset>\");";
+	protected final String TEXT_234 = "); else result.append(\"<unset>\");";
+	protected final String TEXT_235 = NL + "\t\tresult.append(eVirtualGet(";
+	protected final String TEXT_236 = "));";
+	protected final String TEXT_237 = NL + "\t\tresult.append((";
+	protected final String TEXT_238 = "_EFLAG) != 0);";
+	protected final String TEXT_239 = NL + "\t\tresult.append(";
+	protected final String TEXT_240 = "_EFLAG_OFFSET]);";
+	protected final String TEXT_241 = NL + "\t\tresult.append(')');" + NL + "\t\treturn result.toString();" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_242 = NL + "\tprotected int hash = -1;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_243 = NL + "\tpublic int getHash()" + NL + "\t{" + NL + "\t\tif (hash == -1)" + NL
+			+ "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_244 = " theKey = getKey();" + NL
+			+ "\t\t\thash = (theKey == null ? 0 : theKey.hashCode());" + NL + "\t\t}" + NL + "\t\treturn hash;" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_245 = NL + "\tpublic void setHash(int hash)" + NL + "\t{" + NL + "\t\tthis.hash = hash;"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_246 = " getKey()" + NL + "\t{";
+	protected final String TEXT_247 = NL + "\t\treturn new ";
+	protected final String TEXT_248 = "(getTypedKey());";
+	protected final String TEXT_249 = NL + "\t\treturn getTypedKey();";
+	protected final String TEXT_250 = NL + "\tpublic void setKey(";
+	protected final String TEXT_251 = " key)" + NL + "\t{";
+	protected final String TEXT_252 = NL + "\t\tgetTypedKey().addAll(";
+	protected final String TEXT_253 = "key);";
+	protected final String TEXT_254 = NL + "\t\tsetTypedKey(key);";
+	protected final String TEXT_255 = NL + "\t\tsetTypedKey(((";
+	protected final String TEXT_256 = ")key).";
+	protected final String TEXT_257 = NL + "\t\tsetTypedKey((";
+	protected final String TEXT_258 = ")key);";
+	protected final String TEXT_259 = " getValue()" + NL + "\t{";
+	protected final String TEXT_260 = "(getTypedValue());";
+	protected final String TEXT_261 = NL + "\t\treturn getTypedValue();";
+	protected final String TEXT_262 = " setValue(";
+	protected final String TEXT_263 = " value)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_264 = " oldValue = getValue();";
+	protected final String TEXT_265 = NL + "\t\tgetTypedValue().clear();" + NL + "\t\tgetTypedValue().addAll(";
+	protected final String TEXT_266 = "value);";
+	protected final String TEXT_267 = NL + "\t\tsetTypedValue(value);";
+	protected final String TEXT_268 = NL + "\t\tsetTypedValue(((";
+	protected final String TEXT_269 = ")value).";
+	protected final String TEXT_270 = NL + "\t\tsetTypedValue((";
+	protected final String TEXT_271 = ")value);";
+	protected final String TEXT_272 = NL + "\t\treturn oldValue;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_273 = " getEMap()" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_274 = " container = eContainer();" + NL + "\t\treturn container == null ? null : (";
+	protected final String TEXT_275 = ")container.eGet(eContainmentFeature());" + NL + "\t}" + NL;
+	protected final String TEXT_276 = NL + "} //";
+	protected final String TEXT_277 = NL;
+
+	public Class() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_277);
+		stringBuffer.append(TEXT_277);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenClass genClass = parameter;
+		targetPath = genClass.getGenModel().getModelDirectory();
+		packageName = genClass.getGenPackage().getClassPackageName();
+		className = genClass.getClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenClass genClass = parameter;
+		argument = ((Object[]) new Object[] { new Object[] { genClass,
+				genClass.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE, Boolean.TRUE } })[0];
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2019 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+		 */
+
+		final GenClass genClass = (GenClass) ((Object[]) argument)[0];
+		final GenPackage genPackage = genClass.getGenPackage();
+		final GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		final boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
+		final boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
+		final boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation()
+				&& !(isInterface && isImplementation);
+		final boolean isGWT = genModel.getRuntimePlatform() == GenRuntimePlatform.GWT;
+		final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();
+		final String indentDefaultCase = forceDefaultCase ? "\t\t" : "";
+		final String publicStaticFinalFlag = isImplementation ? "public static final " : "";
+		final String singleWildcard = isJDK50 ? "<?>" : "";
+		final String negativeOffsetCorrection = genClass.hasOffsetCorrection()
+				? " - " + genClass.getOffsetCorrectionField(null)
+				: "";
+		final String positiveOffsetCorrection = genClass.hasOffsetCorrection()
+				? " + " + genClass.getOffsetCorrectionField(null)
+				: "";
+		final String negativeOperationOffsetCorrection = genClass.hasOffsetCorrection()
+				? " - EOPERATION_OFFSET_CORRECTION"
+				: "";
+		final String positiveOperationOffsetCorrection = genClass.hasOffsetCorrection()
+				? " + EOPERATION_OFFSET_CORRECTION"
+				: "";
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getInterfacePackageName());
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getClassPackageName());
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		genModel.markImportLocation(stringBuffer, genPackage);
+		if (isImplementation) {
+			genClass.addClassPsuedoImports();
+		}
+		stringBuffer.append(TEXT_4);
+		if (isInterface) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.interface.javadoc.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_C2iO4eXDEeCxnsoQRwU99Q",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/interface.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_6);
+			if (!genClass.getImplementedGenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_7);
+				for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genClass.getQualifiedClassName());
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_11);
+				}
+				stringBuffer.append(TEXT_12);
+			}
+			stringBuffer.append(TEXT_13);
+			if (genClass.hasImplicitAPITags()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_15);
+		}
+		if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_16);
+		}
+		if (isImplementation) {
+			if (isJDK50 && !genClass.hasAPIDeprecatedTag()
+					&& GenModelUtil.hasImplicitAPIDeprecatedTag(genClass.getEGetGenFeatures(),
+							genClass.getEIsSetGenFeatures(), genClass.getESetGenFeatures(),
+							genClass.getEUnsetGenFeatures(), genClass.getEInverseAddGenFeatures(),
+							genClass.getEInverseRemoveGenFeatures(), genClass.getEBasicRemoveFromContainerGenFeatures(),
+							genClass.getToStringGenFeatures())) {
+				stringBuffer.append(TEXT_17);
+			}
+			stringBuffer.append(TEXT_18);
+			if (genClass.isAbstract()) {
+				stringBuffer.append(TEXT_19);
+			}
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genClass.getClassName());
+			stringBuffer.append(genClass.getTypeParameters().trim());
+			stringBuffer.append(genClass.getClassExtends());
+			stringBuffer.append(genClass.getClassImplements());
+		} else {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genClass.getInterfaceName());
+			stringBuffer.append(genClass.getTypeParameters().trim());
+			stringBuffer.append(genClass.getInterfaceExtends());
+		}
+		stringBuffer.append(TEXT_22);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isImplementation && genModel.getDriverNumber() != null) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genModel.getDriverNumber());
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isImplementation && genClass.isJavaIOSerializable()) {
+			stringBuffer.append(TEXT_28);
+		}
+		if (isImplementation && genModel.isVirtualDelegation()) {
+			String eVirtualValuesField = genClass.getEVirtualValuesField();
+			if (eVirtualValuesField != null) {
+				stringBuffer.append(TEXT_29);
+				if (isGWT) {
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+				}
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(eVirtualValuesField);
+				stringBuffer.append(TEXT_32);
+			}
+			{
+				List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());
+				if (!eVirtualIndexBitFields.isEmpty()) {
+					for (String eVirtualIndexBitField : eVirtualIndexBitFields) {
+						stringBuffer.append(TEXT_33);
+						if (isGWT) {
+							stringBuffer.append(TEXT_30);
+							stringBuffer
+									.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+						}
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(eVirtualIndexBitField);
+						stringBuffer.append(TEXT_32);
+					}
+				}
+			}
+		}
+		if (isImplementation && genClass.isModelRoot() && genModel.isBooleanFlagsEnabled()
+				&& genModel.getBooleanFlagsReservedBits() == -1) {
+			stringBuffer.append(TEXT_35);
+			if (isGWT) {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+			}
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genModel.getBooleanFlagsField());
+			stringBuffer.append(TEXT_36);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()) {
+			for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {
+				if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+						&& !genFeature.isMapType()) {
+					String rawListItemType = genFeature.getRawListItemType(genClass);
+					int index = rawListItemType.indexOf('[');
+					String head = rawListItemType;
+					String tail = "";
+					if (index != -1) {
+						head = rawListItemType.substring(0, index);
+						tail = rawListItemType.substring(index);
+					}
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(genFeature.getGetArrayAccessor());
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genFeature.getGetArrayAccessor());
+					stringBuffer.append(TEXT_40);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_42);
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_43);
+					}
+					if (genFeature.getQualifiedListItemType(genClass).contains("<")
+							|| genFeature.getArrayItemType(genClass).contains("<")) {
+						stringBuffer.append(TEXT_44);
+					}
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(rawListItemType);
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(head);
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(tail);
+					stringBuffer.append(TEXT_32);
+				}
+			}
+			for (GenFeature genFeature : genClass.getDeclaredFieldGenFeatures()) {
+				stringBuffer.append(TEXT_4);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.declaredFieldGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0jpGTmJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/declaredFieldGenFeature.override.javajetinc
+			}
+		}
+		if (isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genClass.getOffsetCorrectionField(null));
+			stringBuffer.append(TEXT_50);
+			stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_51);
+			stringBuffer.append(genClass.getImplementedGenFeatures().get(0).getQualifiedFeatureAccessor());
+			stringBuffer.append(TEXT_52);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genClass.getImplementedGenFeatures().get(0)));
+			stringBuffer.append(TEXT_32);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()) {
+			for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {
+				GenFeature reverseFeature = genFeature.getReverse();
+				if (reverseFeature != null && reverseFeature.getGenClass().hasOffsetCorrection()) {
+					stringBuffer.append(TEXT_53);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_54);
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_43);
+					}
+					stringBuffer.append(TEXT_55);
+					stringBuffer.append(genClass.getOffsetCorrectionField(genFeature));
+					stringBuffer.append(TEXT_50);
+					stringBuffer.append(reverseFeature.getGenClass().getQualifiedClassifierAccessor());
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(reverseFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(reverseFeature.getGenClass().getQualifiedFeatureID(reverseFeature));
+					stringBuffer.append(TEXT_32);
+				}
+			}
+		}
+		if (genModel.isOperationReflection() && isImplementation && genClass.hasOffsetCorrection()
+				&& !genClass.getImplementedGenOperations().isEmpty()) {
+			stringBuffer.append(TEXT_56);
+			stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_57);
+			stringBuffer.append(genClass.getImplementedGenOperations().get(0).getQualifiedOperationAccessor());
+			stringBuffer.append(TEXT_52);
+			stringBuffer.append(genClass.getQualifiedOperationID(genClass.getImplementedGenOperations().get(0)));
+			stringBuffer.append(TEXT_32);
+		}
+		if (isImplementation) {
+			stringBuffer.append(TEXT_23);
+			if (genModel.isPublicConstructors()) {
+				stringBuffer.append(TEXT_58);
+			} else {
+				stringBuffer.append(TEXT_59);
+			}
+			stringBuffer.append(TEXT_60);
+			stringBuffer.append(genClass.getClassName());
+			stringBuffer.append(TEXT_61);
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.egfCustom.constructor.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_JLBM0HroEeC0XN9kbwkPYQ",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			for (GenFeature genFeature : genClass.getFlagGenFeaturesWithDefault()) {
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(genClass.getFlagsField(genFeature));
+				stringBuffer.append(TEXT_63);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_64);
+				if (!genFeature.isBooleanType()) {
+					stringBuffer.append(TEXT_65);
+				}
+				stringBuffer.append(TEXT_3);
+			}
+			stringBuffer.append(TEXT_66);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_68);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_70);
+		}
+		if (isImplementation && genModel.isDynamicDelegation()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicDelegation" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_WUeasCSWEemxeP6B0lLOpA",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.reflectiveDelegation.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0kFyMGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//Class/reflectiveDelegation.override.javajetinc
+		if (isImplementation) {
+			new Runnable() {
+				public void run() {
+					GenClass classExtendsGenClass = genClass.getClassExtendsGenClass();
+					List<GenFeature> classExtendsAllGenFeatures = classExtendsGenClass == null
+							? Collections.<GenFeature>emptyList()
+							: classExtendsGenClass.getAllGenFeatures();
+					for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {
+						stringBuffer.append(TEXT_4);
+						{
+							//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeatureReified.override" args="genFeature:genFeature,classExtendsGenClass:classExtendsGenClass,classExtendsAllGenFeatures:classExtendsAllGenFeatures,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+							InternalPatternContext ictx = (InternalPatternContext) ctx;
+							new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+							stringBuffer.setLength(0);
+
+							final Map<String, Object> callParameters = new HashMap<String, Object>();
+							callParameters.put("genFeature", genFeature);
+							callParameters.put("classExtendsGenClass", classExtendsGenClass);
+							callParameters.put("classExtendsAllGenFeatures", classExtendsAllGenFeatures);
+							callParameters.put("genClass", genClass);
+							callParameters.put("genPackage", genPackage);
+							callParameters.put("genModel", genModel);
+							callParameters.put("isJDK50", isJDK50);
+							callParameters.put("isInterface", isInterface);
+							callParameters.put("isImplementation", isImplementation);
+							callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+							callParameters.put("isGWT", isGWT);
+							callParameters.put("forceDefaultCase", forceDefaultCase);
+							callParameters.put("indentDefaultCase", indentDefaultCase);
+							callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+							callParameters.put("singleWildcard", singleWildcard);
+							callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+							callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+							callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+							callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+							CallHelper.executeWithParameterInjection(
+									"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_odzp0LM-EeKd56X4hcZPSw",
+									new ExecutionContext((InternalPatternContext) ctx), callParameters);
+							stringBuffer.setLength(0);
+						}
+
+						//Class/genFeatureReified.override.javajetinc
+					}
+				}
+			}.run();
+		}
+		new Runnable() {
+			public void run() {
+				for (GenFeature genFeature : (isImplementation ? genClass.getImplementedGenFeatures()
+						: genClass.getDeclaredGenFeatures())) {
+					stringBuffer.append(TEXT_4);
+					{
+						//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+						InternalPatternContext ictx = (InternalPatternContext) ctx;
+						new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+						stringBuffer.setLength(0);
+
+						final Map<String, Object> callParameters = new HashMap<String, Object>();
+						callParameters.put("genFeature", genFeature);
+						callParameters.put("genClass", genClass);
+						callParameters.put("genPackage", genPackage);
+						callParameters.put("genModel", genModel);
+						callParameters.put("isJDK50", isJDK50);
+						callParameters.put("isInterface", isInterface);
+						callParameters.put("isImplementation", isImplementation);
+						callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+						callParameters.put("isGWT", isGWT);
+						callParameters.put("forceDefaultCase", forceDefaultCase);
+						callParameters.put("indentDefaultCase", indentDefaultCase);
+						callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+						callParameters.put("singleWildcard", singleWildcard);
+						callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+						callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+						callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+						callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+						CallHelper.executeWithParameterInjection(
+								"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0kO8IGJ-Ed-FqczH3ESmRw",
+								new ExecutionContext((InternalPatternContext) ctx), callParameters);
+						stringBuffer.setLength(0);
+					}
+
+					//Class/genFeature.override.javajetinc
+				} //for
+			}
+		}.run();
+		for (GenOperation genOperation : (isImplementation ? genClass.getImplementedGenOperations()
+				: genClass.getDeclaredGenOperations())) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genOperation", genOperation);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0tBrwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/implementedGenOperation.override.javajetinc
+		} //for
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEInverseAddGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useGenerics()) {
+				for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {
+					if (genFeature.isUncheckedCast(genClass)) {
+						stringBuffer.append(TEXT_72);
+						break;
+					}
+				}
+			}
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_74);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isListType()) {
+					String cast = "(" + genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")
+							+ (!genModel.useGenerics() ? ")"
+									: "<" + genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject") + ">)("
+											+ genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")
+											+ "<?>)");
+					if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(cast);
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_84);
+					} else {
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(cast);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_86);
+					}
+				} else if (genFeature.isContainer()) {
+					stringBuffer.append(TEXT_87);
+					if (genFeature.isBasicSet()) {
+						stringBuffer.append(TEXT_88);
+						stringBuffer.append(genFeature.getAccessorName());
+						stringBuffer.append(TEXT_89);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_90);
+					} else {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_92);
+					}
+				} else {
+					if (genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_60);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_94);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_95);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_96);
+					} else if (genFeature.isVolatile()
+							|| genClass.getImplementingGenModel(genFeature).isDynamicDelegation()) {
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_60);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_50);
+						if (genFeature.isResolveProxies()) {
+							stringBuffer.append(TEXT_97);
+							stringBuffer.append(genFeature.getAccessorName());
+						} else {
+							stringBuffer.append(genFeature.getGetAccessor());
+						}
+						stringBuffer.append(TEXT_98);
+					}
+					stringBuffer.append(TEXT_99);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_100);
+					if (genFeature.isEffectiveContains()) {
+						stringBuffer.append(TEXT_101);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_102);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_103);
+					} else {
+						GenFeature reverseFeature = genFeature.getReverse();
+						GenClass targetClass = reverseFeature.getGenClass();
+						String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+								? " + " + genClass.getOffsetCorrectionField(genFeature)
+								: "";
+						stringBuffer.append(TEXT_101);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_104);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_105);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_106);
+					}
+					stringBuffer.append(TEXT_88);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_89);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_90);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_109);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_110);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_108);
+			}
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEInverseRemoveGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_112);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEInverseRemoveGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isListType()) {
+					if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_113);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_114);
+					} else if (genFeature.isWrappedFeatureMapType()) {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_113);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_115);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_116);
+					} else {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_117);
+					}
+				} else if (genFeature.isContainer() && !genFeature.isBasicSet()) {
+					stringBuffer.append(TEXT_118);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_92);
+				} else if (genFeature.isUnsettable()) {
+					stringBuffer.append(TEXT_119);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_120);
+				} else {
+					stringBuffer.append(TEXT_88);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_121);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_122);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_123);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEBasicRemoveFromContainerGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_124);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_125);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEBasicRemoveFromContainerGenFeatures()) {
+				GenFeature reverseFeature = genFeature.getReverse();
+				GenClass targetClass = reverseFeature.getGenClass();
+				String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+						? " + " + genClass.getOffsetCorrectionField(genFeature)
+						: "";
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_126);
+				stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+				stringBuffer.append(reverseOffsetCorrection);
+				stringBuffer.append(TEXT_105);
+				stringBuffer.append(targetClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_106);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_127);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_128);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEGetGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_129);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEGetGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isPrimitiveType()) {
+					if (isJDK50) {
+						stringBuffer.append(TEXT_130);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_98);
+					} else if (genFeature.isBooleanType()) {
+						stringBuffer.append(TEXT_130);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_131);
+					} else {
+						stringBuffer.append(TEXT_132);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_133);
+					}
+				} else if (genFeature.isResolveProxies() && !genFeature.isListType()) {
+					stringBuffer.append(TEXT_134);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_135);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_98);
+				} else if (genFeature.isMapType()) {
+					if (genFeature.isEffectiveSuppressEMFTypes()) {
+						stringBuffer.append(TEXT_136);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_137);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_98);
+					} else {
+						stringBuffer.append(TEXT_138);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_139);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_140);
+					}
+				} else if (genFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_136);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_115);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_141);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_98);
+				} else if (genFeature.isFeatureMapType()) {
+					stringBuffer.append(TEXT_138);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_142);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_143);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_144);
+				} else {
+					stringBuffer.append(TEXT_130);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_98);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_145);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_146);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getESetGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useGenerics()) {
+				for (GenFeature genFeature : genClass.getESetGenFeatures()) {
+					if (genFeature.isUncheckedCast(genClass) && !genFeature.isFeatureMapType()
+							&& !genFeature.isMapType()) {
+						stringBuffer.append(TEXT_72);
+						break;
+					}
+				}
+			}
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_147);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getESetGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isListType()) {
+					if (genFeature.isWrappedFeatureMapType()) {
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_149);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_115);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_150);
+					} else if (genFeature.isFeatureMapType()) {
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_143);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_151);
+					} else if (genFeature.isMapType()) {
+						if (genFeature.isEffectiveSuppressEMFTypes()) {
+							stringBuffer.append(TEXT_148);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+							stringBuffer.append(TEXT_152);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_153);
+						} else {
+							stringBuffer.append(TEXT_148);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+							stringBuffer.append(TEXT_154);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_151);
+						}
+					} else {
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_155);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_156);
+						stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+						if (isJDK50) {
+							stringBuffer.append(TEXT_157);
+							stringBuffer.append(genFeature.getListItemType(genClass));
+							stringBuffer.append(TEXT_158);
+						}
+						stringBuffer.append(TEXT_159);
+					}
+				} else if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_160);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_161);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_162);
+					stringBuffer.append(genFeature.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_133);
+				} else {
+					stringBuffer.append(TEXT_160);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_81);
+					if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType()
+							|| !genFeature.getRawType().equals(genFeature.getType(genClass))) {
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_83);
+					}
+					stringBuffer.append(TEXT_163);
+				}
+				stringBuffer.append(TEXT_164);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_165);
+				if (forceDefaultCase) {
+					stringBuffer.append(TEXT_164);
+				}
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_166);
+				if (forceDefaultCase) {
+					stringBuffer.append(TEXT_164);
+				}
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEUnsetGenFeatures())) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.eUnset.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0uN-kGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/eUnset.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEIsSetGenFeatures())) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.eIsSet.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0uXvkGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/eIsSet.override.javajetinc
+		}
+		if (isImplementation && (!genClass.getMixinGenFeatures().isEmpty()
+				|| genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty())) {
+			if (!genClass.getMixinGenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_71);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_67);
+				}
+				stringBuffer.append(TEXT_167);
+				stringBuffer.append(singleWildcard);
+				stringBuffer.append(TEXT_168);
+				for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {
+					stringBuffer.append(TEXT_169);
+					stringBuffer.append(mixinGenClass.getRawImportedInterfaceName());
+					stringBuffer.append(TEXT_170);
+					stringBuffer.append(negativeOffsetCorrection);
+					stringBuffer.append(TEXT_171);
+					for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {
+						stringBuffer.append(TEXT_172);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(TEXT_173);
+						stringBuffer.append(mixinGenClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_174);
+				}
+				stringBuffer.append(TEXT_175);
+			}
+			stringBuffer.append(TEXT_176);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_177);
+			stringBuffer.append(singleWildcard);
+			stringBuffer.append(TEXT_168);
+			for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(mixinGenClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_178);
+				for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(mixinGenClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			if (genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(genClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_179);
+				stringBuffer.append(negativeOffsetCorrection);
+				stringBuffer.append(TEXT_171);
+				for (GenFeature genFeature : genClass.getGenFeatures()) {
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			stringBuffer.append(TEXT_180);
+		}
+		if (genModel.isOperationReflection() && isImplementation
+				&& (!genClass.getMixinGenOperations().isEmpty()
+						|| !genClass.getOverrideGenOperations(genClass.getExtendedGenOperations(),
+								genClass.getImplementedGenOperations()).isEmpty()
+						|| genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_181);
+			stringBuffer.append(singleWildcard);
+			stringBuffer.append(TEXT_168);
+			for (GenClass extendedGenClass : genClass.getExtendedGenClasses()) {
+				List<GenOperation> extendedImplementedGenOperations = extendedGenClass.getImplementedGenOperations();
+				List<GenOperation> implementedGenOperations = genClass.getImplementedGenOperations();
+				if (!genClass.getOverrideGenOperations(extendedImplementedGenOperations, implementedGenOperations)
+						.isEmpty()) {
+					stringBuffer.append(TEXT_169);
+					stringBuffer.append(extendedGenClass.getRawImportedInterfaceName());
+					stringBuffer.append(TEXT_182);
+					for (GenOperation genOperation : extendedImplementedGenOperations) {
+						GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);
+						if (implementedGenOperations.contains(overrideGenOperation)) {
+							stringBuffer.append(TEXT_172);
+							stringBuffer.append(extendedGenClass.getQualifiedOperationID(genOperation));
+							stringBuffer.append(TEXT_173);
+							stringBuffer.append(genClass.getQualifiedOperationID(overrideGenOperation));
+							stringBuffer.append(positiveOperationOffsetCorrection);
+							stringBuffer.append(TEXT_3);
+						}
+					}
+					stringBuffer.append(TEXT_183);
+				}
+			}
+			for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(mixinGenClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_182);
+				for (GenOperation genOperation : mixinGenClass.getGenOperations()) {
+					GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(mixinGenClass.getQualifiedOperationID(genOperation));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedOperationID(
+							overrideGenOperation != null ? overrideGenOperation : genOperation));
+					stringBuffer.append(positiveOperationOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			if (genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(genClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_184);
+				stringBuffer.append(negativeOperationOffsetCorrection);
+				stringBuffer.append(TEXT_171);
+				for (GenOperation genOperation : genClass.getGenOperations()) {
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(genClass.getQualifiedOperationID(genOperation));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedOperationID(genOperation));
+					stringBuffer.append(positiveOperationOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			stringBuffer.append(TEXT_185);
+		}
+		if (isImplementation && genModel.isVirtualDelegation()) {
+			String eVirtualValuesField = genClass.getEVirtualValuesField();
+			if (eVirtualValuesField != null) {
+				stringBuffer.append(TEXT_71);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_67);
+				}
+				stringBuffer.append(TEXT_186);
+				stringBuffer.append(eVirtualValuesField);
+				stringBuffer.append(TEXT_187);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_67);
+				}
+				stringBuffer.append(TEXT_188);
+				stringBuffer.append(eVirtualValuesField);
+				stringBuffer.append(TEXT_189);
+			}
+			{
+				List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());
+				if (!eVirtualIndexBitFields.isEmpty()) {
+					List<String> allEVirtualIndexBitFields = genClass
+							.getAllEVirtualIndexBitFields(new ArrayList<String>());
+					stringBuffer.append(TEXT_71);
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_67);
+					}
+					stringBuffer.append(TEXT_190);
+					for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_191);
+						stringBuffer.append(allEVirtualIndexBitFields.get(i));
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_192);
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_67);
+					}
+					stringBuffer.append(TEXT_193);
+					for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_194);
+						stringBuffer.append(allEVirtualIndexBitFields.get(i));
+						stringBuffer.append(TEXT_195);
+					}
+					stringBuffer.append(TEXT_196);
+				}
+			}
+		}
+		if (genModel.isOperationReflection() && isImplementation && !genClass.getImplementedGenOperations().isEmpty()) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			if (genModel.useGenerics()) {
+				boolean isUnchecked = false;
+				boolean isRaw = false;
+				LOOP: for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods()
+						? genClass.getImplementedGenOperations()
+						: genClass.getAllGenOperations())) {
+					for (GenParameter genParameter : genOperation.getGenParameters()) {
+						if (genParameter.isUncheckedCast()) {
+							if (genParameter.getTypeGenDataType() == null
+									|| !genParameter.getTypeGenDataType().isObjectType()) {
+								isUnchecked = true;
+							}
+							if (genParameter.usesOperationTypeParameters() && !genParameter.getEcoreParameter()
+									.getEGenericType().getETypeArguments().isEmpty()) {
+								isRaw = true;
+								break LOOP;
+							}
+						}
+					}
+				}
+				if (isUnchecked) {
+					stringBuffer.append(TEXT_197);
+					if (!isRaw) {
+						stringBuffer.append(TEXT_198);
+					} else {
+						stringBuffer.append(TEXT_199);
+					}
+					stringBuffer.append(TEXT_83);
+				}
+			}
+			stringBuffer.append(TEXT_200);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EList"));
+			stringBuffer.append(singleWildcard);
+			stringBuffer.append(TEXT_201);
+			stringBuffer.append(genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException"
+					: "java.lang.reflect.InvocationTargetException"));
+			stringBuffer.append(TEXT_202);
+			stringBuffer.append(negativeOperationOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods()
+					? genClass.getImplementedGenOperations()
+					: genClass.getAllGenOperations())) {
+				List<GenParameter> genParameters = genOperation.getGenParameters();
+				int size = genParameters.size();
+				boolean hasCheckedException = genOperation.hasCheckedException();
+				String indent = hasCheckedException ? "\t" : "";
+				GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass
+						.getQualifiedOperationID(overrideGenOperation != null ? overrideGenOperation : genOperation));
+				stringBuffer.append(TEXT_79);
+				if (hasCheckedException) {
+					stringBuffer.append(TEXT_203);
+					/*}*/}
+				if (genOperation.isVoid()) {
+					stringBuffer.append(TEXT_93);
+					stringBuffer.append(indent);
+					stringBuffer.append(genOperation.getName());
+					stringBuffer.append(TEXT_81);
+					for (int i = 0; i < size; i++) {
+						GenParameter genParameter = genParameters.get(i);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_81);
+						}
+						if (genParameter.getTypeGenDataType() == null
+								|| !genParameter.getTypeGenDataType().isObjectType()
+								|| !genParameter.usesOperationTypeParameters()
+										&& !genParameter.getRawType().equals(genParameter.getType(genClass))) {
+							stringBuffer.append(TEXT_81);
+							stringBuffer.append(
+									genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType()
+											: genParameter.getObjectType(genClass));
+							stringBuffer.append(TEXT_83);
+						}
+						stringBuffer.append(TEXT_204);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_83);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_205);
+							stringBuffer.append(genParameter.getPrimitiveValueFunction());
+							stringBuffer.append(TEXT_40);
+						}
+						if (i < (size - 1)) {
+							stringBuffer.append(TEXT_105);
+						}
+					}
+					stringBuffer.append(TEXT_206);
+					stringBuffer.append(indent);
+					stringBuffer.append(TEXT_207);
+				} else {
+					stringBuffer.append(TEXT_93);
+					stringBuffer.append(indent);
+					stringBuffer.append(TEXT_208);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_209);
+						stringBuffer.append(genOperation.getObjectType(genClass));
+						stringBuffer.append(TEXT_81);
+					}
+					stringBuffer.append(genOperation.getName());
+					stringBuffer.append(TEXT_81);
+					for (int i = 0; i < size; i++) {
+						GenParameter genParameter = genParameters.get(i);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_81);
+						}
+						if (genParameter.getTypeGenDataType() == null
+								|| !genParameter.getTypeGenDataType().isObjectType()
+								|| !genParameter.usesOperationTypeParameters()
+										&& !genParameter.getRawType().equals(genParameter.getType(genClass))) {
+							stringBuffer.append(TEXT_81);
+							stringBuffer.append(
+									genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType()
+											: genParameter.getObjectType(genClass));
+							stringBuffer.append(TEXT_83);
+						}
+						stringBuffer.append(TEXT_204);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_83);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_205);
+							stringBuffer.append(genParameter.getPrimitiveValueFunction());
+							stringBuffer.append(TEXT_40);
+						}
+						if (i < (size - 1)) {
+							stringBuffer.append(TEXT_105);
+						}
+					}
+					stringBuffer.append(TEXT_83);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_83);
+					}
+					stringBuffer.append(TEXT_3);
+				}
+				if (hasCheckedException) {/*{*/
+					stringBuffer.append(TEXT_210);
+					stringBuffer.append(genModel.getImportedName("java.lang.Throwable"));
+					stringBuffer.append(TEXT_211);
+					stringBuffer.append(
+							genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException"
+									: "java.lang.reflect.InvocationTargetException"));
+					stringBuffer.append(TEXT_212);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_213);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_214);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (!genClass.hasImplementedToStringGenOperation() && isImplementation && !genModel.isReflectiveDelegation()
+				&& !genModel.isDynamicDelegation() && !genClass.getToStringGenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_215);
+			stringBuffer.append(genModel.useGenerics() ? "StringBuilder" : "StringBuffer");
+			stringBuffer.append(TEXT_216);
+			stringBuffer.append(genModel.useGenerics() ? "StringBuilder" : "StringBuffer");
+			stringBuffer.append(TEXT_217);
+			{
+				boolean first = true;
+				for (GenFeature genFeature : genClass.getToStringGenFeatures()) {
+					if (first) {
+						first = false;
+						stringBuffer.append(TEXT_218);
+						stringBuffer.append(genFeature.getName());
+						stringBuffer.append(TEXT_219);
+						stringBuffer.append(genModel.getNonNLS());
+					} else {
+						stringBuffer.append(TEXT_220);
+						stringBuffer.append(genFeature.getName());
+						stringBuffer.append(TEXT_219);
+						stringBuffer.append(genModel.getNonNLS());
+					}
+					if (genFeature.isUnsettable() && !genFeature.isListType()) {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_221);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_222);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_223);
+							stringBuffer.append(genModel.getNonNLS());
+						} else {
+							if (genClass.isFlag(genFeature)) {
+								if (genFeature.isBooleanType()) {
+									stringBuffer.append(TEXT_224);
+									if (genClass.isESetFlag(genFeature)) {
+										stringBuffer.append(TEXT_81);
+										stringBuffer.append(genClass.getESetFlagsField(genFeature));
+										stringBuffer.append(TEXT_225);
+										stringBuffer.append(genFeature.getUpperName());
+										stringBuffer.append(TEXT_226);
+									} else {
+										stringBuffer.append(genFeature.getUncapName());
+										stringBuffer.append(TEXT_227);
+									}
+									stringBuffer.append(TEXT_228);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_229);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_224);
+									if (genClass.isESetFlag(genFeature)) {
+										stringBuffer.append(TEXT_81);
+										stringBuffer.append(genClass.getESetFlagsField(genFeature));
+										stringBuffer.append(TEXT_225);
+										stringBuffer.append(genFeature.getUpperName());
+										stringBuffer.append(TEXT_226);
+									} else {
+										stringBuffer.append(genFeature.getUncapName());
+										stringBuffer.append(TEXT_227);
+									}
+									stringBuffer.append(TEXT_230);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_231);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_232);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_233);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							} else {
+								stringBuffer.append(TEXT_224);
+								if (genClass.isESetFlag(genFeature)) {
+									stringBuffer.append(TEXT_81);
+									stringBuffer.append(genClass.getESetFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_226);
+								} else {
+									stringBuffer.append(genFeature.getUncapName());
+									stringBuffer.append(TEXT_227);
+								}
+								stringBuffer.append(TEXT_230);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_234);
+								stringBuffer.append(genModel.getNonNLS());
+							}
+						}
+					} else {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_235);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							if (!genFeature.isListType() && !genFeature.isReferenceType()) {
+								stringBuffer.append(TEXT_105);
+								stringBuffer.append(genFeature.getEDefault());
+							}
+							stringBuffer.append(TEXT_236);
+						} else {
+							if (genClass.isFlag(genFeature)) {
+								if (genFeature.isBooleanType()) {
+									stringBuffer.append(TEXT_237);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_238);
+								} else {
+									stringBuffer.append(TEXT_239);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_231);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_232);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_240);
+								}
+							} else {
+								stringBuffer.append(TEXT_239);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_96);
+							}
+						}
+					}
+				}
+			}
+			stringBuffer.append(TEXT_241);
+		}
+		if (isImplementation && genClass.isMapEntry()) {
+			GenFeature keyFeature = genClass.getMapEntryKeyFeature();
+			GenFeature valueFeature = genClass.getMapEntryValueFeature();
+			String objectType = genModel.getImportedName("java.lang.Object");
+			String keyType = isJDK50 ? keyFeature.getObjectType(genClass) : objectType;
+			String valueType = isJDK50 ? valueFeature.getObjectType(genClass) : objectType;
+			String eMapType = genModel.getImportedName("org.eclipse.emf.common.util.EMap")
+					+ (isJDK50 ? "<" + keyType + ", " + valueType + ">" : "");
+			stringBuffer.append(TEXT_71);
+			if (isGWT) {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+			}
+			stringBuffer.append(TEXT_242);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_243);
+			stringBuffer.append(objectType);
+			stringBuffer.append(TEXT_244);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_245);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(keyType);
+			stringBuffer.append(TEXT_246);
+			if (!isJDK50 && keyFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_247);
+				stringBuffer.append(keyFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_248);
+			} else {
+				stringBuffer.append(TEXT_249);
+			}
+			stringBuffer.append(TEXT_66);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_250);
+			stringBuffer.append(keyType);
+			stringBuffer.append(TEXT_251);
+			if (keyFeature.isListType()) {
+				stringBuffer.append(TEXT_252);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+					stringBuffer.append(TEXT_83);
+				}
+				stringBuffer.append(TEXT_253);
+			} else if (isJDK50) {
+				stringBuffer.append(TEXT_254);
+			} else if (keyFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_255);
+				stringBuffer.append(keyFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_256);
+				stringBuffer.append(keyFeature.getPrimitiveValueFunction());
+				stringBuffer.append(TEXT_133);
+			} else {
+				stringBuffer.append(TEXT_257);
+				stringBuffer.append(keyFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_258);
+			}
+			stringBuffer.append(TEXT_66);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_259);
+			if (!isJDK50 && valueFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_247);
+				stringBuffer.append(valueFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_260);
+			} else {
+				stringBuffer.append(TEXT_261);
+			}
+			stringBuffer.append(TEXT_66);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_262);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_263);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_264);
+			if (valueFeature.isListType()) {
+				stringBuffer.append(TEXT_265);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+					stringBuffer.append(TEXT_83);
+				}
+				stringBuffer.append(TEXT_266);
+			} else if (isJDK50) {
+				stringBuffer.append(TEXT_267);
+			} else if (valueFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_268);
+				stringBuffer.append(valueFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_269);
+				stringBuffer.append(valueFeature.getPrimitiveValueFunction());
+				stringBuffer.append(TEXT_133);
+			} else {
+				stringBuffer.append(TEXT_270);
+				stringBuffer.append(valueFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_271);
+			}
+			stringBuffer.append(TEXT_272);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_72);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(eMapType);
+			stringBuffer.append(TEXT_273);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+			stringBuffer.append(TEXT_274);
+			stringBuffer.append(eMapType);
+			stringBuffer.append(TEXT_275);
+		}
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0ug5gGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_276);
+		stringBuffer.append(isInterface ? " " + genClass.getInterfaceName() : genClass.getClassName());
+		// TODO fix the space above
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenClass genClass = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (!genClass.isInterface());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/EnumClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/EnumClass.java
new file mode 100644
index 0000000..a8175a5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/EnumClass.java
@@ -0,0 +1,637 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class EnumClass extends org.eclipse.egf.emf.pattern.base.GenEnumJava {
+	protected static String nl;
+
+	public static synchronized EnumClass create(String lineSeparator) {
+		nl = lineSeparator;
+		EnumClass result = new EnumClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A representation of the literals of the enumeration '<em><b>";
+	protected final String TEXT_5 = "</b></em>'," + NL + " * and utility methods for working with them." + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * <!-- begin-model-doc -->" + NL + " * ";
+	protected final String TEXT_7 = NL + " * <!-- end-model-doc -->";
+	protected final String TEXT_8 = NL + " * @see ";
+	protected final String TEXT_9 = "#get";
+	protected final String TEXT_10 = "()";
+	protected final String TEXT_11 = NL + " * @model ";
+	protected final String TEXT_12 = NL + " *        ";
+	protected final String TEXT_13 = NL + " * @model";
+	protected final String TEXT_14 = NL + " * ";
+	protected final String TEXT_15 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_16 = NL + "@Deprecated";
+	protected final String TEXT_17 = NL + "public ";
+	protected final String TEXT_18 = "enum";
+	protected final String TEXT_19 = "final class";
+	protected final String TEXT_20 = " ";
+	protected final String TEXT_21 = "implements";
+	protected final String TEXT_22 = "extends";
+	protected final String TEXT_23 = NL + "{";
+	protected final String TEXT_24 = NL + "\t;" + NL;
+	protected final String TEXT_25 = NL + "\t/**" + NL + "\t * The '<em><b>";
+	protected final String TEXT_26 = "</b></em>' literal object." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_27 = NL + "\t * <!-- begin-model-doc -->" + NL + "\t * ";
+	protected final String TEXT_28 = NL + "\t * <!-- end-model-doc -->";
+	protected final String TEXT_29 = NL + "\t * @see #";
+	protected final String TEXT_30 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_31 = NL + "\t@Deprecated";
+	protected final String TEXT_32 = NL + "\t";
+	protected final String TEXT_33 = "(";
+	protected final String TEXT_34 = ", \"";
+	protected final String TEXT_35 = "\", ";
+	protected final String TEXT_36 = ")";
+	protected final String TEXT_37 = ",";
+	protected final String TEXT_38 = ";";
+	protected final String TEXT_39 = NL;
+	protected final String TEXT_40 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_41 = " copyright = ";
+	protected final String TEXT_42 = "</b></em>' literal value." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_43 = NL + "\t * @model ";
+	protected final String TEXT_44 = NL + "\t *        ";
+	protected final String TEXT_45 = NL + "\t * @model";
+	protected final String TEXT_46 = NL + "\tpublic static final int ";
+	protected final String TEXT_47 = " = ";
+	protected final String TEXT_48 = "</b></em>' literal object." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_49 = NL + "\t * ";
+	protected final String TEXT_50 = NL + "\tpublic static final ";
+	protected final String TEXT_51 = " = new ";
+	protected final String TEXT_52 = ");";
+	protected final String TEXT_53 = NL + "\t/**" + NL + "\t * An array of all the '<em><b>";
+	protected final String TEXT_54 = "</b></em>' enumerators." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate static final ";
+	protected final String TEXT_55 = "[] VALUES_ARRAY =" + NL + "\t\tnew ";
+	protected final String TEXT_56 = "[]" + NL + "\t\t{";
+	protected final String TEXT_57 = NL + "\t\t\t";
+	protected final String TEXT_58 = NL + "\t\t};" + NL + "" + NL + "\t/**" + NL
+			+ "\t * A public read-only list of all the '<em><b>";
+	protected final String TEXT_59 = "</b></em>' enumerators." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final List";
+	protected final String TEXT_60 = "<";
+	protected final String TEXT_61 = ">";
+	protected final String TEXT_62 = " VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));" + NL + ""
+			+ NL + "\t/**" + NL + "\t * Returns the '<em><b>";
+	protected final String TEXT_63 = "</b></em>' literal with the specified literal value." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param literal the literal." + NL + "\t * @return the matching enumerator or <code>null</code>."
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static ";
+	protected final String TEXT_64 = " get(";
+	protected final String TEXT_65 = " literal)" + NL + "\t{" + NL + "\t\tfor (int i = 0; i < VALUES_ARRAY.length; ++i)"
+			+ NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_66 = " result = VALUES_ARRAY[i];" + NL + "\t\t\tif (result.toString().equals(literal))"
+			+ NL + "\t\t\t{" + NL + "\t\t\t\treturn result;" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\treturn null;"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * Returns the '<em><b>";
+	protected final String TEXT_67 = "</b></em>' literal with the specified name." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @param name the name." + NL
+			+ "\t * @return the matching enumerator or <code>null</code>." + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static ";
+	protected final String TEXT_68 = " getByName(";
+	protected final String TEXT_69 = " name)" + NL + "\t{" + NL + "\t\tfor (int i = 0; i < VALUES_ARRAY.length; ++i)"
+			+ NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_70 = " result = VALUES_ARRAY[i];" + NL + "\t\t\tif (result.getName().equals(name))" + NL
+			+ "\t\t\t{" + NL + "\t\t\t\treturn result;" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\treturn null;" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL + "\t * Returns the '<em><b>";
+	protected final String TEXT_71 = "</b></em>' literal with the specified integer value." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param value the integer value." + NL + "\t * @return the matching enumerator or <code>null</code>."
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static ";
+	protected final String TEXT_72 = " get(int value)" + NL + "\t{" + NL + "\t\tswitch (value)" + NL + "\t\t{";
+	protected final String TEXT_73 = NL + "\t\t\tcase ";
+	protected final String TEXT_74 = ": return ";
+	protected final String TEXT_75 = NL + "\t\t\tdefault: return null;" + NL + "\t\t}";
+	protected final String TEXT_76 = NL + "\t\t}" + NL + "\t\treturn null;";
+	protected final String TEXT_77 = NL + "\t}" + NL;
+	protected final String TEXT_78 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate final int value;"
+			+ NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tprivate final ";
+	protected final String TEXT_79 = " name;" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate final ";
+	protected final String TEXT_80 = " literal;" + NL;
+	protected final String TEXT_81 = NL + "\t/**" + NL + "\t * Only this class can construct instances." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate ";
+	protected final String TEXT_82 = "(int value, ";
+	protected final String TEXT_83 = " name, ";
+	protected final String TEXT_84 = " literal)" + NL + "\t{";
+	protected final String TEXT_85 = NL + "\t\tthis.value = value;" + NL + "\t\tthis.name = name;" + NL
+			+ "\t\tthis.literal = literal;";
+	protected final String TEXT_86 = NL + "\t\tsuper(value, name, literal);";
+	protected final String TEXT_87 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_88 = NL + "\t@Override";
+	protected final String TEXT_89 = NL + "\tpublic int getValue()" + NL + "\t{" + NL + "\t  return value;" + NL + "\t}"
+			+ NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */";
+	protected final String TEXT_90 = NL + "\tpublic ";
+	protected final String TEXT_91 = " getName()" + NL + "\t{" + NL + "\t  return name;" + NL + "\t}" + NL + "" + NL
+			+ "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated"
+			+ NL + "\t */";
+	protected final String TEXT_92 = " getLiteral()" + NL + "\t{" + NL + "\t  return literal;" + NL + "\t}" + NL + ""
+			+ NL + "\t/**" + NL
+			+ "\t * Returns the literal value of the enumerator, which is its string representation." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_93 = " toString()" + NL + "\t{" + NL + "\t\treturn literal;" + NL + "\t}" + NL + "\t";
+	protected final String TEXT_94 = NL + "} //";
+	protected final String TEXT_95 = NL + "/**" + NL
+			+ " * A private implementation interface used to hide the inheritance from Enumerator." + NL
+			+ " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->" + NL + " * @generated" + NL + " */" + NL
+			+ "interface Internal";
+	protected final String TEXT_96 = " extends org.eclipse.emf.common.util.Enumerator" + NL + "{" + NL + "\t// Empty "
+			+ NL + "}";
+	protected final String TEXT_97 = NL + "/**" + NL + " * A private implementation class to construct the instances."
+			+ NL + " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->" + NL + " * @generated" + NL + " */"
+			+ NL + "class Internal";
+	protected final String TEXT_98 = " extends org.eclipse.emf.common.util.AbstractEnumerator" + NL + "{" + NL + "\t/**"
+			+ NL + "\t * Only this class can construct instances." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected Internal";
+	protected final String TEXT_99 = " literal)" + NL + "\t{" + NL + "\t\tsuper(value, name, literal);" + NL + "\t}"
+			+ NL + "}";
+	protected final String TEXT_100 = NL;
+
+	public EnumClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenEnum) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_100);
+		stringBuffer.append(TEXT_100);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenEnum genEnum = parameter;
+		targetPath = genEnum.getGenModel().getModelDirectory();
+		packageName = genEnum.getGenPackage().getInterfacePackageName();
+		className = genEnum.getName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenEnum genEnum = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2019 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+		 */
+
+		GenEnum genEnum = (GenEnum) argument;
+		GenPackage genPackage = genEnum.getGenPackage();
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getInterfacePackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("java.util.Arrays");
+		genModel.addImport("java.util.List");
+		genModel.addImport("java.util.Collections");
+		genModel.markImportLocation(stringBuffer, genPackage);
+		boolean isEnum = genModel.useGenerics();
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genEnum.getFormattedName());
+		stringBuffer.append(TEXT_5);
+		if (genEnum.hasDocumentation()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genEnum.getDocumentation(genModel.getIndentation(stringBuffer)));
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_10);
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genEnum.getModelInfo(), "\n\r"); stringTokenizer
+					.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_12);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_13);
+			}
+		}
+		if (genEnum.hasImplicitAPITags(true)) {
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genEnum.getImplicitAPITags(genModel.getIndentation(stringBuffer), true));
+		}
+		stringBuffer.append(TEXT_15);
+		if (isJDK50 && genEnum.hasImplicitAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_16);
+		}
+		stringBuffer.append(TEXT_17);
+		if (isEnum) {
+			stringBuffer.append(TEXT_18);
+		} else {
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_20);
+		if (isEnum) {
+			stringBuffer.append(TEXT_21);
+		} else {
+			stringBuffer.append(TEXT_22);
+		}
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(
+				genModel.isSuppressEMFMetaData() && !genModel.isSuppressInterfaces() ? "Internal" + genEnum.getName()
+						: genModel.getImportedName(isEnum ? "org.eclipse.emf.common.util.Enumerator"
+								: "org.eclipse.emf.common.util.AbstractEnumerator"));
+		stringBuffer.append(TEXT_23);
+		if (isEnum) {
+			if (genEnum.getGenEnumLiterals().isEmpty()) {
+				stringBuffer.append(TEXT_24);
+			} else {
+				for (Iterator<GenEnumLiteral> l = genEnum.getGenEnumLiterals().iterator(); l.hasNext();) {
+					GenEnumLiteral genEnumLiteral = l.next();
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genEnumLiteral.getFormattedName());
+					stringBuffer.append(TEXT_26);
+					if (genEnumLiteral.hasDocumentation()) {
+						stringBuffer.append(TEXT_27);
+						stringBuffer.append(genEnumLiteral.getDocumentation(genModel.getIndentation(stringBuffer)));
+						stringBuffer.append(TEXT_28);
+					}
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genEnumLiteral.getEnumLiteralValueConstantName());
+					stringBuffer.append(TEXT_30);
+					if (isJDK50 && genEnumLiteral.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_31);
+					}
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genEnumLiteral.getValue());
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genEnumLiteral.getName());
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(Literals.toStringLiteral(genEnumLiteral.getLiteral(), genModel));
+					stringBuffer.append(TEXT_36);
+					if (l.hasNext()) {
+						stringBuffer.append(TEXT_37);
+					} else {
+						stringBuffer.append(TEXT_38);
+					}
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(genModel.getNonNLS(2));
+					stringBuffer.append(TEXT_39);
+				}
+			}
+		}
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_40);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_41);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_38);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_39);
+		}
+		for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genEnumLiteral.getFormattedName());
+			stringBuffer.append(TEXT_42);
+			if (genEnumLiteral.hasDocumentation()) {
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(genEnumLiteral.getDocumentation(genModel.getIndentation(stringBuffer)));
+				stringBuffer.append(TEXT_28);
+			}
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+			if (!genModel.isSuppressEMFModelTags()) {
+				boolean first = true;
+				for (StringTokenizer stringTokenizer = new StringTokenizer(genEnumLiteral.getModelInfo(),
+						"\n\r"); stringTokenizer.hasMoreTokens();) {
+					String modelInfo = stringTokenizer.nextToken();
+					if (first) {
+						first = false;
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(modelInfo);
+					} else {
+						stringBuffer.append(TEXT_44);
+						stringBuffer.append(modelInfo);
+					}
+				}
+				if (first) {
+					stringBuffer.append(TEXT_45);
+				}
+			}
+			stringBuffer.append(TEXT_30);
+			if (isJDK50 && genEnumLiteral.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_31);
+			}
+			stringBuffer.append(TEXT_46);
+			stringBuffer.append(genEnumLiteral.getEnumLiteralValueConstantName());
+			stringBuffer.append(TEXT_47);
+			stringBuffer.append(genEnumLiteral.getValue());
+			stringBuffer.append(TEXT_3);
+		}
+		if (!isEnum)
+			for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genEnumLiteral.getFormattedName());
+				stringBuffer.append(TEXT_48);
+				stringBuffer.append(genEnumLiteral.getEnumLiteralValueConstantName());
+				if (genEnumLiteral.hasAPITags()) {
+					stringBuffer.append(TEXT_49);
+					stringBuffer.append(genEnumLiteral.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_30);
+				if (isJDK50 && genEnumLiteral.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_31);
+				}
+				stringBuffer.append(TEXT_50);
+				stringBuffer.append(genEnum.getName());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(genEnum.getName());
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genEnumLiteral.getEnumLiteralValueConstantName());
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genEnumLiteral.getName());
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(Literals.toStringLiteral(genEnumLiteral.getLiteral(), genModel));
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(TEXT_39);
+			}
+		stringBuffer.append(TEXT_53);
+		stringBuffer.append(genEnum.getFormattedName());
+		stringBuffer.append(TEXT_54);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_55);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_56);
+		for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+			stringBuffer.append(TEXT_57);
+			stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+			stringBuffer.append(TEXT_37);
+		}
+		stringBuffer.append(TEXT_58);
+		stringBuffer.append(genEnum.getFormattedName());
+		stringBuffer.append(TEXT_59);
+		if (isEnum) {
+			stringBuffer.append(TEXT_60);
+			stringBuffer.append(genEnum.getName());
+			stringBuffer.append(TEXT_61);
+		}
+		stringBuffer.append(TEXT_62);
+		stringBuffer.append(genEnum.getFormattedName());
+		stringBuffer.append(TEXT_63);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_64);
+		stringBuffer.append(genModel.getImportedName("java.lang.String"));
+		stringBuffer.append(TEXT_65);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_66);
+		stringBuffer.append(genEnum.getFormattedName());
+		stringBuffer.append(TEXT_67);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_68);
+		stringBuffer.append(genModel.getImportedName("java.lang.String"));
+		stringBuffer.append(TEXT_69);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_70);
+		stringBuffer.append(genEnum.getFormattedName());
+		stringBuffer.append(TEXT_71);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_72);
+		for (GenEnumLiteral genEnumLiteral : genEnum.getUniqueValuedGenEnumLiterals()) {
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genEnumLiteral.getEnumLiteralValueConstantName());
+			stringBuffer.append(TEXT_74);
+			stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+			stringBuffer.append(TEXT_38);
+		}
+		if (forceDefaultCase) { // {
+			stringBuffer.append(TEXT_75);
+		} else { // {
+			stringBuffer.append(TEXT_76);
+		} // }
+		stringBuffer.append(TEXT_77);
+		if (isEnum) {
+			stringBuffer.append(TEXT_78);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_79);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_80);
+		}
+		stringBuffer.append(TEXT_81);
+		stringBuffer.append(genEnum.getName());
+		stringBuffer.append(TEXT_82);
+		stringBuffer.append(genModel.getImportedName("java.lang.String"));
+		stringBuffer.append(TEXT_83);
+		stringBuffer.append(genModel.getImportedName("java.lang.String"));
+		stringBuffer.append(TEXT_84);
+		if (isEnum) {
+			stringBuffer.append(TEXT_85);
+		} else {
+			stringBuffer.append(TEXT_86);
+		}
+		stringBuffer.append(TEXT_77);
+		if (isEnum) {
+			stringBuffer.append(TEXT_87);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_88);
+			}
+			stringBuffer.append(TEXT_89);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_88);
+			}
+			stringBuffer.append(TEXT_90);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_91);
+			if (genModel.useInterfaceOverrideAnnotation()) {
+				stringBuffer.append(TEXT_88);
+			}
+			stringBuffer.append(TEXT_90);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_92);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_88);
+			}
+			stringBuffer.append(TEXT_90);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_93);
+		}
+		stringBuffer.append(TEXT_94);
+		stringBuffer.append(genEnum.getName());
+		if (genModel.isSuppressEMFMetaData() && !genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_39);
+			if (isEnum) {
+				stringBuffer.append(TEXT_95);
+				stringBuffer.append(genEnum.getName());
+				stringBuffer.append(TEXT_96);
+			} else {
+				stringBuffer.append(TEXT_97);
+				stringBuffer.append(genEnum.getName());
+				stringBuffer.append(TEXT_98);
+				stringBuffer.append(genEnum.getName());
+				stringBuffer.append(TEXT_82);
+				stringBuffer.append(genModel.getImportedName("java.lang.String"));
+				stringBuffer.append(TEXT_83);
+				stringBuffer.append(genModel.getImportedName("java.lang.String"));
+				stringBuffer.append(TEXT_99);
+			}
+		}
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_39);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenEnum genEnum = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/FactoryClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/FactoryClass.java
new file mode 100644
index 0000000..afdf87e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/FactoryClass.java
@@ -0,0 +1,1696 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class FactoryClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized FactoryClass create(String lineSeparator) {
+		nl = lineSeparator;
+		FactoryClass result = new FactoryClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Factory</b> for the model." + NL
+			+ " * It provides a create method for each non-abstract class of the model." + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * @see ";
+	protected final String TEXT_7 = NL + " * ";
+	protected final String TEXT_8 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_9 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * An implementation of the model <b>Factory</b>." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_10 = NL + "@Deprecated";
+	protected final String TEXT_11 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_12 = NL + "public class ";
+	protected final String TEXT_13 = " extends ";
+	protected final String TEXT_14 = " implements ";
+	protected final String TEXT_15 = NL + "public interface ";
+	protected final String TEXT_16 = NL + "{";
+	protected final String TEXT_17 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_18 = " copyright = ";
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * The singleton instance of the factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_20 = " eINSTANCE = init();" + NL;
+	protected final String TEXT_21 = " INSTANCE = ";
+	protected final String TEXT_22 = ".eINSTANCE;" + NL;
+	protected final String TEXT_23 = " eINSTANCE = ";
+	protected final String TEXT_24 = ".init();" + NL;
+	protected final String TEXT_25 = NL + "\t/**" + NL + "\t * Creates the default factory implementation." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_26 = NL + "\tpublic static ";
+	protected final String TEXT_27 = " init()" + NL + "\t{" + NL + "\t\ttry" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_28 = " the";
+	protected final String TEXT_29 = " = (";
+	protected final String TEXT_30 = ")";
+	protected final String TEXT_31 = ".Registry.INSTANCE.getEFactory(";
+	protected final String TEXT_32 = ".eNS_URI);" + NL + "\t\t\tif (the";
+	protected final String TEXT_33 = " != null)" + NL + "\t\t\t{" + NL + "\t\t\t\treturn the";
+	protected final String TEXT_34 = ";" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\tcatch (Exception exception)" + NL
+			+ "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_35 = ".INSTANCE.log(exception);" + NL + "\t\t}" + NL + "\t\treturn new ";
+	protected final String TEXT_36 = "();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates an instance of the factory." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_37 = "()" + NL + "\t{" + NL + "\t\tsuper();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_38 = NL + "\t@Override";
+	protected final String TEXT_39 = NL + "\tpublic EObject create(EClass eClass)" + NL + "\t{" + NL
+			+ "\t\tswitch (eClass.getClassifierID())" + NL + "\t\t{";
+	protected final String TEXT_40 = NL + "\t\t\tcase ";
+	protected final String TEXT_41 = ".";
+	protected final String TEXT_42 = ": return ";
+	protected final String TEXT_43 = "create";
+	protected final String TEXT_44 = "();";
+	protected final String TEXT_45 = NL + "\t\t\tdefault:" + NL
+			+ "\t\t\t\tthrow new IllegalArgumentException(\"The class '\" + eClass.getName() + \"' is not a valid classifier\");";
+	protected final String TEXT_46 = NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_47 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_48 = NL + "\tpublic Object createFromString(";
+	protected final String TEXT_49 = " eDataType, String initialValue)" + NL + "\t{" + NL
+			+ "\t\tswitch (eDataType.getClassifierID())" + NL + "\t\t{";
+	protected final String TEXT_50 = ":" + NL + "\t\t\t\treturn create";
+	protected final String TEXT_51 = "FromString(eDataType, initialValue);";
+	protected final String TEXT_52 = NL + "\t\t\tdefault:" + NL
+			+ "\t\t\t\tthrow new IllegalArgumentException(\"The datatype '\" + eDataType.getName() + \"' is not a valid classifier\");";
+	protected final String TEXT_53 = NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_54 = NL + "\tpublic String convertToString(";
+	protected final String TEXT_55 = " eDataType, Object instanceValue)" + NL + "\t{" + NL
+			+ "\t\tswitch (eDataType.getClassifierID())" + NL + "\t\t{";
+	protected final String TEXT_56 = ":" + NL + "\t\t\t\treturn convert";
+	protected final String TEXT_57 = "ToString(eDataType, instanceValue);";
+	protected final String TEXT_58 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_59 = NL + "\t * ";
+	protected final String TEXT_60 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_61 = NL + "\t@Deprecated";
+	protected final String TEXT_62 = NL + "\tpublic ";
+	protected final String TEXT_63 = " create";
+	protected final String TEXT_64 = "()" + NL + "\t{";
+	protected final String TEXT_65 = NL + "\t\t";
+	protected final String TEXT_66 = " ";
+	protected final String TEXT_67 = " = ";
+	protected final String TEXT_68 = "super.create(";
+	protected final String TEXT_69 = ");";
+	protected final String TEXT_70 = " = new ";
+	protected final String TEXT_71 = "()";
+	protected final String TEXT_72 = "{}";
+	protected final String TEXT_73 = NL + "\t\treturn ";
+	protected final String TEXT_74 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_75 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_76 = "(";
+	protected final String TEXT_77 = "final ";
+	protected final String TEXT_78 = "String ";
+	protected final String TEXT_79 = "it";
+	protected final String TEXT_80 = "literal";
+	protected final String TEXT_81 = ")" + NL + "\t{";
+	protected final String TEXT_82 = " result = ";
+	protected final String TEXT_83 = ".get(literal);" + NL
+			+ "\t\tif (result == null) throw new IllegalArgumentException(\"The value '\" + literal + \"' is not a valid enumerator of '\" + ";
+	protected final String TEXT_84 = ".getName() + \"'\");";
+	protected final String TEXT_85 = NL + "\t\treturn result;";
+	protected final String TEXT_86 = NL + "\t\treturn new ";
+	protected final String TEXT_87 = "(create";
+	protected final String TEXT_88 = "(literal));";
+	protected final String TEXT_89 = NL + "\t\treturn create";
+	protected final String TEXT_90 = "(literal);";
+	protected final String TEXT_91 = ".create";
+	protected final String TEXT_92 = ".createFromString(";
+	protected final String TEXT_93 = ", literal);";
+	protected final String TEXT_94 = NL + "\t\tif (literal == null) return null;" + NL + "\t\t";
+	protected final String TEXT_95 = " result = new ";
+	protected final String TEXT_96 = "<";
+	protected final String TEXT_97 = ">";
+	protected final String TEXT_98 = NL + "\t\tfor (";
+	protected final String TEXT_99 = " stringTokenizer = new ";
+	protected final String TEXT_100 = "(literal); stringTokenizer.hasMoreTokens(); )";
+	protected final String TEXT_101 = NL + "\t\tfor (String item : split(literal))";
+	protected final String TEXT_102 = NL + "\t\t{";
+	protected final String TEXT_103 = NL + "\t\t\tString item = stringTokenizer.nextToken();";
+	protected final String TEXT_104 = NL + "\t\t\tresult.add(create";
+	protected final String TEXT_105 = "(item));";
+	protected final String TEXT_106 = "FromString(";
+	protected final String TEXT_107 = ", item));";
+	protected final String TEXT_108 = NL + "\t\t\tresult.add(";
+	protected final String TEXT_109 = NL + "\t\t}" + NL + "\t\treturn result;";
+	protected final String TEXT_110 = NL + "\t\tif (literal == null) return ";
+	protected final String TEXT_111 = ";" + NL + "\t\t";
+	protected final String TEXT_112 = ";" + NL + "\t\tRuntimeException exception = null;";
+	protected final String TEXT_113 = NL + "\t\ttry" + NL + "\t\t{";
+	protected final String TEXT_114 = NL + "\t\t\tresult = create";
+	protected final String TEXT_115 = NL + "\t\t\tresult = (";
+	protected final String TEXT_116 = ")create";
+	protected final String TEXT_117 = NL + "\t\t\tresult = ";
+	protected final String TEXT_118 = NL + "\t\t\tif (";
+	protected final String TEXT_119 = "result != null && ";
+	protected final String TEXT_120 = ".INSTANCE.validate(";
+	protected final String TEXT_121 = ", ";
+	protected final String TEXT_122 = "new ";
+	protected final String TEXT_123 = "(result)";
+	protected final String TEXT_124 = "result";
+	protected final String TEXT_125 = ", null, null))" + NL + "\t\t\t{" + NL + "\t\t\t\treturn result;" + NL + "\t\t\t}"
+			+ NL + "\t\t}" + NL + "\t\tcatch (RuntimeException e)" + NL + "\t\t{" + NL + "\t\t\texception = e;" + NL
+			+ "\t\t}";
+	protected final String TEXT_126 = NL + "\t\tif (";
+	protected final String TEXT_127 = "result != null || ";
+	protected final String TEXT_128 = "exception == null) return result;" + NL + "    " + NL + "\t\tthrow exception;";
+	protected final String TEXT_129 = NL + "\t\treturn (";
+	protected final String TEXT_130 = ")super.createFromString(literal);";
+	protected final String TEXT_131 = NL + "\t\t// TODO: implement this method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tthrow new ";
+	protected final String TEXT_132 = NL + "\t\treturn ((";
+	protected final String TEXT_133 = ")super.createFromString(";
+	protected final String TEXT_134 = ", literal)).";
+	protected final String TEXT_135 = "super.createFromString(";
+	protected final String TEXT_136 = NL + "\t}" + NL;
+	protected final String TEXT_137 = " eDataType, String initialValue)" + NL + "\t{";
+	protected final String TEXT_138 = "(initialValue);";
+	protected final String TEXT_139 = ".get(initialValue);" + NL
+			+ "\t\tif (result == null) throw new IllegalArgumentException(\"The value '\" + initialValue + \"' is not a valid enumerator of '\" + eDataType.getName() + \"'\");";
+	protected final String TEXT_140 = ", initialValue);";
+	protected final String TEXT_141 = NL + "\t\tif (initialValue == null) return null;" + NL + "\t\t";
+	protected final String TEXT_142 = "(initialValue); stringTokenizer.hasMoreTokens(); )";
+	protected final String TEXT_143 = NL + "\t\tfor (String item : split(initialValue))";
+	protected final String TEXT_144 = "(initialValue));";
+	protected final String TEXT_145 = " result = null;" + NL + "\t\tRuntimeException exception = null;";
+	protected final String TEXT_146 = NL + "\t\t\tif (result != null && ";
+	protected final String TEXT_147 = ".INSTANCE.validate(eDataType, result, null, null))" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\treturn result;" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\tcatch (RuntimeException e)" + NL
+			+ "\t\t{" + NL + "\t\t\texception = e;" + NL + "\t\t}";
+	protected final String TEXT_148 = NL + "\t\tif (result != null || exception == null) return result;" + NL + "    "
+			+ NL + "\t\tthrow exception;";
+	protected final String TEXT_149 = "super.createFromString(initialValue);";
+	protected final String TEXT_150 = "super.createFromString(eDataType, initialValue);";
+	protected final String TEXT_151 = NL + "\tpublic String convert";
+	protected final String TEXT_152 = "instanceValue";
+	protected final String TEXT_153 = NL + "\t\treturn instanceValue == null ? null : instanceValue.toString();";
+	protected final String TEXT_154 = NL + "\t\treturn instanceValue == null ? null : convert";
+	protected final String TEXT_155 = "(instanceValue";
+	protected final String TEXT_156 = NL + "\t\treturn convert";
+	protected final String TEXT_157 = "(instanceValue);";
+	protected final String TEXT_158 = ".convert";
+	protected final String TEXT_159 = ".convertToString(";
+	protected final String TEXT_160 = ", instanceValue);";
+	protected final String TEXT_161 = NL + "\t\tif (instanceValue == null) return null;" + NL
+			+ "\t\tif (instanceValue.isEmpty()) return \"\";" + NL + "\t\t";
+	protected final String TEXT_162 = " i = instanceValue.iterator(); i.hasNext(); )";
+	protected final String TEXT_163 = " item : instanceValue)";
+	protected final String TEXT_164 = NL + "\t\t\tresult.append(convert";
+	protected final String TEXT_165 = "((";
+	protected final String TEXT_166 = "));";
+	protected final String TEXT_167 = "ToString(";
+	protected final String TEXT_168 = NL + "\t\t\tresult.append(";
+	protected final String TEXT_169 = NL + "\t\t\tresult.append(' ');" + NL + "\t\t}" + NL
+			+ "\t\treturn result.substring(0, result.length() - 1);";
+	protected final String TEXT_170 = NL + "\t\tif (instanceValue == null) return null;";
+	protected final String TEXT_171 = ".isInstance(instanceValue))" + NL + "\t\t{" + NL + "\t\t\ttry" + NL + "\t\t\t{";
+	protected final String TEXT_172 = NL + "\t\t\t\tString value = convert";
+	protected final String TEXT_173 = "(((";
+	protected final String TEXT_174 = ")instanceValue).";
+	protected final String TEXT_175 = "());";
+	protected final String TEXT_176 = ")instanceValue);";
+	protected final String TEXT_177 = NL + "\t\t\t\tString value = ";
+	protected final String TEXT_178 = NL + "\t\t\t\tif (value != null) return value;" + NL + "\t\t\t}" + NL
+			+ "\t\t\tcatch (Exception e)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Keep trying other member types until all have failed." + NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_179 = NL + "\t\t\tString value = convert";
+	protected final String TEXT_180 = "(instanceValue)";
+	protected final String TEXT_181 = NL + "\t\t\tString value = ";
+	protected final String TEXT_182 = NL + "\t\t\tif (value != null) return value;" + NL + "\t\t}" + NL
+			+ "\t\tcatch (Exception e)" + NL + "\t\t{" + NL
+			+ "\t\t\t// Keep trying other member types until all have failed." + NL + "\t\t}";
+	protected final String TEXT_183 = NL
+			+ "\t\tthrow new IllegalArgumentException(\"Invalid value: '\"+instanceValue+\"' for datatype :\"+";
+	protected final String TEXT_184 = ".getName());";
+	protected final String TEXT_185 = NL + "\t\treturn super.convertToString(instanceValue);";
+	protected final String TEXT_186 = NL + "\t\treturn super.convertToString(";
+	protected final String TEXT_187 = ", new ";
+	protected final String TEXT_188 = "(instanceValue));";
+	protected final String TEXT_189 = " eDataType, Object instanceValue)" + NL + "\t{";
+	protected final String TEXT_190 = NL + "\t\tif (instanceValue == null) return null;" + NL + "\t\t";
+	protected final String TEXT_191 = " list = (";
+	protected final String TEXT_192 = ")instanceValue;" + NL + "\t\tif (list.isEmpty()) return \"\";" + NL + "\t\t";
+	protected final String TEXT_193 = " i = list.iterator(); i.hasNext(); )";
+	protected final String TEXT_194 = " item : list)";
+	protected final String TEXT_195 = ")instanceValue)";
+	protected final String TEXT_196 = NL
+			+ "\t\tthrow new IllegalArgumentException(\"Invalid value: '\"+instanceValue+\"' for datatype :\"+eDataType.getName());";
+	protected final String TEXT_197 = ")instanceValue";
+	protected final String TEXT_198 = ").";
+	protected final String TEXT_199 = NL + "\t\treturn super.convertToString(eDataType, instanceValue);";
+	protected final String TEXT_200 = NL + "\t/**" + NL + "\t * Returns a new object of class '<em>";
+	protected final String TEXT_201 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return a new object of class '<em>";
+	protected final String TEXT_202 = "</em>'.";
+	protected final String TEXT_203 = NL + "\t";
+	protected final String TEXT_204 = "();" + NL;
+	protected final String TEXT_205 = NL + "\t/**" + NL + "\t * Returns an instance of data type '<em>";
+	protected final String TEXT_206 = "</em>' corresponding the given literal." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @param literal a literal of the data type." + NL
+			+ "\t * @return a new instance value of the data type.";
+	protected final String TEXT_207 = "(String literal);" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns a literal representation of an instance of data type '<em>";
+	protected final String TEXT_208 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @param instanceValue an instance value of the data type." + NL
+			+ "\t * @return a literal representation of the instance value.";
+	protected final String TEXT_209 = NL + "\tString convert";
+	protected final String TEXT_210 = " instanceValue);" + NL;
+	protected final String TEXT_211 = NL + "\t/**" + NL + "\t * Returns the package supported by this factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the package supported by this factory." + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_212 = " get";
+	protected final String TEXT_213 = "()" + NL + "\t{" + NL + "\t\treturn (";
+	protected final String TEXT_214 = ")getEPackage();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @deprecated" + NL
+			+ "\t * @generated" + NL + "\t */";
+	protected final String TEXT_215 = " getPackage()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_216 = ".eINSTANCE;" + NL + "\t}" + NL;
+	protected final String TEXT_217 = NL + "} //";
+	protected final String TEXT_218 = NL;
+
+	public FactoryClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_218);
+		stringBuffer.append(TEXT_218);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getReflectionClassPackageName();
+		className = genPackage.getFactoryClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = ((Object[]) new Object[] { new Object[] { genPackage,
+				genPackage.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE, Boolean.TRUE } })[0];
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) ((Object[]) argument)[0];
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
+		boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
+		boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation()
+				&& !(isInterface && isImplementation);
+		String publicStaticFinalFlag = isImplementation ? "public static final " : "";
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (isInterface || genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getReflectionPackageName());
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getClassPackageName());
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		if (isImplementation) {
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");
+			genModel.addImport("org.eclipse.emf.ecore.EClass");
+			genModel.addImport("org.eclipse.emf.ecore.EObject");
+			if (!genPackage.hasJavaLangConflict() && !genPackage.hasInterfaceImplConflict()
+					&& !genPackage.getClassPackageName().equals(genPackage.getInterfacePackageName()))
+				genModel.addImport(genPackage.getInterfacePackageName() + ".*");
+		}
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		if (isInterface) {
+			stringBuffer.append(TEXT_5);
+			if (!genModel.isSuppressEMFMetaData()) {
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			}
+			if (genPackage.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_8);
+		} else {
+			stringBuffer.append(TEXT_9);
+			if (genPackage.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_8);
+		}
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_10);
+		}
+		if (isImplementation) {
+			if (isJDK50 && !genPackage.hasAPIDeprecatedTag()) {
+				List<GenClassifier> genClassifiers = new ArrayList<GenClassifier>(genPackage.getGenClassifiers());
+				for (Iterator<GenClassifier> i = genClassifiers.iterator(); i.hasNext();) {
+					GenClassifier genClassifier = i.next();
+					if (genClassifier instanceof GenClass && ((GenClass) genClassifier).isAbstract())
+						i.remove();
+				}
+				if (GenModelUtil.hasAPIDeprecatedTag(genClassifiers)) {
+					stringBuffer.append(TEXT_11);
+				}
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genPackage.getFactoryClassName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EFactoryImpl"));
+			if (!genModel.isSuppressInterfaces()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
+			}
+		} else {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			if (!genModel.isSuppressEMFMetaData()) {
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EFactory"));
+			}
+		}
+		stringBuffer.append(TEXT_16);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isImplementation && (genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces())) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getFactoryClassName());
+			stringBuffer.append(TEXT_20);
+		}
+		if (isInterface && genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genPackage.getQualifiedFactoryClassName());
+			stringBuffer.append(TEXT_22);
+		} else if (isInterface && !genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genPackage.getQualifiedFactoryClassName());
+			stringBuffer.append(TEXT_24);
+		}
+		if (isImplementation) {
+			stringBuffer.append(TEXT_25);
+			String factoryType = genModel.isSuppressEMFMetaData() ? genPackage.getFactoryClassName()
+					: genPackage.getImportedFactoryInterfaceName();
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(factoryType);
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(factoryType);
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(factoryType);
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(genPackage.getImportedFactoryClassName());
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genPackage.getFactoryClassName());
+			stringBuffer.append(TEXT_37);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_39);
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (!genClass.isAbstract()) {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(genClass.getClassifierID());
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(!genClass.isEObjectExtension() ? "(EObject)" : "");
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_44);
+				}
+			}
+			stringBuffer.append(TEXT_45);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_46);
+			if (!genPackage.getAllGenDataTypes().isEmpty()) {
+				stringBuffer.append(TEXT_47);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_38);
+				}
+				stringBuffer.append(TEXT_48);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+				stringBuffer.append(TEXT_49);
+				for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+					if (genDataType.isSerializable()) {
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genDataType.getClassifierID());
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_51);
+					}
+				}
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(TEXT_53);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_38);
+				}
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+				stringBuffer.append(TEXT_55);
+				for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+					if (genDataType.isSerializable()) {
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genDataType.getClassifierID());
+						stringBuffer.append(TEXT_56);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_57);
+					}
+				}
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(TEXT_46);
+			}
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (!genClass.isAbstract()) {
+					stringBuffer.append(TEXT_58);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()) {
+						stringBuffer.append(TEXT_38);
+					}
+					stringBuffer.append(TEXT_62);
+					stringBuffer.append(genClass.getTypeParameters());
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceTypeArguments());
+					stringBuffer.append(TEXT_63);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_64);
+					if (genClass.isDynamic()) {
+						stringBuffer.append(TEXT_65);
+						stringBuffer.append(genClass.getImportedInterfaceName());
+						stringBuffer.append(genClass.getInterfaceTypeArguments());
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_67);
+						stringBuffer.append(genClass.getCastFromEObject());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_69);
+					} else {
+						stringBuffer.append(TEXT_65);
+						stringBuffer.append(genClass.getImportedClassName());
+						stringBuffer.append(genClass.getClassTypeArguments());
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_70);
+						stringBuffer.append(genClass.getImportedClassName());
+						stringBuffer.append(genClass.getClassTypeArguments());
+						stringBuffer.append(TEXT_71);
+						if (genModel.isSuppressInterfaces() && !genPackage.getReflectionPackageName()
+								.equals(genPackage.getInterfacePackageName())) {
+							stringBuffer.append(TEXT_72);
+						}
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_73);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_74);
+				}
+			}
+			for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+				if (genDataType.isSerializable()) {
+					if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+						String eDataType = genDataType.getQualifiedClassifierAccessor();
+						stringBuffer.append(TEXT_58);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (genModel.useGenerics() && genDataType.isUncheckedCast() && !genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_75);
+						}
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {
+							stringBuffer.append(TEXT_38);
+						}
+						stringBuffer.append(TEXT_62);
+						stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_76);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_77);
+						}
+						stringBuffer.append(TEXT_78);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_79);
+						} else {
+							stringBuffer.append(TEXT_80);
+						}
+						stringBuffer.append(TEXT_81);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genDataType.getCreatorBody(genModel.getIndentation(stringBuffer)));
+						} else if (genDataType instanceof GenEnum) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_84);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(genModel.getNonNLS(2));
+							stringBuffer.append(genModel.getNonNLS(3));
+							stringBuffer.append(TEXT_85);
+						} else if (genDataType.getBaseType() != null) {
+							GenDataType genBaseType = genDataType.getBaseType();
+							boolean isPrimitiveConversion = !genDataType.isPrimitiveType()
+									&& genBaseType.isPrimitiveType();
+							if (genBaseType.getGenPackage() == genPackage) {
+								if (isPrimitiveConversion && !isJDK50) {
+									stringBuffer.append(TEXT_86);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_87);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_88);
+								} else {
+									stringBuffer.append(TEXT_89);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_90);
+								}
+							} else if (genBaseType.getGenPackage().isDataTypeConverters()) {
+								if (isPrimitiveConversion && !isJDK50) {
+									stringBuffer.append(TEXT_86);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_76);
+									stringBuffer.append(
+											genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_88);
+								} else {
+									stringBuffer.append(TEXT_73);
+									stringBuffer.append(
+											genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_90);
+								}
+							} else {
+								stringBuffer.append(TEXT_73);
+								if (!genDataType.isObjectType()) {
+									stringBuffer.append(TEXT_76);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+								}
+								stringBuffer.append(
+										genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_93);
+							}
+						} else if (genDataType.getItemType() != null) {
+							GenDataType genItemType = genDataType.getItemType();
+							stringBuffer.append(TEXT_94);
+							stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("java.util.ArrayList"));
+							if (genModel.useGenerics()) {
+								stringBuffer.append(TEXT_96);
+								stringBuffer.append(
+										genItemType.getObjectType().getImportedParameterizedInstanceClassName());
+								stringBuffer.append(TEXT_97);
+							}
+							stringBuffer.append(TEXT_44);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_100);
+							} else {
+								stringBuffer.append(TEXT_101);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_103);
+							}
+							if (genItemType.getGenPackage() == genPackage) {
+								if (genPackage.isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_104);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_105);
+								} else {
+									stringBuffer.append(TEXT_104);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_106);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_107);
+								}
+							} else {
+								if (genItemType.getGenPackage().isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_108);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_105);
+								} else {
+									stringBuffer.append(TEXT_108);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_92);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_107);
+								}
+							}
+							stringBuffer.append(TEXT_109);
+						} else if (!genDataType.getMemberTypes().isEmpty()) {
+							stringBuffer.append(TEXT_110);
+							stringBuffer.append(genDataType.getStaticValue(null));
+							stringBuffer.append(TEXT_111);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(genDataType.getStaticValue(null));
+							stringBuffer.append(TEXT_112);
+							for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+								stringBuffer.append(TEXT_113);
+								if (genMemberType.getGenPackage() == genPackage) {
+									if (genPackage.isDataTypeConverters()) {
+										if (!genDataType.isPrimitiveType())
+											genMemberType = genMemberType.getObjectType();
+										stringBuffer.append(TEXT_114);
+										stringBuffer.append(genMemberType.getName());
+										stringBuffer.append(TEXT_90);
+									} else {
+										stringBuffer.append(TEXT_115);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_116);
+										stringBuffer.append(genMemberType.getName());
+										stringBuffer.append(TEXT_106);
+										stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+										stringBuffer.append(TEXT_93);
+									}
+								} else {
+									if (genPackage.isDataTypeConverters()) {
+										if (!genDataType.isPrimitiveType())
+											genMemberType = genMemberType.getObjectType();
+										stringBuffer.append(TEXT_117);
+										stringBuffer.append(genMemberType.getGenPackage()
+												.getQualifiedEFactoryInternalInstanceAccessor());
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(genMemberType.getName());
+										stringBuffer.append(TEXT_90);
+									} else {
+										stringBuffer.append(TEXT_115);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_30);
+										stringBuffer.append(genMemberType.getGenPackage()
+												.getQualifiedEFactoryInternalInstanceAccessor());
+										stringBuffer.append(TEXT_92);
+										stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+										stringBuffer.append(TEXT_93);
+									}
+								}
+								stringBuffer.append(TEXT_118);
+								if (!genDataType.isPrimitiveType()) {
+									stringBuffer.append(TEXT_119);
+								}
+								stringBuffer
+										.append(genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician"));
+								stringBuffer.append(TEXT_120);
+								stringBuffer.append(eDataType);
+								stringBuffer.append(TEXT_121);
+								if (genDataType.isPrimitiveType() && !isJDK50) {
+									stringBuffer.append(TEXT_122);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_123);
+								} else {
+									stringBuffer.append(TEXT_124);
+								}
+								stringBuffer.append(TEXT_125);
+							}
+							stringBuffer.append(TEXT_126);
+							if (!genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_127);
+							}
+							stringBuffer.append(TEXT_128);
+						} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+								&& (genDataType.isArrayType()
+										|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+										|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+							stringBuffer.append(TEXT_129);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_130);
+						} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+							stringBuffer.append(TEXT_131);
+							stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+							stringBuffer.append(TEXT_44);
+						} else if (genDataType.isPrimitiveType() && !isJDK50) {
+							stringBuffer.append(TEXT_132);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_133);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_134);
+							stringBuffer.append(genDataType.getPrimitiveValueFunction());
+							stringBuffer.append(TEXT_44);
+						} else {
+							stringBuffer.append(TEXT_73);
+							if (!genDataType.isObjectType()) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+								stringBuffer.append(TEXT_30);
+							}
+							stringBuffer.append(TEXT_135);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_93);
+						}
+						stringBuffer.append(TEXT_136);
+					}
+					stringBuffer.append(TEXT_58);
+					if (genDataType.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (!genPackage.isDataTypeConverters() && genModel.useGenerics() && genDataType.isUncheckedCast()
+							&& !genDataType.hasCreatorBody()) {
+						stringBuffer.append(TEXT_75);
+					}
+					if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					stringBuffer.append(TEXT_62);
+					stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+					stringBuffer.append(TEXT_63);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_106);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+					stringBuffer.append(TEXT_137);
+					if (genDataType instanceof GenEnum) {
+						if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_138);
+						} else {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(((GenEnum) genDataType).getImportedInstanceClassName());
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(((GenEnum) genDataType).getImportedInstanceClassName());
+							stringBuffer.append(TEXT_139);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(genModel.getNonNLS(2));
+							stringBuffer.append(genModel.getNonNLS(3));
+							stringBuffer.append(TEXT_85);
+						}
+					} else if (genDataType.getBaseType() != null) {
+						GenDataType genBaseType = genDataType.getBaseType();
+						if (genBaseType.getGenPackage() == genPackage) {
+							stringBuffer.append(TEXT_73);
+							if (!genDataType.getObjectInstanceClassName()
+									.equals(genBaseType.getObjectInstanceClassName())) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_30);
+							}
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(genBaseType.getName());
+							stringBuffer.append(TEXT_106);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_140);
+						} else {
+							stringBuffer.append(TEXT_73);
+							if (!genDataType.isObjectType()) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_30);
+							}
+							stringBuffer
+									.append(genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+							stringBuffer.append(TEXT_92);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_140);
+						}
+					} else if (genDataType.getItemType() != null) {
+						GenDataType genItemType = genDataType.getItemType();
+						if (genPackage.isDataTypeConverters()) {
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_138);
+						} else {
+							stringBuffer.append(TEXT_141);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("java.util.ArrayList"));
+							if (genModel.useGenerics()) {
+								stringBuffer.append(TEXT_96);
+								stringBuffer.append(
+										genItemType.getObjectType().getImportedParameterizedInstanceClassName());
+								stringBuffer.append(TEXT_97);
+							}
+							stringBuffer.append(TEXT_44);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_142);
+							} else {
+								stringBuffer.append(TEXT_143);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_103);
+							}
+							if (genItemType.getGenPackage() == genPackage) {
+								stringBuffer.append(TEXT_104);
+								stringBuffer.append(genItemType.getName());
+								stringBuffer.append(TEXT_106);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_107);
+							} else {
+								stringBuffer.append(TEXT_108);
+								if (!genItemType.isObjectType()) {
+									stringBuffer.append(TEXT_76);
+									stringBuffer.append(genItemType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+								}
+								stringBuffer.append(
+										genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_107);
+							}
+							stringBuffer.append(TEXT_109);
+						}
+					} else if (!genDataType.getMemberTypes().isEmpty()) {
+						if (genPackage.isDataTypeConverters()) {
+							if (genDataType.isPrimitiveType() && !isJDK50) {
+								stringBuffer.append(TEXT_86);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_87);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_144);
+							} else {
+								stringBuffer.append(TEXT_89);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_138);
+							}
+						} else {
+							stringBuffer.append(TEXT_141);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_145);
+							for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+								stringBuffer.append(TEXT_113);
+								if (genMemberType.getGenPackage() == genPackage) {
+									stringBuffer.append(TEXT_117);
+									if (!genDataType.isObjectType() && !genDataType.getObjectInstanceClassName()
+											.equals(genMemberType.getObjectInstanceClassName())) {
+										stringBuffer.append(TEXT_76);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_30);
+									}
+									stringBuffer.append(TEXT_43);
+									stringBuffer.append(genMemberType.getName());
+									stringBuffer.append(TEXT_106);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_140);
+								} else {
+									stringBuffer.append(TEXT_117);
+									if (!genDataType.isObjectType()) {
+										stringBuffer.append(TEXT_76);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_30);
+									}
+									stringBuffer.append(genMemberType.getGenPackage()
+											.getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_92);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_140);
+								}
+								stringBuffer.append(TEXT_146);
+								stringBuffer
+										.append(genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician"));
+								stringBuffer.append(TEXT_147);
+							}
+							stringBuffer.append(TEXT_148);
+						}
+					} else if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+						stringBuffer.append(TEXT_89);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_138);
+					} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+							&& (genDataType.isArrayType()
+									|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+									|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+						stringBuffer.append(TEXT_73);
+						if (!genDataType.isObjectType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_30);
+						}
+						stringBuffer.append(TEXT_149);
+					} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_131);
+						stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_73);
+						if (!genDataType.isObjectType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_30);
+						}
+						stringBuffer.append(TEXT_150);
+					}
+					stringBuffer.append(TEXT_136);
+					if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+						String eDataType = genDataType.getQualifiedClassifierAccessor();
+						stringBuffer.append(TEXT_58);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {
+							stringBuffer.append(TEXT_38);
+						}
+						stringBuffer.append(TEXT_151);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_76);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_77);
+						}
+						stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+						stringBuffer.append(TEXT_66);
+						if (genDataType.hasConverterBody()) {
+							stringBuffer.append(TEXT_79);
+						} else {
+							stringBuffer.append(TEXT_152);
+						}
+						stringBuffer.append(TEXT_81);
+						if (genDataType.hasConverterBody()) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genDataType.getConverterBody(genModel.getIndentation(stringBuffer)));
+						} else if (genDataType instanceof GenEnum) {
+							stringBuffer.append(TEXT_153);
+						} else if (genDataType.getBaseType() != null) {
+							GenDataType genBaseType = genDataType.getBaseType();
+							boolean isPrimitiveConversion = !genDataType.isPrimitiveType()
+									&& genBaseType.isPrimitiveType();
+							if (genBaseType.getGenPackage() == genPackage) {
+								if (isPrimitiveConversion) {
+									stringBuffer.append(TEXT_154);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_155);
+									if (!isJDK50) {
+										stringBuffer.append(TEXT_41);
+										stringBuffer.append(genBaseType.getPrimitiveValueFunction());
+										stringBuffer.append(TEXT_71);
+									}
+									stringBuffer.append(TEXT_69);
+								} else {
+									stringBuffer.append(TEXT_156);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_157);
+								}
+							} else if (genBaseType.getGenPackage().isDataTypeConverters()) {
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genBaseType.getGenPackage().getQualifiedFactoryInstanceAccessor());
+								stringBuffer.append(TEXT_158);
+								stringBuffer.append(genBaseType.getName());
+								stringBuffer.append(TEXT_157);
+							} else {
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(
+										genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_159);
+								stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_160);
+							}
+						} else if (genDataType.getItemType() != null) {
+							GenDataType genItemType = genDataType.getItemType();
+							stringBuffer.append(TEXT_161);
+							stringBuffer.append(genModel.getImportedName(
+									genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName(
+									genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_44);
+							String item;
+							if (!genModel.useGenerics()) {
+								item = "i.next()";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+								stringBuffer.append(TEXT_162);
+							} else {
+								item = "item";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+								stringBuffer.append(TEXT_163);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genItemType.getGenPackage() == genPackage) {
+								if (genPackage.isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_164);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_165);
+									stringBuffer.append(genItemType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								} else {
+									stringBuffer.append(TEXT_164);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_167);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_121);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								}
+							} else {
+								if (genItemType.getGenPackage().isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_168);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_158);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_165);
+									stringBuffer.append(genItemType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								} else {
+									stringBuffer.append(TEXT_168);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_159);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_121);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								}
+							}
+							stringBuffer.append(TEXT_169);
+						} else if (!genDataType.getMemberTypes().isEmpty()) {
+							if (!genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_170);
+								for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+									stringBuffer.append(TEXT_126);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_171);
+									if (genMemberType.getGenPackage() == genPackage) {
+										if (genPackage.isDataTypeConverters()) {
+											if (genMemberType.getQualifiedInstanceClassName()
+													.equals(genDataType.getQualifiedInstanceClassName())) {
+												stringBuffer.append(TEXT_172);
+												stringBuffer.append(genMemberType.getName());
+												stringBuffer.append(TEXT_157);
+											} else if (genMemberType.isPrimitiveType() && !isJDK50) {
+												stringBuffer.append(TEXT_172);
+												stringBuffer.append(genMemberType.getName());
+												stringBuffer.append(TEXT_173);
+												stringBuffer.append(
+														genMemberType.getObjectType().getImportedInstanceClassName());
+												stringBuffer.append(TEXT_174);
+												stringBuffer.append(genMemberType.getPrimitiveValueFunction());
+												stringBuffer.append(TEXT_175);
+											} else {
+												stringBuffer.append(TEXT_172);
+												stringBuffer.append(genMemberType.getName());
+												stringBuffer.append(TEXT_165);
+												stringBuffer.append(genMemberType.getObjectType()
+														.getImportedBoundedWildcardInstanceClassName());
+												stringBuffer.append(TEXT_176);
+											}
+										} else {
+											stringBuffer.append(TEXT_172);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_167);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_160);
+										}
+									} else {
+										if (genMemberType.getGenPackage().isDataTypeConverters()) {
+											genMemberType = genMemberType.getObjectType();
+											stringBuffer.append(TEXT_177);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_158);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_165);
+											stringBuffer.append(genMemberType.getObjectInstanceClassName());
+											stringBuffer.append(TEXT_176);
+										} else {
+											stringBuffer.append(TEXT_177);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_159);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_160);
+										}
+									}
+									stringBuffer.append(TEXT_178);
+								}
+							} else {
+								for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+									stringBuffer.append(TEXT_113);
+									if (genMemberType.getGenPackage() == genPackage) {
+										if (genPackage.isDataTypeConverters()) {
+											stringBuffer.append(TEXT_179);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_157);
+										} else {
+											stringBuffer.append(TEXT_179);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_167);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_121);
+											if (!isJDK50) {
+												stringBuffer.append(TEXT_122);
+												stringBuffer.append(genMemberType.getObjectInstanceClassName());
+												stringBuffer.append(TEXT_180);
+											} else {
+												stringBuffer.append(TEXT_152);
+											}
+											stringBuffer.append(TEXT_69);
+										}
+									} else {
+										if (genMemberType.getGenPackage().isDataTypeConverters()) {
+											stringBuffer.append(TEXT_181);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_158);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_157);
+										} else {
+											stringBuffer.append(TEXT_181);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_159);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_121);
+											if (!isJDK50) {
+												stringBuffer.append(TEXT_122);
+												stringBuffer.append(genMemberType.getObjectInstanceClassName());
+												stringBuffer.append(TEXT_180);
+											} else {
+												stringBuffer.append(TEXT_152);
+											}
+											stringBuffer.append(TEXT_69);
+										}
+									}
+									stringBuffer.append(TEXT_182);
+								}
+							}
+							stringBuffer.append(TEXT_183);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_184);
+						} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+								&& (genDataType.isArrayType()
+										|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+										|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+							stringBuffer.append(TEXT_185);
+						} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+							stringBuffer.append(TEXT_131);
+							stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+							stringBuffer.append(TEXT_44);
+						} else if (genDataType.isPrimitiveType() && !isJDK50) {
+							stringBuffer.append(TEXT_186);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_187);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_188);
+						} else {
+							stringBuffer.append(TEXT_186);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_160);
+						}
+						stringBuffer.append(TEXT_136);
+					}
+					stringBuffer.append(TEXT_58);
+					if (genDataType.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (genModel.useGenerics() && (genDataType.getItemType() != null || genDataType.isUncheckedCast())
+							&& (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody())) {
+						stringBuffer.append(TEXT_75);
+					}
+					if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					stringBuffer.append(TEXT_151);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_167);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+					stringBuffer.append(TEXT_189);
+					if (genDataType instanceof GenEnum) {
+						if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_176);
+						} else {
+							stringBuffer.append(TEXT_153);
+						}
+					} else if (genDataType.getBaseType() != null) {
+						GenDataType genBaseType = genDataType.getBaseType();
+						if (genBaseType.getGenPackage() == genPackage) {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genBaseType.getName());
+							stringBuffer.append(TEXT_167);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_160);
+						} else {
+							stringBuffer.append(TEXT_73);
+							stringBuffer
+									.append(genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+							stringBuffer.append(TEXT_159);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_160);
+						}
+					} else if (genDataType.getItemType() != null) {
+						GenDataType genItemType = genDataType.getItemType();
+						if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_176);
+						} else {
+							final String singleWildcard = genModel.useGenerics() ? "<?>" : "";
+							stringBuffer.append(TEXT_190);
+							stringBuffer.append(genModel.getImportedName("java.util.List"));
+							stringBuffer.append(singleWildcard);
+							stringBuffer.append(TEXT_191);
+							stringBuffer.append(genModel.getImportedName("java.util.List"));
+							stringBuffer.append(singleWildcard);
+							stringBuffer.append(TEXT_192);
+							stringBuffer.append(genModel.getImportedName("java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_44);
+							String item;
+							if (!genModel.useGenerics()) {
+								item = "i.next()";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+								stringBuffer.append(TEXT_193);
+							} else {
+								item = "item";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+								stringBuffer.append(TEXT_194);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genItemType.getGenPackage() == genPackage) {
+								stringBuffer.append(TEXT_164);
+								stringBuffer.append(genItemType.getName());
+								stringBuffer.append(TEXT_167);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_121);
+								stringBuffer.append(item);
+								stringBuffer.append(TEXT_166);
+							} else {
+								stringBuffer.append(TEXT_168);
+								stringBuffer.append(
+										genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_159);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_121);
+								stringBuffer.append(item);
+								stringBuffer.append(TEXT_166);
+							}
+							stringBuffer.append(TEXT_169);
+						}
+					} else if (!genDataType.getMemberTypes().isEmpty()) {
+						if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+							if (genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_154);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_173);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_195);
+								if (!isJDK50) {
+									stringBuffer.append(TEXT_41);
+									stringBuffer.append(genDataType.getPrimitiveValueFunction());
+									stringBuffer.append(TEXT_71);
+								}
+								stringBuffer.append(TEXT_69);
+							} else {
+								stringBuffer.append(TEXT_156);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_157);
+							}
+						} else {
+							stringBuffer.append(TEXT_170);
+							for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_171);
+								if (genMemberType.getGenPackage() == genPackage) {
+									stringBuffer.append(TEXT_172);
+									stringBuffer.append(genMemberType.getName());
+									stringBuffer.append(TEXT_167);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_160);
+								} else {
+									stringBuffer.append(TEXT_177);
+									stringBuffer.append(genMemberType.getGenPackage()
+											.getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_159);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_160);
+								}
+								stringBuffer.append(TEXT_178);
+							}
+							stringBuffer.append(TEXT_196);
+						}
+					} else if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+						if (genDataType.isPrimitiveType()) {
+							stringBuffer.append(TEXT_154);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_76);
+							if (!isJDK50) {
+								stringBuffer.append(TEXT_76);
+							}
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_197);
+							if (!isJDK50) {
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genDataType.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_71);
+							}
+							stringBuffer.append(TEXT_69);
+						} else {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_176);
+						}
+					} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+							&& (genDataType.isArrayType()
+									|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+									|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+						stringBuffer.append(TEXT_185);
+					} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_131);
+						stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_199);
+					}
+					stringBuffer.append(TEXT_136);
+				}
+			}
+		} else {
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (genClass.hasFactoryInterfaceCreateMethod()) {
+					stringBuffer.append(TEXT_200);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_201);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_202);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					stringBuffer.append(TEXT_203);
+					stringBuffer.append(genClass.getTypeParameters());
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceTypeArguments());
+					stringBuffer.append(TEXT_63);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_204);
+				}
+			}
+			if (genPackage.isDataTypeConverters()) {
+				for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+					if (genDataType.isSerializable()) {
+						stringBuffer.append(TEXT_205);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_206);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						stringBuffer.append(TEXT_203);
+						stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_207);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_208);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						stringBuffer.append(TEXT_209);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+						stringBuffer.append(TEXT_210);
+					}
+				}
+			}
+		}
+		if (!isImplementation && !genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_211);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_212);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_204);
+		} else if (isImplementation) {
+			stringBuffer.append(TEXT_47);
+			if (useInterfaceOverrideAnnotation && !genModel.isSuppressEMFMetaData()) {
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_62);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_212);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_213);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_214);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_61);
+			}
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_215);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_216);
+		}
+		stringBuffer.append(TEXT_217);
+		stringBuffer.append(isInterface ? genPackage.getFactoryInterfaceName() : genPackage.getFactoryClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/FactoryInterface.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/FactoryInterface.java
new file mode 100644
index 0000000..1b2abd8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/FactoryInterface.java
@@ -0,0 +1,1695 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class FactoryInterface extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized FactoryInterface create(String lineSeparator) {
+		nl = lineSeparator;
+		FactoryInterface result = new FactoryInterface();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Factory</b> for the model." + NL
+			+ " * It provides a create method for each non-abstract class of the model." + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * @see ";
+	protected final String TEXT_7 = NL + " * ";
+	protected final String TEXT_8 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_9 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * An implementation of the model <b>Factory</b>." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_10 = NL + "@Deprecated";
+	protected final String TEXT_11 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_12 = NL + "public class ";
+	protected final String TEXT_13 = " extends ";
+	protected final String TEXT_14 = " implements ";
+	protected final String TEXT_15 = NL + "public interface ";
+	protected final String TEXT_16 = NL + "{";
+	protected final String TEXT_17 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_18 = " copyright = ";
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * The singleton instance of the factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_20 = " eINSTANCE = init();" + NL;
+	protected final String TEXT_21 = " INSTANCE = ";
+	protected final String TEXT_22 = ".eINSTANCE;" + NL;
+	protected final String TEXT_23 = " eINSTANCE = ";
+	protected final String TEXT_24 = ".init();" + NL;
+	protected final String TEXT_25 = NL + "\t/**" + NL + "\t * Creates the default factory implementation." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_26 = NL + "\tpublic static ";
+	protected final String TEXT_27 = " init()" + NL + "\t{" + NL + "\t\ttry" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_28 = " the";
+	protected final String TEXT_29 = " = (";
+	protected final String TEXT_30 = ")";
+	protected final String TEXT_31 = ".Registry.INSTANCE.getEFactory(";
+	protected final String TEXT_32 = ".eNS_URI);" + NL + "\t\t\tif (the";
+	protected final String TEXT_33 = " != null)" + NL + "\t\t\t{" + NL + "\t\t\t\treturn the";
+	protected final String TEXT_34 = ";" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\tcatch (Exception exception)" + NL
+			+ "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_35 = ".INSTANCE.log(exception);" + NL + "\t\t}" + NL + "\t\treturn new ";
+	protected final String TEXT_36 = "();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates an instance of the factory." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_37 = "()" + NL + "\t{" + NL + "\t\tsuper();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_38 = NL + "\t@Override";
+	protected final String TEXT_39 = NL + "\tpublic EObject create(EClass eClass)" + NL + "\t{" + NL
+			+ "\t\tswitch (eClass.getClassifierID())" + NL + "\t\t{";
+	protected final String TEXT_40 = NL + "\t\t\tcase ";
+	protected final String TEXT_41 = ".";
+	protected final String TEXT_42 = ": return ";
+	protected final String TEXT_43 = "create";
+	protected final String TEXT_44 = "();";
+	protected final String TEXT_45 = NL + "\t\t\tdefault:" + NL
+			+ "\t\t\t\tthrow new IllegalArgumentException(\"The class '\" + eClass.getName() + \"' is not a valid classifier\");";
+	protected final String TEXT_46 = NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_47 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_48 = NL + "\tpublic Object createFromString(";
+	protected final String TEXT_49 = " eDataType, String initialValue)" + NL + "\t{" + NL
+			+ "\t\tswitch (eDataType.getClassifierID())" + NL + "\t\t{";
+	protected final String TEXT_50 = ":" + NL + "\t\t\t\treturn create";
+	protected final String TEXT_51 = "FromString(eDataType, initialValue);";
+	protected final String TEXT_52 = NL + "\t\t\tdefault:" + NL
+			+ "\t\t\t\tthrow new IllegalArgumentException(\"The datatype '\" + eDataType.getName() + \"' is not a valid classifier\");";
+	protected final String TEXT_53 = NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_54 = NL + "\tpublic String convertToString(";
+	protected final String TEXT_55 = " eDataType, Object instanceValue)" + NL + "\t{" + NL
+			+ "\t\tswitch (eDataType.getClassifierID())" + NL + "\t\t{";
+	protected final String TEXT_56 = ":" + NL + "\t\t\t\treturn convert";
+	protected final String TEXT_57 = "ToString(eDataType, instanceValue);";
+	protected final String TEXT_58 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_59 = NL + "\t * ";
+	protected final String TEXT_60 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_61 = NL + "\t@Deprecated";
+	protected final String TEXT_62 = NL + "\tpublic ";
+	protected final String TEXT_63 = " create";
+	protected final String TEXT_64 = "()" + NL + "\t{";
+	protected final String TEXT_65 = NL + "\t\t";
+	protected final String TEXT_66 = " ";
+	protected final String TEXT_67 = " = ";
+	protected final String TEXT_68 = "super.create(";
+	protected final String TEXT_69 = ");";
+	protected final String TEXT_70 = " = new ";
+	protected final String TEXT_71 = "()";
+	protected final String TEXT_72 = "{}";
+	protected final String TEXT_73 = NL + "\t\treturn ";
+	protected final String TEXT_74 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_75 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_76 = "(";
+	protected final String TEXT_77 = "final ";
+	protected final String TEXT_78 = "String ";
+	protected final String TEXT_79 = "it";
+	protected final String TEXT_80 = "literal";
+	protected final String TEXT_81 = ")" + NL + "\t{";
+	protected final String TEXT_82 = " result = ";
+	protected final String TEXT_83 = ".get(literal);" + NL
+			+ "\t\tif (result == null) throw new IllegalArgumentException(\"The value '\" + literal + \"' is not a valid enumerator of '\" + ";
+	protected final String TEXT_84 = ".getName() + \"'\");";
+	protected final String TEXT_85 = NL + "\t\treturn result;";
+	protected final String TEXT_86 = NL + "\t\treturn new ";
+	protected final String TEXT_87 = "(create";
+	protected final String TEXT_88 = "(literal));";
+	protected final String TEXT_89 = NL + "\t\treturn create";
+	protected final String TEXT_90 = "(literal);";
+	protected final String TEXT_91 = ".create";
+	protected final String TEXT_92 = ".createFromString(";
+	protected final String TEXT_93 = ", literal);";
+	protected final String TEXT_94 = NL + "\t\tif (literal == null) return null;" + NL + "\t\t";
+	protected final String TEXT_95 = " result = new ";
+	protected final String TEXT_96 = "<";
+	protected final String TEXT_97 = ">";
+	protected final String TEXT_98 = NL + "\t\tfor (";
+	protected final String TEXT_99 = " stringTokenizer = new ";
+	protected final String TEXT_100 = "(literal); stringTokenizer.hasMoreTokens(); )";
+	protected final String TEXT_101 = NL + "\t\tfor (String item : split(literal))";
+	protected final String TEXT_102 = NL + "\t\t{";
+	protected final String TEXT_103 = NL + "\t\t\tString item = stringTokenizer.nextToken();";
+	protected final String TEXT_104 = NL + "\t\t\tresult.add(create";
+	protected final String TEXT_105 = "(item));";
+	protected final String TEXT_106 = "FromString(";
+	protected final String TEXT_107 = ", item));";
+	protected final String TEXT_108 = NL + "\t\t\tresult.add(";
+	protected final String TEXT_109 = NL + "\t\t}" + NL + "\t\treturn result;";
+	protected final String TEXT_110 = NL + "\t\tif (literal == null) return ";
+	protected final String TEXT_111 = ";" + NL + "\t\t";
+	protected final String TEXT_112 = ";" + NL + "\t\tRuntimeException exception = null;";
+	protected final String TEXT_113 = NL + "\t\ttry" + NL + "\t\t{";
+	protected final String TEXT_114 = NL + "\t\t\tresult = create";
+	protected final String TEXT_115 = NL + "\t\t\tresult = (";
+	protected final String TEXT_116 = ")create";
+	protected final String TEXT_117 = NL + "\t\t\tresult = ";
+	protected final String TEXT_118 = NL + "\t\t\tif (";
+	protected final String TEXT_119 = "result != null && ";
+	protected final String TEXT_120 = ".INSTANCE.validate(";
+	protected final String TEXT_121 = ", ";
+	protected final String TEXT_122 = "new ";
+	protected final String TEXT_123 = "(result)";
+	protected final String TEXT_124 = "result";
+	protected final String TEXT_125 = ", null, null))" + NL + "\t\t\t{" + NL + "\t\t\t\treturn result;" + NL + "\t\t\t}"
+			+ NL + "\t\t}" + NL + "\t\tcatch (RuntimeException e)" + NL + "\t\t{" + NL + "\t\t\texception = e;" + NL
+			+ "\t\t}";
+	protected final String TEXT_126 = NL + "\t\tif (";
+	protected final String TEXT_127 = "result != null || ";
+	protected final String TEXT_128 = "exception == null) return result;" + NL + "    " + NL + "\t\tthrow exception;";
+	protected final String TEXT_129 = NL + "\t\treturn (";
+	protected final String TEXT_130 = ")super.createFromString(literal);";
+	protected final String TEXT_131 = NL + "\t\t// TODO: implement this method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tthrow new ";
+	protected final String TEXT_132 = NL + "\t\treturn ((";
+	protected final String TEXT_133 = ")super.createFromString(";
+	protected final String TEXT_134 = ", literal)).";
+	protected final String TEXT_135 = "super.createFromString(";
+	protected final String TEXT_136 = NL + "\t}" + NL;
+	protected final String TEXT_137 = " eDataType, String initialValue)" + NL + "\t{";
+	protected final String TEXT_138 = "(initialValue);";
+	protected final String TEXT_139 = ".get(initialValue);" + NL
+			+ "\t\tif (result == null) throw new IllegalArgumentException(\"The value '\" + initialValue + \"' is not a valid enumerator of '\" + eDataType.getName() + \"'\");";
+	protected final String TEXT_140 = ", initialValue);";
+	protected final String TEXT_141 = NL + "\t\tif (initialValue == null) return null;" + NL + "\t\t";
+	protected final String TEXT_142 = "(initialValue); stringTokenizer.hasMoreTokens(); )";
+	protected final String TEXT_143 = NL + "\t\tfor (String item : split(initialValue))";
+	protected final String TEXT_144 = "(initialValue));";
+	protected final String TEXT_145 = " result = null;" + NL + "\t\tRuntimeException exception = null;";
+	protected final String TEXT_146 = NL + "\t\t\tif (result != null && ";
+	protected final String TEXT_147 = ".INSTANCE.validate(eDataType, result, null, null))" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\treturn result;" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\tcatch (RuntimeException e)" + NL
+			+ "\t\t{" + NL + "\t\t\texception = e;" + NL + "\t\t}";
+	protected final String TEXT_148 = NL + "\t\tif (result != null || exception == null) return result;" + NL + "    "
+			+ NL + "\t\tthrow exception;";
+	protected final String TEXT_149 = "super.createFromString(initialValue);";
+	protected final String TEXT_150 = "super.createFromString(eDataType, initialValue);";
+	protected final String TEXT_151 = NL + "\tpublic String convert";
+	protected final String TEXT_152 = "instanceValue";
+	protected final String TEXT_153 = NL + "\t\treturn instanceValue == null ? null : instanceValue.toString();";
+	protected final String TEXT_154 = NL + "\t\treturn instanceValue == null ? null : convert";
+	protected final String TEXT_155 = "(instanceValue";
+	protected final String TEXT_156 = NL + "\t\treturn convert";
+	protected final String TEXT_157 = "(instanceValue);";
+	protected final String TEXT_158 = ".convert";
+	protected final String TEXT_159 = ".convertToString(";
+	protected final String TEXT_160 = ", instanceValue);";
+	protected final String TEXT_161 = NL + "\t\tif (instanceValue == null) return null;" + NL
+			+ "\t\tif (instanceValue.isEmpty()) return \"\";" + NL + "\t\t";
+	protected final String TEXT_162 = " i = instanceValue.iterator(); i.hasNext(); )";
+	protected final String TEXT_163 = " item : instanceValue)";
+	protected final String TEXT_164 = NL + "\t\t\tresult.append(convert";
+	protected final String TEXT_165 = "((";
+	protected final String TEXT_166 = "));";
+	protected final String TEXT_167 = "ToString(";
+	protected final String TEXT_168 = NL + "\t\t\tresult.append(";
+	protected final String TEXT_169 = NL + "\t\t\tresult.append(' ');" + NL + "\t\t}" + NL
+			+ "\t\treturn result.substring(0, result.length() - 1);";
+	protected final String TEXT_170 = NL + "\t\tif (instanceValue == null) return null;";
+	protected final String TEXT_171 = ".isInstance(instanceValue))" + NL + "\t\t{" + NL + "\t\t\ttry" + NL + "\t\t\t{";
+	protected final String TEXT_172 = NL + "\t\t\t\tString value = convert";
+	protected final String TEXT_173 = "(((";
+	protected final String TEXT_174 = ")instanceValue).";
+	protected final String TEXT_175 = "());";
+	protected final String TEXT_176 = ")instanceValue);";
+	protected final String TEXT_177 = NL + "\t\t\t\tString value = ";
+	protected final String TEXT_178 = NL + "\t\t\t\tif (value != null) return value;" + NL + "\t\t\t}" + NL
+			+ "\t\t\tcatch (Exception e)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Keep trying other member types until all have failed." + NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_179 = NL + "\t\t\tString value = convert";
+	protected final String TEXT_180 = "(instanceValue)";
+	protected final String TEXT_181 = NL + "\t\t\tString value = ";
+	protected final String TEXT_182 = NL + "\t\t\tif (value != null) return value;" + NL + "\t\t}" + NL
+			+ "\t\tcatch (Exception e)" + NL + "\t\t{" + NL
+			+ "\t\t\t// Keep trying other member types until all have failed." + NL + "\t\t}";
+	protected final String TEXT_183 = NL
+			+ "\t\tthrow new IllegalArgumentException(\"Invalid value: '\"+instanceValue+\"' for datatype :\"+";
+	protected final String TEXT_184 = ".getName());";
+	protected final String TEXT_185 = NL + "\t\treturn super.convertToString(instanceValue);";
+	protected final String TEXT_186 = NL + "\t\treturn super.convertToString(";
+	protected final String TEXT_187 = ", new ";
+	protected final String TEXT_188 = "(instanceValue));";
+	protected final String TEXT_189 = " eDataType, Object instanceValue)" + NL + "\t{";
+	protected final String TEXT_190 = NL + "\t\tif (instanceValue == null) return null;" + NL + "\t\t";
+	protected final String TEXT_191 = " list = (";
+	protected final String TEXT_192 = ")instanceValue;" + NL + "\t\tif (list.isEmpty()) return \"\";" + NL + "\t\t";
+	protected final String TEXT_193 = " i = list.iterator(); i.hasNext(); )";
+	protected final String TEXT_194 = " item : list)";
+	protected final String TEXT_195 = ")instanceValue)";
+	protected final String TEXT_196 = NL
+			+ "\t\tthrow new IllegalArgumentException(\"Invalid value: '\"+instanceValue+\"' for datatype :\"+eDataType.getName());";
+	protected final String TEXT_197 = ")instanceValue";
+	protected final String TEXT_198 = ").";
+	protected final String TEXT_199 = NL + "\t\treturn super.convertToString(eDataType, instanceValue);";
+	protected final String TEXT_200 = NL + "\t/**" + NL + "\t * Returns a new object of class '<em>";
+	protected final String TEXT_201 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return a new object of class '<em>";
+	protected final String TEXT_202 = "</em>'.";
+	protected final String TEXT_203 = NL + "\t";
+	protected final String TEXT_204 = "();" + NL;
+	protected final String TEXT_205 = NL + "\t/**" + NL + "\t * Returns an instance of data type '<em>";
+	protected final String TEXT_206 = "</em>' corresponding the given literal." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @param literal a literal of the data type." + NL
+			+ "\t * @return a new instance value of the data type.";
+	protected final String TEXT_207 = "(String literal);" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns a literal representation of an instance of data type '<em>";
+	protected final String TEXT_208 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @param instanceValue an instance value of the data type." + NL
+			+ "\t * @return a literal representation of the instance value.";
+	protected final String TEXT_209 = NL + "\tString convert";
+	protected final String TEXT_210 = " instanceValue);" + NL;
+	protected final String TEXT_211 = NL + "\t/**" + NL + "\t * Returns the package supported by this factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the package supported by this factory." + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_212 = " get";
+	protected final String TEXT_213 = "()" + NL + "\t{" + NL + "\t\treturn (";
+	protected final String TEXT_214 = ")getEPackage();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @deprecated" + NL
+			+ "\t * @generated" + NL + "\t */";
+	protected final String TEXT_215 = " getPackage()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_216 = ".eINSTANCE;" + NL + "\t}" + NL;
+	protected final String TEXT_217 = NL + "} //";
+	protected final String TEXT_218 = NL;
+
+	public FactoryInterface() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_218);
+		stringBuffer.append(TEXT_218);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getReflectionPackageName();
+		className = genPackage.getFactoryInterfaceName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = ((Object[]) new Object[] { new Object[] { genPackage, Boolean.TRUE, Boolean.FALSE } })[0];
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) ((Object[]) argument)[0];
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
+		boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
+		boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation()
+				&& !(isInterface && isImplementation);
+		String publicStaticFinalFlag = isImplementation ? "public static final " : "";
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (isInterface || genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getReflectionPackageName());
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getClassPackageName());
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		if (isImplementation) {
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");
+			genModel.addImport("org.eclipse.emf.ecore.EClass");
+			genModel.addImport("org.eclipse.emf.ecore.EObject");
+			if (!genPackage.hasJavaLangConflict() && !genPackage.hasInterfaceImplConflict()
+					&& !genPackage.getClassPackageName().equals(genPackage.getInterfacePackageName()))
+				genModel.addImport(genPackage.getInterfacePackageName() + ".*");
+		}
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		if (isInterface) {
+			stringBuffer.append(TEXT_5);
+			if (!genModel.isSuppressEMFMetaData()) {
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			}
+			if (genPackage.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_8);
+		} else {
+			stringBuffer.append(TEXT_9);
+			if (genPackage.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_8);
+		}
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_10);
+		}
+		if (isImplementation) {
+			if (isJDK50 && !genPackage.hasAPIDeprecatedTag()) {
+				List<GenClassifier> genClassifiers = new ArrayList<GenClassifier>(genPackage.getGenClassifiers());
+				for (Iterator<GenClassifier> i = genClassifiers.iterator(); i.hasNext();) {
+					GenClassifier genClassifier = i.next();
+					if (genClassifier instanceof GenClass && ((GenClass) genClassifier).isAbstract())
+						i.remove();
+				}
+				if (GenModelUtil.hasAPIDeprecatedTag(genClassifiers)) {
+					stringBuffer.append(TEXT_11);
+				}
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genPackage.getFactoryClassName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EFactoryImpl"));
+			if (!genModel.isSuppressInterfaces()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
+			}
+		} else {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			if (!genModel.isSuppressEMFMetaData()) {
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EFactory"));
+			}
+		}
+		stringBuffer.append(TEXT_16);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isImplementation && (genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces())) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getFactoryClassName());
+			stringBuffer.append(TEXT_20);
+		}
+		if (isInterface && genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genPackage.getQualifiedFactoryClassName());
+			stringBuffer.append(TEXT_22);
+		} else if (isInterface && !genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genPackage.getQualifiedFactoryClassName());
+			stringBuffer.append(TEXT_24);
+		}
+		if (isImplementation) {
+			stringBuffer.append(TEXT_25);
+			String factoryType = genModel.isSuppressEMFMetaData() ? genPackage.getFactoryClassName()
+					: genPackage.getImportedFactoryInterfaceName();
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(factoryType);
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(factoryType);
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(factoryType);
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(genPackage.getImportedFactoryClassName());
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genPackage.getFactoryClassName());
+			stringBuffer.append(TEXT_37);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_39);
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (!genClass.isAbstract()) {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(genClass.getClassifierID());
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(!genClass.isEObjectExtension() ? "(EObject)" : "");
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_44);
+				}
+			}
+			stringBuffer.append(TEXT_45);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(genModel.getNonNLS(2));
+			stringBuffer.append(TEXT_46);
+			if (!genPackage.getAllGenDataTypes().isEmpty()) {
+				stringBuffer.append(TEXT_47);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_38);
+				}
+				stringBuffer.append(TEXT_48);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+				stringBuffer.append(TEXT_49);
+				for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+					if (genDataType.isSerializable()) {
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genDataType.getClassifierID());
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_51);
+					}
+				}
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(TEXT_53);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_38);
+				}
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+				stringBuffer.append(TEXT_55);
+				for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+					if (genDataType.isSerializable()) {
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genDataType.getClassifierID());
+						stringBuffer.append(TEXT_56);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_57);
+					}
+				}
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(genModel.getNonNLS(2));
+				stringBuffer.append(TEXT_46);
+			}
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (!genClass.isAbstract()) {
+					stringBuffer.append(TEXT_58);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()) {
+						stringBuffer.append(TEXT_38);
+					}
+					stringBuffer.append(TEXT_62);
+					stringBuffer.append(genClass.getTypeParameters());
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceTypeArguments());
+					stringBuffer.append(TEXT_63);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_64);
+					if (genClass.isDynamic()) {
+						stringBuffer.append(TEXT_65);
+						stringBuffer.append(genClass.getImportedInterfaceName());
+						stringBuffer.append(genClass.getInterfaceTypeArguments());
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_67);
+						stringBuffer.append(genClass.getCastFromEObject());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_69);
+					} else {
+						stringBuffer.append(TEXT_65);
+						stringBuffer.append(genClass.getImportedClassName());
+						stringBuffer.append(genClass.getClassTypeArguments());
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(genClass.getSafeUncapName());
+						stringBuffer.append(TEXT_70);
+						stringBuffer.append(genClass.getImportedClassName());
+						stringBuffer.append(genClass.getClassTypeArguments());
+						stringBuffer.append(TEXT_71);
+						if (genModel.isSuppressInterfaces() && !genPackage.getReflectionPackageName()
+								.equals(genPackage.getInterfacePackageName())) {
+							stringBuffer.append(TEXT_72);
+						}
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_73);
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_74);
+				}
+			}
+			for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+				if (genDataType.isSerializable()) {
+					if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+						String eDataType = genDataType.getQualifiedClassifierAccessor();
+						stringBuffer.append(TEXT_58);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (genModel.useGenerics() && genDataType.isUncheckedCast() && !genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_75);
+						}
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {
+							stringBuffer.append(TEXT_38);
+						}
+						stringBuffer.append(TEXT_62);
+						stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_76);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_77);
+						}
+						stringBuffer.append(TEXT_78);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_79);
+						} else {
+							stringBuffer.append(TEXT_80);
+						}
+						stringBuffer.append(TEXT_81);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genDataType.getCreatorBody(genModel.getIndentation(stringBuffer)));
+						} else if (genDataType instanceof GenEnum) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_84);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(genModel.getNonNLS(2));
+							stringBuffer.append(genModel.getNonNLS(3));
+							stringBuffer.append(TEXT_85);
+						} else if (genDataType.getBaseType() != null) {
+							GenDataType genBaseType = genDataType.getBaseType();
+							boolean isPrimitiveConversion = !genDataType.isPrimitiveType()
+									&& genBaseType.isPrimitiveType();
+							if (genBaseType.getGenPackage() == genPackage) {
+								if (isPrimitiveConversion && !isJDK50) {
+									stringBuffer.append(TEXT_86);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_87);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_88);
+								} else {
+									stringBuffer.append(TEXT_89);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_90);
+								}
+							} else if (genBaseType.getGenPackage().isDataTypeConverters()) {
+								if (isPrimitiveConversion && !isJDK50) {
+									stringBuffer.append(TEXT_86);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_76);
+									stringBuffer.append(
+											genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_88);
+								} else {
+									stringBuffer.append(TEXT_73);
+									stringBuffer.append(
+											genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_90);
+								}
+							} else {
+								stringBuffer.append(TEXT_73);
+								if (!genDataType.isObjectType()) {
+									stringBuffer.append(TEXT_76);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+								}
+								stringBuffer.append(
+										genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_93);
+							}
+						} else if (genDataType.getItemType() != null) {
+							GenDataType genItemType = genDataType.getItemType();
+							stringBuffer.append(TEXT_94);
+							stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("java.util.ArrayList"));
+							if (genModel.useGenerics()) {
+								stringBuffer.append(TEXT_96);
+								stringBuffer.append(
+										genItemType.getObjectType().getImportedParameterizedInstanceClassName());
+								stringBuffer.append(TEXT_97);
+							}
+							stringBuffer.append(TEXT_44);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_100);
+							} else {
+								stringBuffer.append(TEXT_101);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_103);
+							}
+							if (genItemType.getGenPackage() == genPackage) {
+								if (genPackage.isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_104);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_105);
+								} else {
+									stringBuffer.append(TEXT_104);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_106);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_107);
+								}
+							} else {
+								if (genItemType.getGenPackage().isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_108);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_105);
+								} else {
+									stringBuffer.append(TEXT_108);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_92);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_107);
+								}
+							}
+							stringBuffer.append(TEXT_109);
+						} else if (!genDataType.getMemberTypes().isEmpty()) {
+							stringBuffer.append(TEXT_110);
+							stringBuffer.append(genDataType.getStaticValue(null));
+							stringBuffer.append(TEXT_111);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(genDataType.getStaticValue(null));
+							stringBuffer.append(TEXT_112);
+							for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+								stringBuffer.append(TEXT_113);
+								if (genMemberType.getGenPackage() == genPackage) {
+									if (genPackage.isDataTypeConverters()) {
+										if (!genDataType.isPrimitiveType())
+											genMemberType = genMemberType.getObjectType();
+										stringBuffer.append(TEXT_114);
+										stringBuffer.append(genMemberType.getName());
+										stringBuffer.append(TEXT_90);
+									} else {
+										stringBuffer.append(TEXT_115);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_116);
+										stringBuffer.append(genMemberType.getName());
+										stringBuffer.append(TEXT_106);
+										stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+										stringBuffer.append(TEXT_93);
+									}
+								} else {
+									if (genPackage.isDataTypeConverters()) {
+										if (!genDataType.isPrimitiveType())
+											genMemberType = genMemberType.getObjectType();
+										stringBuffer.append(TEXT_117);
+										stringBuffer.append(genMemberType.getGenPackage()
+												.getQualifiedEFactoryInternalInstanceAccessor());
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(genMemberType.getName());
+										stringBuffer.append(TEXT_90);
+									} else {
+										stringBuffer.append(TEXT_115);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_30);
+										stringBuffer.append(genMemberType.getGenPackage()
+												.getQualifiedEFactoryInternalInstanceAccessor());
+										stringBuffer.append(TEXT_92);
+										stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+										stringBuffer.append(TEXT_93);
+									}
+								}
+								stringBuffer.append(TEXT_118);
+								if (!genDataType.isPrimitiveType()) {
+									stringBuffer.append(TEXT_119);
+								}
+								stringBuffer
+										.append(genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician"));
+								stringBuffer.append(TEXT_120);
+								stringBuffer.append(eDataType);
+								stringBuffer.append(TEXT_121);
+								if (genDataType.isPrimitiveType() && !isJDK50) {
+									stringBuffer.append(TEXT_122);
+									stringBuffer.append(genDataType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_123);
+								} else {
+									stringBuffer.append(TEXT_124);
+								}
+								stringBuffer.append(TEXT_125);
+							}
+							stringBuffer.append(TEXT_126);
+							if (!genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_127);
+							}
+							stringBuffer.append(TEXT_128);
+						} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+								&& (genDataType.isArrayType()
+										|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+										|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+							stringBuffer.append(TEXT_129);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_130);
+						} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+							stringBuffer.append(TEXT_131);
+							stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+							stringBuffer.append(TEXT_44);
+						} else if (genDataType.isPrimitiveType() && !isJDK50) {
+							stringBuffer.append(TEXT_132);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_133);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_134);
+							stringBuffer.append(genDataType.getPrimitiveValueFunction());
+							stringBuffer.append(TEXT_44);
+						} else {
+							stringBuffer.append(TEXT_73);
+							if (!genDataType.isObjectType()) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+								stringBuffer.append(TEXT_30);
+							}
+							stringBuffer.append(TEXT_135);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_93);
+						}
+						stringBuffer.append(TEXT_136);
+					}
+					stringBuffer.append(TEXT_58);
+					if (genDataType.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (!genPackage.isDataTypeConverters() && genModel.useGenerics() && genDataType.isUncheckedCast()
+							&& !genDataType.hasCreatorBody()) {
+						stringBuffer.append(TEXT_75);
+					}
+					if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					stringBuffer.append(TEXT_62);
+					stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+					stringBuffer.append(TEXT_63);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_106);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+					stringBuffer.append(TEXT_137);
+					if (genDataType instanceof GenEnum) {
+						if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_138);
+						} else {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(((GenEnum) genDataType).getImportedInstanceClassName());
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(((GenEnum) genDataType).getImportedInstanceClassName());
+							stringBuffer.append(TEXT_139);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(genModel.getNonNLS(2));
+							stringBuffer.append(genModel.getNonNLS(3));
+							stringBuffer.append(TEXT_85);
+						}
+					} else if (genDataType.getBaseType() != null) {
+						GenDataType genBaseType = genDataType.getBaseType();
+						if (genBaseType.getGenPackage() == genPackage) {
+							stringBuffer.append(TEXT_73);
+							if (!genDataType.getObjectInstanceClassName()
+									.equals(genBaseType.getObjectInstanceClassName())) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_30);
+							}
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(genBaseType.getName());
+							stringBuffer.append(TEXT_106);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_140);
+						} else {
+							stringBuffer.append(TEXT_73);
+							if (!genDataType.isObjectType()) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_30);
+							}
+							stringBuffer
+									.append(genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+							stringBuffer.append(TEXT_92);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_140);
+						}
+					} else if (genDataType.getItemType() != null) {
+						GenDataType genItemType = genDataType.getItemType();
+						if (genPackage.isDataTypeConverters()) {
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_138);
+						} else {
+							stringBuffer.append(TEXT_141);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("java.util.ArrayList"));
+							if (genModel.useGenerics()) {
+								stringBuffer.append(TEXT_96);
+								stringBuffer.append(
+										genItemType.getObjectType().getImportedParameterizedInstanceClassName());
+								stringBuffer.append(TEXT_97);
+							}
+							stringBuffer.append(TEXT_44);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genModel.getImportedName("java.util.StringTokenizer"));
+								stringBuffer.append(TEXT_142);
+							} else {
+								stringBuffer.append(TEXT_143);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {
+								stringBuffer.append(TEXT_103);
+							}
+							if (genItemType.getGenPackage() == genPackage) {
+								stringBuffer.append(TEXT_104);
+								stringBuffer.append(genItemType.getName());
+								stringBuffer.append(TEXT_106);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_107);
+							} else {
+								stringBuffer.append(TEXT_108);
+								if (!genItemType.isObjectType()) {
+									stringBuffer.append(TEXT_76);
+									stringBuffer.append(genItemType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+								}
+								stringBuffer.append(
+										genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_107);
+							}
+							stringBuffer.append(TEXT_109);
+						}
+					} else if (!genDataType.getMemberTypes().isEmpty()) {
+						if (genPackage.isDataTypeConverters()) {
+							if (genDataType.isPrimitiveType() && !isJDK50) {
+								stringBuffer.append(TEXT_86);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_87);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_144);
+							} else {
+								stringBuffer.append(TEXT_89);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_138);
+							}
+						} else {
+							stringBuffer.append(TEXT_141);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_145);
+							for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+								stringBuffer.append(TEXT_113);
+								if (genMemberType.getGenPackage() == genPackage) {
+									stringBuffer.append(TEXT_117);
+									if (!genDataType.isObjectType() && !genDataType.getObjectInstanceClassName()
+											.equals(genMemberType.getObjectInstanceClassName())) {
+										stringBuffer.append(TEXT_76);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_30);
+									}
+									stringBuffer.append(TEXT_43);
+									stringBuffer.append(genMemberType.getName());
+									stringBuffer.append(TEXT_106);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_140);
+								} else {
+									stringBuffer.append(TEXT_117);
+									if (!genDataType.isObjectType()) {
+										stringBuffer.append(TEXT_76);
+										stringBuffer.append(genDataType.getObjectInstanceClassName());
+										stringBuffer.append(TEXT_30);
+									}
+									stringBuffer.append(genMemberType.getGenPackage()
+											.getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_92);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_140);
+								}
+								stringBuffer.append(TEXT_146);
+								stringBuffer
+										.append(genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician"));
+								stringBuffer.append(TEXT_147);
+							}
+							stringBuffer.append(TEXT_148);
+						}
+					} else if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+						stringBuffer.append(TEXT_89);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_138);
+					} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+							&& (genDataType.isArrayType()
+									|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+									|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+						stringBuffer.append(TEXT_73);
+						if (!genDataType.isObjectType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_30);
+						}
+						stringBuffer.append(TEXT_149);
+					} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_131);
+						stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_73);
+						if (!genDataType.isObjectType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genDataType.getImportedParameterizedObjectInstanceClassName());
+							stringBuffer.append(TEXT_30);
+						}
+						stringBuffer.append(TEXT_150);
+					}
+					stringBuffer.append(TEXT_136);
+					if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+						String eDataType = genDataType.getQualifiedClassifierAccessor();
+						stringBuffer.append(TEXT_58);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {
+							stringBuffer.append(TEXT_38);
+						}
+						stringBuffer.append(TEXT_151);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_76);
+						if (genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_77);
+						}
+						stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+						stringBuffer.append(TEXT_66);
+						if (genDataType.hasConverterBody()) {
+							stringBuffer.append(TEXT_79);
+						} else {
+							stringBuffer.append(TEXT_152);
+						}
+						stringBuffer.append(TEXT_81);
+						if (genDataType.hasConverterBody()) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genDataType.getConverterBody(genModel.getIndentation(stringBuffer)));
+						} else if (genDataType instanceof GenEnum) {
+							stringBuffer.append(TEXT_153);
+						} else if (genDataType.getBaseType() != null) {
+							GenDataType genBaseType = genDataType.getBaseType();
+							boolean isPrimitiveConversion = !genDataType.isPrimitiveType()
+									&& genBaseType.isPrimitiveType();
+							if (genBaseType.getGenPackage() == genPackage) {
+								if (isPrimitiveConversion) {
+									stringBuffer.append(TEXT_154);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_155);
+									if (!isJDK50) {
+										stringBuffer.append(TEXT_41);
+										stringBuffer.append(genBaseType.getPrimitiveValueFunction());
+										stringBuffer.append(TEXT_71);
+									}
+									stringBuffer.append(TEXT_69);
+								} else {
+									stringBuffer.append(TEXT_156);
+									stringBuffer.append(genBaseType.getName());
+									stringBuffer.append(TEXT_157);
+								}
+							} else if (genBaseType.getGenPackage().isDataTypeConverters()) {
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genBaseType.getGenPackage().getQualifiedFactoryInstanceAccessor());
+								stringBuffer.append(TEXT_158);
+								stringBuffer.append(genBaseType.getName());
+								stringBuffer.append(TEXT_157);
+							} else {
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(
+										genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_159);
+								stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_160);
+							}
+						} else if (genDataType.getItemType() != null) {
+							GenDataType genItemType = genDataType.getItemType();
+							stringBuffer.append(TEXT_161);
+							stringBuffer.append(genModel.getImportedName(
+									genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName(
+									genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_44);
+							String item;
+							if (!genModel.useGenerics()) {
+								item = "i.next()";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+								stringBuffer.append(TEXT_162);
+							} else {
+								item = "item";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+								stringBuffer.append(TEXT_163);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genItemType.getGenPackage() == genPackage) {
+								if (genPackage.isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_164);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_165);
+									stringBuffer.append(genItemType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								} else {
+									stringBuffer.append(TEXT_164);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_167);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_121);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								}
+							} else {
+								if (genItemType.getGenPackage().isDataTypeConverters()) {
+									genItemType = genItemType.getObjectType();
+									stringBuffer.append(TEXT_168);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_158);
+									stringBuffer.append(genItemType.getName());
+									stringBuffer.append(TEXT_165);
+									stringBuffer.append(genItemType.getObjectInstanceClassName());
+									stringBuffer.append(TEXT_30);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								} else {
+									stringBuffer.append(TEXT_168);
+									stringBuffer.append(
+											genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_159);
+									stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_121);
+									stringBuffer.append(item);
+									stringBuffer.append(TEXT_166);
+								}
+							}
+							stringBuffer.append(TEXT_169);
+						} else if (!genDataType.getMemberTypes().isEmpty()) {
+							if (!genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_170);
+								for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+									stringBuffer.append(TEXT_126);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_171);
+									if (genMemberType.getGenPackage() == genPackage) {
+										if (genPackage.isDataTypeConverters()) {
+											if (genMemberType.getQualifiedInstanceClassName()
+													.equals(genDataType.getQualifiedInstanceClassName())) {
+												stringBuffer.append(TEXT_172);
+												stringBuffer.append(genMemberType.getName());
+												stringBuffer.append(TEXT_157);
+											} else if (genMemberType.isPrimitiveType() && !isJDK50) {
+												stringBuffer.append(TEXT_172);
+												stringBuffer.append(genMemberType.getName());
+												stringBuffer.append(TEXT_173);
+												stringBuffer.append(
+														genMemberType.getObjectType().getImportedInstanceClassName());
+												stringBuffer.append(TEXT_174);
+												stringBuffer.append(genMemberType.getPrimitiveValueFunction());
+												stringBuffer.append(TEXT_175);
+											} else {
+												stringBuffer.append(TEXT_172);
+												stringBuffer.append(genMemberType.getName());
+												stringBuffer.append(TEXT_165);
+												stringBuffer.append(genMemberType.getObjectType()
+														.getImportedBoundedWildcardInstanceClassName());
+												stringBuffer.append(TEXT_176);
+											}
+										} else {
+											stringBuffer.append(TEXT_172);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_167);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_160);
+										}
+									} else {
+										if (genMemberType.getGenPackage().isDataTypeConverters()) {
+											genMemberType = genMemberType.getObjectType();
+											stringBuffer.append(TEXT_177);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_158);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_165);
+											stringBuffer.append(genMemberType.getObjectInstanceClassName());
+											stringBuffer.append(TEXT_176);
+										} else {
+											stringBuffer.append(TEXT_177);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_159);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_160);
+										}
+									}
+									stringBuffer.append(TEXT_178);
+								}
+							} else {
+								for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+									stringBuffer.append(TEXT_113);
+									if (genMemberType.getGenPackage() == genPackage) {
+										if (genPackage.isDataTypeConverters()) {
+											stringBuffer.append(TEXT_179);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_157);
+										} else {
+											stringBuffer.append(TEXT_179);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_167);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_121);
+											if (!isJDK50) {
+												stringBuffer.append(TEXT_122);
+												stringBuffer.append(genMemberType.getObjectInstanceClassName());
+												stringBuffer.append(TEXT_180);
+											} else {
+												stringBuffer.append(TEXT_152);
+											}
+											stringBuffer.append(TEXT_69);
+										}
+									} else {
+										if (genMemberType.getGenPackage().isDataTypeConverters()) {
+											stringBuffer.append(TEXT_181);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_158);
+											stringBuffer.append(genMemberType.getName());
+											stringBuffer.append(TEXT_157);
+										} else {
+											stringBuffer.append(TEXT_181);
+											stringBuffer.append(genMemberType.getGenPackage()
+													.getQualifiedEFactoryInternalInstanceAccessor());
+											stringBuffer.append(TEXT_159);
+											stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+											stringBuffer.append(TEXT_121);
+											if (!isJDK50) {
+												stringBuffer.append(TEXT_122);
+												stringBuffer.append(genMemberType.getObjectInstanceClassName());
+												stringBuffer.append(TEXT_180);
+											} else {
+												stringBuffer.append(TEXT_152);
+											}
+											stringBuffer.append(TEXT_69);
+										}
+									}
+									stringBuffer.append(TEXT_182);
+								}
+							}
+							stringBuffer.append(TEXT_183);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_184);
+						} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+								&& (genDataType.isArrayType()
+										|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+										|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+							stringBuffer.append(TEXT_185);
+						} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+							stringBuffer.append(TEXT_131);
+							stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+							stringBuffer.append(TEXT_44);
+						} else if (genDataType.isPrimitiveType() && !isJDK50) {
+							stringBuffer.append(TEXT_186);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_187);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_188);
+						} else {
+							stringBuffer.append(TEXT_186);
+							stringBuffer.append(eDataType);
+							stringBuffer.append(TEXT_160);
+						}
+						stringBuffer.append(TEXT_136);
+					}
+					stringBuffer.append(TEXT_58);
+					if (genDataType.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (genModel.useGenerics() && (genDataType.getItemType() != null || genDataType.isUncheckedCast())
+							&& (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody())) {
+						stringBuffer.append(TEXT_75);
+					}
+					if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					stringBuffer.append(TEXT_151);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_167);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EDataType"));
+					stringBuffer.append(TEXT_189);
+					if (genDataType instanceof GenEnum) {
+						if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(genDataType.getImportedInstanceClassName());
+							stringBuffer.append(TEXT_176);
+						} else {
+							stringBuffer.append(TEXT_153);
+						}
+					} else if (genDataType.getBaseType() != null) {
+						GenDataType genBaseType = genDataType.getBaseType();
+						if (genBaseType.getGenPackage() == genPackage) {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genBaseType.getName());
+							stringBuffer.append(TEXT_167);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_160);
+						} else {
+							stringBuffer.append(TEXT_73);
+							stringBuffer
+									.append(genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+							stringBuffer.append(TEXT_159);
+							stringBuffer.append(genBaseType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_160);
+						}
+					} else if (genDataType.getItemType() != null) {
+						GenDataType genItemType = genDataType.getItemType();
+						if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_176);
+						} else {
+							final String singleWildcard = genModel.useGenerics() ? "<?>" : "";
+							stringBuffer.append(TEXT_190);
+							stringBuffer.append(genModel.getImportedName("java.util.List"));
+							stringBuffer.append(singleWildcard);
+							stringBuffer.append(TEXT_191);
+							stringBuffer.append(genModel.getImportedName("java.util.List"));
+							stringBuffer.append(singleWildcard);
+							stringBuffer.append(TEXT_192);
+							stringBuffer.append(genModel.getImportedName("java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("java.lang.StringBuffer"));
+							stringBuffer.append(TEXT_44);
+							String item;
+							if (!genModel.useGenerics()) {
+								item = "i.next()";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+								stringBuffer.append(TEXT_193);
+							} else {
+								item = "item";
+								stringBuffer.append(TEXT_98);
+								stringBuffer.append(genModel.getImportedName("java.lang.Object"));
+								stringBuffer.append(TEXT_194);
+							}
+							stringBuffer.append(TEXT_102);
+							if (genItemType.getGenPackage() == genPackage) {
+								stringBuffer.append(TEXT_164);
+								stringBuffer.append(genItemType.getName());
+								stringBuffer.append(TEXT_167);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_121);
+								stringBuffer.append(item);
+								stringBuffer.append(TEXT_166);
+							} else {
+								stringBuffer.append(TEXT_168);
+								stringBuffer.append(
+										genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+								stringBuffer.append(TEXT_159);
+								stringBuffer.append(genItemType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_121);
+								stringBuffer.append(item);
+								stringBuffer.append(TEXT_166);
+							}
+							stringBuffer.append(TEXT_169);
+						}
+					} else if (!genDataType.getMemberTypes().isEmpty()) {
+						if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+							if (genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_154);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_173);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_195);
+								if (!isJDK50) {
+									stringBuffer.append(TEXT_41);
+									stringBuffer.append(genDataType.getPrimitiveValueFunction());
+									stringBuffer.append(TEXT_71);
+								}
+								stringBuffer.append(TEXT_69);
+							} else {
+								stringBuffer.append(TEXT_156);
+								stringBuffer.append(genDataType.getName());
+								stringBuffer.append(TEXT_157);
+							}
+						} else {
+							stringBuffer.append(TEXT_170);
+							for (GenDataType genMemberType : genDataType.getMemberTypes()) {
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_171);
+								if (genMemberType.getGenPackage() == genPackage) {
+									stringBuffer.append(TEXT_172);
+									stringBuffer.append(genMemberType.getName());
+									stringBuffer.append(TEXT_167);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_160);
+								} else {
+									stringBuffer.append(TEXT_177);
+									stringBuffer.append(genMemberType.getGenPackage()
+											.getQualifiedEFactoryInternalInstanceAccessor());
+									stringBuffer.append(TEXT_159);
+									stringBuffer.append(genMemberType.getQualifiedClassifierAccessor());
+									stringBuffer.append(TEXT_160);
+								}
+								stringBuffer.append(TEXT_178);
+							}
+							stringBuffer.append(TEXT_196);
+						}
+					} else if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {
+						if (genDataType.isPrimitiveType()) {
+							stringBuffer.append(TEXT_154);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_76);
+							if (!isJDK50) {
+								stringBuffer.append(TEXT_76);
+							}
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_197);
+							if (!isJDK50) {
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genDataType.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_71);
+							}
+							stringBuffer.append(TEXT_69);
+						} else {
+							stringBuffer.append(TEXT_156);
+							stringBuffer.append(genDataType.getName());
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_176);
+						}
+					} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics()
+							&& (genDataType.isArrayType()
+									|| !genDataType.getEcoreDataType().getETypeParameters().isEmpty()
+									|| genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {
+						stringBuffer.append(TEXT_185);
+					} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_131);
+						stringBuffer.append(genModel.getImportedName("java.lang.UnsupportedOperationException"));
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_199);
+					}
+					stringBuffer.append(TEXT_136);
+				}
+			}
+		} else {
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (genClass.hasFactoryInterfaceCreateMethod()) {
+					stringBuffer.append(TEXT_200);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_201);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_202);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_60);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_61);
+					}
+					stringBuffer.append(TEXT_203);
+					stringBuffer.append(genClass.getTypeParameters());
+					stringBuffer.append(genClass.getImportedInterfaceName());
+					stringBuffer.append(genClass.getInterfaceTypeArguments());
+					stringBuffer.append(TEXT_63);
+					stringBuffer.append(genClass.getName());
+					stringBuffer.append(TEXT_204);
+				}
+			}
+			if (genPackage.isDataTypeConverters()) {
+				for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+					if (genDataType.isSerializable()) {
+						stringBuffer.append(TEXT_205);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_206);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						stringBuffer.append(TEXT_203);
+						stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_207);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_208);
+						if (genDataType.hasAPITags()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genDataType.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_60);
+						if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_61);
+						}
+						stringBuffer.append(TEXT_209);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(genDataType.getImportedBoundedWildcardInstanceClassName());
+						stringBuffer.append(TEXT_210);
+					}
+				}
+			}
+		}
+		if (!isImplementation && !genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_211);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_212);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_204);
+		} else if (isImplementation) {
+			stringBuffer.append(TEXT_47);
+			if (useInterfaceOverrideAnnotation && !genModel.isSuppressEMFMetaData()) {
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_62);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_212);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_213);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_214);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_61);
+			}
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_215);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_216);
+		}
+		stringBuffer.append(TEXT_217);
+		stringBuffer.append(isInterface ? genPackage.getFactoryInterfaceName() : genPackage.getFactoryClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers() && !genModel.isSuppressInterfaces());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Interface.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Interface.java
new file mode 100644
index 0000000..e1f9628
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Interface.java
@@ -0,0 +1,2262 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Interface extends org.eclipse.egf.emf.pattern.base.GenClassJava {
+	protected static String nl;
+
+	public static synchronized Interface create(String lineSeparator) {
+		nl = lineSeparator;
+		Interface result = new Interface();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * An implementation of the model object '<em><b>";
+	protected final String TEXT_6 = "</b></em>'." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_7 = NL + " * <p>" + NL + " * The following features are implemented:" + NL + " * </p>"
+			+ NL + " * <ul>";
+	protected final String TEXT_8 = NL + " *   <li>{@link ";
+	protected final String TEXT_9 = "#";
+	protected final String TEXT_10 = " <em>";
+	protected final String TEXT_11 = "</em>}</li>";
+	protected final String TEXT_12 = NL + " * </ul>";
+	protected final String TEXT_13 = NL + " *";
+	protected final String TEXT_14 = NL + " * ";
+	protected final String TEXT_15 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_16 = NL + "@Deprecated";
+	protected final String TEXT_17 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_18 = NL + "public";
+	protected final String TEXT_19 = " abstract";
+	protected final String TEXT_20 = " class ";
+	protected final String TEXT_21 = NL + "public interface ";
+	protected final String TEXT_22 = NL + "{";
+	protected final String TEXT_23 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_24 = " copyright = ";
+	protected final String TEXT_25 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_26 = " mofDriverNumber = \"";
+	protected final String TEXT_27 = "\";";
+	protected final String TEXT_28 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate static final long serialVersionUID = 1L;" + NL;
+	protected final String TEXT_29 = NL + "\t/**" + NL
+			+ "\t * An array of objects representing the values of non-primitive features." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_30 = NL + "\t@";
+	protected final String TEXT_31 = NL + "\tprotected Object[] ";
+	protected final String TEXT_32 = ";" + NL;
+	protected final String TEXT_33 = NL + "\t/**" + NL
+			+ "\t * A bit field representing the indices of non-primitive feature values." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_34 = NL + "\tprotected int ";
+	protected final String TEXT_35 = NL + "\t/**" + NL
+			+ "\t * A set of bit flags representing the values of boolean attributes and whether unsettable features have been set."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_36 = " = 0;" + NL;
+	protected final String TEXT_37 = NL + "\t/**" + NL + "\t * The empty value for the '{@link #";
+	protected final String TEXT_38 = "() <em>";
+	protected final String TEXT_39 = "</em>}' array accessor." + NL
+			+ "\t * This is specialized for the more specific element type known in this context." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_40 = "()";
+	protected final String TEXT_41 = NL + "\t * ";
+	protected final String TEXT_42 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_43 = NL + "\t@Deprecated";
+	protected final String TEXT_44 = NL + "\t@SuppressWarnings(\"rawtypes\")";
+	protected final String TEXT_45 = NL + "\tprotected static final ";
+	protected final String TEXT_46 = "[] ";
+	protected final String TEXT_47 = "_EEMPTY_ARRAY = new ";
+	protected final String TEXT_48 = " [0]";
+	protected final String TEXT_49 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate static final int ";
+	protected final String TEXT_50 = " = ";
+	protected final String TEXT_51 = ".getFeatureID(";
+	protected final String TEXT_52 = ") - ";
+	protected final String TEXT_53 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_54 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_55 = NL + "\tprivate static final int ";
+	protected final String TEXT_56 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate static final int EOPERATION_OFFSET_CORRECTION = ";
+	protected final String TEXT_57 = ".getOperationID(";
+	protected final String TEXT_58 = "public";
+	protected final String TEXT_59 = "protected";
+	protected final String TEXT_60 = " ";
+	protected final String TEXT_61 = "()" + NL + "\t{";
+	protected final String TEXT_62 = NL + "\t\t";
+	protected final String TEXT_63 = " |= ";
+	protected final String TEXT_64 = "_EFLAG";
+	protected final String TEXT_65 = "_DEFAULT";
+	protected final String TEXT_66 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_67 = NL + "\t@Override";
+	protected final String TEXT_68 = NL + "\tprotected ";
+	protected final String TEXT_69 = " eStaticClass()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_70 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_71 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_72 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_73 = NL + "\tpublic ";
+	protected final String TEXT_74 = " eInverseAdd(";
+	protected final String TEXT_75 = " otherEnd, int featureID, ";
+	protected final String TEXT_76 = " msgs)" + NL + "\t{" + NL + "\t\tswitch (featureID";
+	protected final String TEXT_77 = ")" + NL + "\t\t{";
+	protected final String TEXT_78 = NL + "\t\t\tcase ";
+	protected final String TEXT_79 = ":";
+	protected final String TEXT_80 = NL + "\t\t\t\treturn ((";
+	protected final String TEXT_81 = "(";
+	protected final String TEXT_82 = ".InternalMapView";
+	protected final String TEXT_83 = ")";
+	protected final String TEXT_84 = "()).eMap()).basicAdd(otherEnd, msgs);";
+	protected final String TEXT_85 = NL + "\t\t\t\treturn (";
+	protected final String TEXT_86 = "()).basicAdd(otherEnd, msgs);";
+	protected final String TEXT_87 = NL + "\t\t\t\tif (eInternalContainer() != null)" + NL
+			+ "\t\t\t\t\tmsgs = eBasicRemoveFromContainer(msgs);";
+	protected final String TEXT_88 = NL + "\t\t\t\treturn basicSet";
+	protected final String TEXT_89 = "((";
+	protected final String TEXT_90 = ")otherEnd, msgs);";
+	protected final String TEXT_91 = NL + "\t\t\t\treturn eBasicSetContainer(otherEnd, ";
+	protected final String TEXT_92 = ", msgs);";
+	protected final String TEXT_93 = NL + "\t\t\t\t";
+	protected final String TEXT_94 = " = (";
+	protected final String TEXT_95 = ")eVirtualGet(";
+	protected final String TEXT_96 = ");";
+	protected final String TEXT_97 = "basicGet";
+	protected final String TEXT_98 = "();";
+	protected final String TEXT_99 = NL + "\t\t\t\tif (";
+	protected final String TEXT_100 = " != null)";
+	protected final String TEXT_101 = NL + "\t\t\t\t\tmsgs = ";
+	protected final String TEXT_102 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_103 = ", null, msgs);";
+	protected final String TEXT_104 = ".eInverseRemove(this, ";
+	protected final String TEXT_105 = ", ";
+	protected final String TEXT_106 = ".class, msgs);";
+	protected final String TEXT_107 = NL + "\t\t\tdefault:";
+	protected final String TEXT_108 = NL + "\t\t}";
+	protected final String TEXT_109 = "\t\treturn super.eInverseAdd(otherEnd, featureID, msgs);";
+	protected final String TEXT_110 = "\t\treturn eDynamicInverseAdd(otherEnd, featureID, msgs);";
+	protected final String TEXT_111 = NL + "\t}" + NL;
+	protected final String TEXT_112 = " eInverseRemove(";
+	protected final String TEXT_113 = ")((";
+	protected final String TEXT_114 = "()).eMap()).basicRemove(otherEnd, msgs);";
+	protected final String TEXT_115 = ".Internal.Wrapper)";
+	protected final String TEXT_116 = "()).featureMap()).basicRemove(otherEnd, msgs);";
+	protected final String TEXT_117 = "()).basicRemove(otherEnd, msgs);";
+	protected final String TEXT_118 = NL + "\t\t\t\treturn eBasicSetContainer(null, ";
+	protected final String TEXT_119 = NL + "\t\t\t\treturn basicUnset";
+	protected final String TEXT_120 = "(msgs);";
+	protected final String TEXT_121 = "(null, msgs);";
+	protected final String TEXT_122 = "\t\treturn super.eInverseRemove(otherEnd, featureID, msgs);";
+	protected final String TEXT_123 = "\t\treturn eDynamicInverseRemove(otherEnd, featureID, msgs);";
+	protected final String TEXT_124 = " eBasicRemoveFromContainerFeature(";
+	protected final String TEXT_125 = " msgs)" + NL + "\t{" + NL + "\t\tswitch (eContainerFeatureID()";
+	protected final String TEXT_126 = ":" + NL + "\t\t\t\treturn eInternalContainer().eInverseRemove(this, ";
+	protected final String TEXT_127 = "\t\treturn super.eBasicRemoveFromContainerFeature(msgs);";
+	protected final String TEXT_128 = "\t\treturn eDynamicBasicRemoveFromContainer(msgs);";
+	protected final String TEXT_129 = NL + "\tpublic Object eGet(int featureID, boolean resolve, boolean coreType)" + NL
+			+ "\t{" + NL + "\t\tswitch (featureID";
+	protected final String TEXT_130 = NL + "\t\t\t\treturn ";
+	protected final String TEXT_131 = "() ? Boolean.TRUE : Boolean.FALSE;";
+	protected final String TEXT_132 = NL + "\t\t\t\treturn new ";
+	protected final String TEXT_133 = "());";
+	protected final String TEXT_134 = NL + "\t\t\t\tif (resolve) return ";
+	protected final String TEXT_135 = "();" + NL + "\t\t\t\treturn basicGet";
+	protected final String TEXT_136 = NL + "\t\t\t\tif (coreType) return ((";
+	protected final String TEXT_137 = "()).eMap();" + NL + "\t\t\t\telse return ";
+	protected final String TEXT_138 = NL + "\t\t\t\tif (coreType) return ";
+	protected final String TEXT_139 = "();" + NL + "\t\t\t\telse return ";
+	protected final String TEXT_140 = "().map();";
+	protected final String TEXT_141 = "()).featureMap();" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_142 = "();" + NL + "\t\t\t\treturn ((";
+	protected final String TEXT_143 = ".Internal)";
+	protected final String TEXT_144 = "()).getWrapper();";
+	protected final String TEXT_145 = "\t\treturn super.eGet(featureID, resolve, coreType);";
+	protected final String TEXT_146 = "\t\treturn eDynamicGet(featureID, resolve, coreType);";
+	protected final String TEXT_147 = NL + "\tpublic void eSet(int featureID, Object newValue)" + NL + "\t{" + NL
+			+ "\t\tswitch (featureID";
+	protected final String TEXT_148 = NL + "\t\t\t\t((";
+	protected final String TEXT_149 = ".Internal)((";
+	protected final String TEXT_150 = "()).featureMap()).set(newValue);";
+	protected final String TEXT_151 = "()).set(newValue);";
+	protected final String TEXT_152 = ".Setting)((";
+	protected final String TEXT_153 = "()).eMap()).set(newValue);";
+	protected final String TEXT_154 = ".Setting)";
+	protected final String TEXT_155 = "().clear();" + NL + "\t\t\t\t";
+	protected final String TEXT_156 = "().addAll((";
+	protected final String TEXT_157 = "<? extends ";
+	protected final String TEXT_158 = ">";
+	protected final String TEXT_159 = ")newValue);";
+	protected final String TEXT_160 = NL + "\t\t\t\tset";
+	protected final String TEXT_161 = "(((";
+	protected final String TEXT_162 = ")newValue).";
+	protected final String TEXT_163 = "newValue);";
+	protected final String TEXT_164 = NL + "\t\t\t\treturn;";
+	protected final String TEXT_165 = "\t\tsuper.eSet(featureID, newValue);";
+	protected final String TEXT_166 = "\t\teDynamicSet(featureID, newValue);";
+	protected final String TEXT_167 = NL + "\tpublic int eBaseStructuralFeatureID(int derivedFeatureID, Class";
+	protected final String TEXT_168 = " baseClass)" + NL + "\t{";
+	protected final String TEXT_169 = NL + "\t\tif (baseClass == ";
+	protected final String TEXT_170 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (derivedFeatureID";
+	protected final String TEXT_171 = ")" + NL + "\t\t\t{";
+	protected final String TEXT_172 = NL + "\t\t\t\tcase ";
+	protected final String TEXT_173 = ": return ";
+	protected final String TEXT_174 = NL + "\t\t\t\tdefault: return -1;" + NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_175 = NL + "\t\treturn super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);"
+			+ NL + "\t}";
+	protected final String TEXT_176 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_177 = NL + "\tpublic int eDerivedStructuralFeatureID(int baseFeatureID, Class";
+	protected final String TEXT_178 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseFeatureID)" + NL + "\t\t\t{";
+	protected final String TEXT_179 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseFeatureID";
+	protected final String TEXT_180 = NL + "\t\treturn super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);"
+			+ NL + "\t}" + NL;
+	protected final String TEXT_181 = NL + "\tpublic int eDerivedOperationID(int baseOperationID, Class";
+	protected final String TEXT_182 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseOperationID)" + NL + "\t\t\t{";
+	protected final String TEXT_183 = NL
+			+ "\t\t\t\tdefault: return super.eDerivedOperationID(baseOperationID, baseClass);" + NL + "\t\t\t}" + NL
+			+ "\t\t}";
+	protected final String TEXT_184 = ".class)" + NL + "\t\t{" + NL + "\t\t\tswitch (baseOperationID";
+	protected final String TEXT_185 = NL + "\t\treturn super.eDerivedOperationID(baseOperationID, baseClass);" + NL
+			+ "\t}" + NL;
+	protected final String TEXT_186 = NL + "\tprotected Object[] eVirtualValues()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_187 = ";" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_188 = NL + "\tprotected void eSetVirtualValues(Object[] newValues)" + NL + "\t{" + NL
+			+ "\t\t";
+	protected final String TEXT_189 = " = newValues;" + NL + "\t}" + NL;
+	protected final String TEXT_190 = NL + "\tprotected int eVirtualIndexBits(int offset)" + NL + "\t{" + NL
+			+ "\t\tswitch (offset)" + NL + "\t\t{";
+	protected final String TEXT_191 = " :" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_192 = NL + "\t\t\tdefault :" + NL + "\t\t\t\tthrow new IndexOutOfBoundsException();"
+			+ NL + "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_193 = NL + "\tprotected void eSetVirtualIndexBits(int offset, int newIndexBits)" + NL
+			+ "\t{" + NL + "\t\tswitch (offset)" + NL + "\t\t{";
+	protected final String TEXT_194 = " :" + NL + "\t\t\t\t";
+	protected final String TEXT_195 = " = newIndexBits;" + NL + "\t\t\t\tbreak;";
+	protected final String TEXT_196 = NL + "\t\t\tdefault :" + NL + "\t\t\t\tthrow new IndexOutOfBoundsException();"
+			+ NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_197 = NL + "\t@SuppressWarnings(";
+	protected final String TEXT_198 = "\"unchecked\"";
+	protected final String TEXT_199 = "{\"rawtypes\", \"unchecked\" }";
+	protected final String TEXT_200 = NL + "\tpublic Object eInvoke(int operationID, ";
+	protected final String TEXT_201 = " arguments) throws ";
+	protected final String TEXT_202 = NL + "\t{" + NL + "\t\tswitch (operationID";
+	protected final String TEXT_203 = NL + "\t\t\t\ttry" + NL + "\t\t\t\t{";
+	protected final String TEXT_204 = "arguments.get(";
+	protected final String TEXT_205 = ").";
+	protected final String TEXT_206 = ");" + NL + "\t\t\t\t";
+	protected final String TEXT_207 = "return null;";
+	protected final String TEXT_208 = "return ";
+	protected final String TEXT_209 = "new ";
+	protected final String TEXT_210 = NL + "\t\t\t\t}" + NL + "\t\t\t\tcatch (";
+	protected final String TEXT_211 = " throwable)" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tthrow new ";
+	protected final String TEXT_212 = "(throwable);" + NL + "\t\t\t\t}";
+	protected final String TEXT_213 = "\t\treturn super.eInvoke(operationID, arguments);";
+	protected final String TEXT_214 = "\t\treturn eDynamicInvoke(operationID, arguments);";
+	protected final String TEXT_215 = NL + "\tpublic String toString()" + NL + "\t{" + NL
+			+ "\t\tif (eIsProxy()) return super.toString();" + NL + "" + NL + "\t\t";
+	protected final String TEXT_216 = " result = new ";
+	protected final String TEXT_217 = "(super.toString());";
+	protected final String TEXT_218 = NL + "\t\tresult.append(\" (";
+	protected final String TEXT_219 = ": \");";
+	protected final String TEXT_220 = NL + "\t\tresult.append(\", ";
+	protected final String TEXT_221 = NL + "\t\tif (eVirtualIsSet(";
+	protected final String TEXT_222 = ")) result.append(eVirtualGet(";
+	protected final String TEXT_223 = ")); else result.append(\"<unset>\");";
+	protected final String TEXT_224 = NL + "\t\tif (";
+	protected final String TEXT_225 = " & ";
+	protected final String TEXT_226 = "_ESETFLAG) != 0";
+	protected final String TEXT_227 = "ESet";
+	protected final String TEXT_228 = ") result.append((";
+	protected final String TEXT_229 = "_EFLAG) != 0); else result.append(\"<unset>\");";
+	protected final String TEXT_230 = ") result.append(";
+	protected final String TEXT_231 = "_EFLAG_VALUES[(";
+	protected final String TEXT_232 = "_EFLAG) >>> ";
+	protected final String TEXT_233 = "_EFLAG_OFFSET]); else result.append(\"<unset>\");";
+	protected final String TEXT_234 = "); else result.append(\"<unset>\");";
+	protected final String TEXT_235 = NL + "\t\tresult.append(eVirtualGet(";
+	protected final String TEXT_236 = "));";
+	protected final String TEXT_237 = NL + "\t\tresult.append((";
+	protected final String TEXT_238 = "_EFLAG) != 0);";
+	protected final String TEXT_239 = NL + "\t\tresult.append(";
+	protected final String TEXT_240 = "_EFLAG_OFFSET]);";
+	protected final String TEXT_241 = NL + "\t\tresult.append(')');" + NL + "\t\treturn result.toString();" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_242 = NL + "\tprotected int hash = -1;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_243 = NL + "\tpublic int getHash()" + NL + "\t{" + NL + "\t\tif (hash == -1)" + NL
+			+ "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_244 = " theKey = getKey();" + NL
+			+ "\t\t\thash = (theKey == null ? 0 : theKey.hashCode());" + NL + "\t\t}" + NL + "\t\treturn hash;" + NL
+			+ "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_245 = NL + "\tpublic void setHash(int hash)" + NL + "\t{" + NL + "\t\tthis.hash = hash;"
+			+ NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_246 = " getKey()" + NL + "\t{";
+	protected final String TEXT_247 = NL + "\t\treturn new ";
+	protected final String TEXT_248 = "(getTypedKey());";
+	protected final String TEXT_249 = NL + "\t\treturn getTypedKey();";
+	protected final String TEXT_250 = NL + "\tpublic void setKey(";
+	protected final String TEXT_251 = " key)" + NL + "\t{";
+	protected final String TEXT_252 = NL + "\t\tgetTypedKey().addAll(";
+	protected final String TEXT_253 = "key);";
+	protected final String TEXT_254 = NL + "\t\tsetTypedKey(key);";
+	protected final String TEXT_255 = NL + "\t\tsetTypedKey(((";
+	protected final String TEXT_256 = ")key).";
+	protected final String TEXT_257 = NL + "\t\tsetTypedKey((";
+	protected final String TEXT_258 = ")key);";
+	protected final String TEXT_259 = " getValue()" + NL + "\t{";
+	protected final String TEXT_260 = "(getTypedValue());";
+	protected final String TEXT_261 = NL + "\t\treturn getTypedValue();";
+	protected final String TEXT_262 = " setValue(";
+	protected final String TEXT_263 = " value)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_264 = " oldValue = getValue();";
+	protected final String TEXT_265 = NL + "\t\tgetTypedValue().clear();" + NL + "\t\tgetTypedValue().addAll(";
+	protected final String TEXT_266 = "value);";
+	protected final String TEXT_267 = NL + "\t\tsetTypedValue(value);";
+	protected final String TEXT_268 = NL + "\t\tsetTypedValue(((";
+	protected final String TEXT_269 = ")value).";
+	protected final String TEXT_270 = NL + "\t\tsetTypedValue((";
+	protected final String TEXT_271 = ")value);";
+	protected final String TEXT_272 = NL + "\t\treturn oldValue;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_273 = " getEMap()" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_274 = " container = eContainer();" + NL + "\t\treturn container == null ? null : (";
+	protected final String TEXT_275 = ")container.eGet(eContainmentFeature());" + NL + "\t}" + NL;
+	protected final String TEXT_276 = NL + "} //";
+	protected final String TEXT_277 = NL;
+
+	public Interface() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_277);
+		stringBuffer.append(TEXT_277);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenClass genClass = parameter;
+		targetPath = genClass.getGenModel().getModelDirectory();
+		packageName = genClass.getGenPackage().getInterfacePackageName();
+		className = genClass.getInterfaceName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenClass genClass = parameter;
+		argument = ((Object[]) new Object[] { new Object[] { genClass, Boolean.TRUE, Boolean.FALSE } })[0];
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2019 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+		 */
+
+		final GenClass genClass = (GenClass) ((Object[]) argument)[0];
+		final GenPackage genPackage = genClass.getGenPackage();
+		final GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		final boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
+		final boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
+		final boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation()
+				&& !(isInterface && isImplementation);
+		final boolean isGWT = genModel.getRuntimePlatform() == GenRuntimePlatform.GWT;
+		final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();
+		final String indentDefaultCase = forceDefaultCase ? "\t\t" : "";
+		final String publicStaticFinalFlag = isImplementation ? "public static final " : "";
+		final String singleWildcard = isJDK50 ? "<?>" : "";
+		final String negativeOffsetCorrection = genClass.hasOffsetCorrection()
+				? " - " + genClass.getOffsetCorrectionField(null)
+				: "";
+		final String positiveOffsetCorrection = genClass.hasOffsetCorrection()
+				? " + " + genClass.getOffsetCorrectionField(null)
+				: "";
+		final String negativeOperationOffsetCorrection = genClass.hasOffsetCorrection()
+				? " - EOPERATION_OFFSET_CORRECTION"
+				: "";
+		final String positiveOperationOffsetCorrection = genClass.hasOffsetCorrection()
+				? " + EOPERATION_OFFSET_CORRECTION"
+				: "";
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getInterfacePackageName());
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getClassPackageName());
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		genModel.markImportLocation(stringBuffer, genPackage);
+		if (isImplementation) {
+			genClass.addClassPsuedoImports();
+		}
+		stringBuffer.append(TEXT_4);
+		if (isInterface) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.interface.javadoc.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_BsLUkeXDEeCxnsoQRwU99Q",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/interface.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_6);
+			if (!genClass.getImplementedGenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_7);
+				for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genClass.getQualifiedClassName());
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_11);
+				}
+				stringBuffer.append(TEXT_12);
+			}
+			stringBuffer.append(TEXT_13);
+			if (genClass.hasImplicitAPITags()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_15);
+		}
+		if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_16);
+		}
+		if (isImplementation) {
+			if (isJDK50 && !genClass.hasAPIDeprecatedTag()
+					&& GenModelUtil.hasImplicitAPIDeprecatedTag(genClass.getEGetGenFeatures(),
+							genClass.getEIsSetGenFeatures(), genClass.getESetGenFeatures(),
+							genClass.getEUnsetGenFeatures(), genClass.getEInverseAddGenFeatures(),
+							genClass.getEInverseRemoveGenFeatures(), genClass.getEBasicRemoveFromContainerGenFeatures(),
+							genClass.getToStringGenFeatures())) {
+				stringBuffer.append(TEXT_17);
+			}
+			stringBuffer.append(TEXT_18);
+			if (genClass.isAbstract()) {
+				stringBuffer.append(TEXT_19);
+			}
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genClass.getClassName());
+			stringBuffer.append(genClass.getTypeParameters().trim());
+			stringBuffer.append(genClass.getClassExtends());
+			stringBuffer.append(genClass.getClassImplements());
+		} else {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genClass.getInterfaceName());
+			stringBuffer.append(genClass.getTypeParameters().trim());
+			stringBuffer.append(genClass.getInterfaceExtends());
+		}
+		stringBuffer.append(TEXT_22);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isImplementation && genModel.getDriverNumber() != null) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genModel.getDriverNumber());
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isImplementation && genClass.isJavaIOSerializable()) {
+			stringBuffer.append(TEXT_28);
+		}
+		if (isImplementation && genModel.isVirtualDelegation()) {
+			String eVirtualValuesField = genClass.getEVirtualValuesField();
+			if (eVirtualValuesField != null) {
+				stringBuffer.append(TEXT_29);
+				if (isGWT) {
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+				}
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(eVirtualValuesField);
+				stringBuffer.append(TEXT_32);
+			}
+			{
+				List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());
+				if (!eVirtualIndexBitFields.isEmpty()) {
+					for (String eVirtualIndexBitField : eVirtualIndexBitFields) {
+						stringBuffer.append(TEXT_33);
+						if (isGWT) {
+							stringBuffer.append(TEXT_30);
+							stringBuffer
+									.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+						}
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(eVirtualIndexBitField);
+						stringBuffer.append(TEXT_32);
+					}
+				}
+			}
+		}
+		if (isImplementation && genClass.isModelRoot() && genModel.isBooleanFlagsEnabled()
+				&& genModel.getBooleanFlagsReservedBits() == -1) {
+			stringBuffer.append(TEXT_35);
+			if (isGWT) {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+			}
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genModel.getBooleanFlagsField());
+			stringBuffer.append(TEXT_36);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()) {
+			for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {
+				if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+						&& !genFeature.isMapType()) {
+					String rawListItemType = genFeature.getRawListItemType(genClass);
+					int index = rawListItemType.indexOf('[');
+					String head = rawListItemType;
+					String tail = "";
+					if (index != -1) {
+						head = rawListItemType.substring(0, index);
+						tail = rawListItemType.substring(index);
+					}
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(genFeature.getGetArrayAccessor());
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genFeature.getGetArrayAccessor());
+					stringBuffer.append(TEXT_40);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_42);
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_43);
+					}
+					if (genFeature.getQualifiedListItemType(genClass).contains("<")
+							|| genFeature.getArrayItemType(genClass).contains("<")) {
+						stringBuffer.append(TEXT_44);
+					}
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(rawListItemType);
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(head);
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(tail);
+					stringBuffer.append(TEXT_32);
+				}
+			}
+			for (GenFeature genFeature : genClass.getDeclaredFieldGenFeatures()) {
+				stringBuffer.append(TEXT_4);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.declaredFieldGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0u0bgWJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/declaredFieldGenFeature.override.javajetinc
+			}
+		}
+		if (isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genClass.getOffsetCorrectionField(null));
+			stringBuffer.append(TEXT_50);
+			stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_51);
+			stringBuffer.append(genClass.getImplementedGenFeatures().get(0).getQualifiedFeatureAccessor());
+			stringBuffer.append(TEXT_52);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genClass.getImplementedGenFeatures().get(0)));
+			stringBuffer.append(TEXT_32);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()) {
+			for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {
+				GenFeature reverseFeature = genFeature.getReverse();
+				if (reverseFeature != null && reverseFeature.getGenClass().hasOffsetCorrection()) {
+					stringBuffer.append(TEXT_53);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_54);
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_43);
+					}
+					stringBuffer.append(TEXT_55);
+					stringBuffer.append(genClass.getOffsetCorrectionField(genFeature));
+					stringBuffer.append(TEXT_50);
+					stringBuffer.append(reverseFeature.getGenClass().getQualifiedClassifierAccessor());
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(reverseFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(reverseFeature.getGenClass().getQualifiedFeatureID(reverseFeature));
+					stringBuffer.append(TEXT_32);
+				}
+			}
+		}
+		if (genModel.isOperationReflection() && isImplementation && genClass.hasOffsetCorrection()
+				&& !genClass.getImplementedGenOperations().isEmpty()) {
+			stringBuffer.append(TEXT_56);
+			stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_57);
+			stringBuffer.append(genClass.getImplementedGenOperations().get(0).getQualifiedOperationAccessor());
+			stringBuffer.append(TEXT_52);
+			stringBuffer.append(genClass.getQualifiedOperationID(genClass.getImplementedGenOperations().get(0)));
+			stringBuffer.append(TEXT_32);
+		}
+		if (isImplementation) {
+			stringBuffer.append(TEXT_23);
+			if (genModel.isPublicConstructors()) {
+				stringBuffer.append(TEXT_58);
+			} else {
+				stringBuffer.append(TEXT_59);
+			}
+			stringBuffer.append(TEXT_60);
+			stringBuffer.append(genClass.getClassName());
+			stringBuffer.append(TEXT_61);
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.egfCustom.constructor.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_K9da0HroEeC0XN9kbwkPYQ",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			for (GenFeature genFeature : genClass.getFlagGenFeaturesWithDefault()) {
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(genClass.getFlagsField(genFeature));
+				stringBuffer.append(TEXT_63);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_64);
+				if (!genFeature.isBooleanType()) {
+					stringBuffer.append(TEXT_65);
+				}
+				stringBuffer.append(TEXT_3);
+			}
+			stringBuffer.append(TEXT_66);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_68);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+			stringBuffer.append(TEXT_70);
+		}
+		if (isImplementation && genModel.isDynamicDelegation()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicDelegation" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_cAErkCSWEemxeP6B0lLOpA",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.reflectiveDelegation.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0vQgYGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//Class/reflectiveDelegation.override.javajetinc
+		if (isImplementation) {
+			new Runnable() {
+				public void run() {
+					GenClass classExtendsGenClass = genClass.getClassExtendsGenClass();
+					List<GenFeature> classExtendsAllGenFeatures = classExtendsGenClass == null
+							? Collections.<GenFeature>emptyList()
+							: classExtendsGenClass.getAllGenFeatures();
+					for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {
+						stringBuffer.append(TEXT_4);
+						{
+							//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeatureReified.override" args="genFeature:genFeature,classExtendsGenClass:classExtendsGenClass,classExtendsAllGenFeatures:classExtendsAllGenFeatures,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+							InternalPatternContext ictx = (InternalPatternContext) ctx;
+							new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+							stringBuffer.setLength(0);
+
+							final Map<String, Object> callParameters = new HashMap<String, Object>();
+							callParameters.put("genFeature", genFeature);
+							callParameters.put("classExtendsGenClass", classExtendsGenClass);
+							callParameters.put("classExtendsAllGenFeatures", classExtendsAllGenFeatures);
+							callParameters.put("genClass", genClass);
+							callParameters.put("genPackage", genPackage);
+							callParameters.put("genModel", genModel);
+							callParameters.put("isJDK50", isJDK50);
+							callParameters.put("isInterface", isInterface);
+							callParameters.put("isImplementation", isImplementation);
+							callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+							callParameters.put("isGWT", isGWT);
+							callParameters.put("forceDefaultCase", forceDefaultCase);
+							callParameters.put("indentDefaultCase", indentDefaultCase);
+							callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+							callParameters.put("singleWildcard", singleWildcard);
+							callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+							callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+							callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+							callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+							CallHelper.executeWithParameterInjection(
+									"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_onysQLM-EeKd56X4hcZPSw",
+									new ExecutionContext((InternalPatternContext) ctx), callParameters);
+							stringBuffer.setLength(0);
+						}
+
+						//Class/genFeatureReified.override.javajetinc
+					}
+				}
+			}.run();
+		}
+		new Runnable() {
+			public void run() {
+				for (GenFeature genFeature : (isImplementation ? genClass.getImplementedGenFeatures()
+						: genClass.getDeclaredGenFeatures())) {
+					stringBuffer.append(TEXT_4);
+					{
+						//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+						InternalPatternContext ictx = (InternalPatternContext) ctx;
+						new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+						stringBuffer.setLength(0);
+
+						final Map<String, Object> callParameters = new HashMap<String, Object>();
+						callParameters.put("genFeature", genFeature);
+						callParameters.put("genClass", genClass);
+						callParameters.put("genPackage", genPackage);
+						callParameters.put("genModel", genModel);
+						callParameters.put("isJDK50", isJDK50);
+						callParameters.put("isInterface", isInterface);
+						callParameters.put("isImplementation", isImplementation);
+						callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+						callParameters.put("isGWT", isGWT);
+						callParameters.put("forceDefaultCase", forceDefaultCase);
+						callParameters.put("indentDefaultCase", indentDefaultCase);
+						callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+						callParameters.put("singleWildcard", singleWildcard);
+						callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+						callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+						callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+						callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+						CallHelper.executeWithParameterInjection(
+								"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0vaRYGJ-Ed-FqczH3ESmRw",
+								new ExecutionContext((InternalPatternContext) ctx), callParameters);
+						stringBuffer.setLength(0);
+					}
+
+					//Class/genFeature.override.javajetinc
+				} //for
+			}
+		}.run();
+		for (GenOperation genOperation : (isImplementation ? genClass.getImplementedGenOperations()
+				: genClass.getDeclaredGenOperations())) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genOperation", genOperation);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_01-MYGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/implementedGenOperation.override.javajetinc
+		} //for
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEInverseAddGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useGenerics()) {
+				for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {
+					if (genFeature.isUncheckedCast(genClass)) {
+						stringBuffer.append(TEXT_72);
+						break;
+					}
+				}
+			}
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_74);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isListType()) {
+					String cast = "(" + genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")
+							+ (!genModel.useGenerics() ? ")"
+									: "<" + genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject") + ">)("
+											+ genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")
+											+ "<?>)");
+					if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(cast);
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_84);
+					} else {
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(cast);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_86);
+					}
+				} else if (genFeature.isContainer()) {
+					stringBuffer.append(TEXT_87);
+					if (genFeature.isBasicSet()) {
+						stringBuffer.append(TEXT_88);
+						stringBuffer.append(genFeature.getAccessorName());
+						stringBuffer.append(TEXT_89);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_90);
+					} else {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_92);
+					}
+				} else {
+					if (genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_60);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_94);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_95);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_96);
+					} else if (genFeature.isVolatile()
+							|| genClass.getImplementingGenModel(genFeature).isDynamicDelegation()) {
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_60);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_50);
+						if (genFeature.isResolveProxies()) {
+							stringBuffer.append(TEXT_97);
+							stringBuffer.append(genFeature.getAccessorName());
+						} else {
+							stringBuffer.append(genFeature.getGetAccessor());
+						}
+						stringBuffer.append(TEXT_98);
+					}
+					stringBuffer.append(TEXT_99);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_100);
+					if (genFeature.isEffectiveContains()) {
+						stringBuffer.append(TEXT_101);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_102);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_103);
+					} else {
+						GenFeature reverseFeature = genFeature.getReverse();
+						GenClass targetClass = reverseFeature.getGenClass();
+						String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+								? " + " + genClass.getOffsetCorrectionField(genFeature)
+								: "";
+						stringBuffer.append(TEXT_101);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_104);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_105);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_106);
+					}
+					stringBuffer.append(TEXT_88);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_89);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_90);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_109);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_110);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_108);
+			}
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEInverseRemoveGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_112);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEInverseRemoveGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isListType()) {
+					if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_113);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_114);
+					} else if (genFeature.isWrappedFeatureMapType()) {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_113);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_115);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_116);
+					} else {
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_117);
+					}
+				} else if (genFeature.isContainer() && !genFeature.isBasicSet()) {
+					stringBuffer.append(TEXT_118);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_92);
+				} else if (genFeature.isUnsettable()) {
+					stringBuffer.append(TEXT_119);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_120);
+				} else {
+					stringBuffer.append(TEXT_88);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_121);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_122);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_123);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEBasicRemoveFromContainerGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_124);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_125);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEBasicRemoveFromContainerGenFeatures()) {
+				GenFeature reverseFeature = genFeature.getReverse();
+				GenClass targetClass = reverseFeature.getGenClass();
+				String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+						? " + " + genClass.getOffsetCorrectionField(genFeature)
+						: "";
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_126);
+				stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+				stringBuffer.append(reverseOffsetCorrection);
+				stringBuffer.append(TEXT_105);
+				stringBuffer.append(targetClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_106);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_127);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_128);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEGetGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_129);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getEGetGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isPrimitiveType()) {
+					if (isJDK50) {
+						stringBuffer.append(TEXT_130);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_98);
+					} else if (genFeature.isBooleanType()) {
+						stringBuffer.append(TEXT_130);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_131);
+					} else {
+						stringBuffer.append(TEXT_132);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_133);
+					}
+				} else if (genFeature.isResolveProxies() && !genFeature.isListType()) {
+					stringBuffer.append(TEXT_134);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_135);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_98);
+				} else if (genFeature.isMapType()) {
+					if (genFeature.isEffectiveSuppressEMFTypes()) {
+						stringBuffer.append(TEXT_136);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_137);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_98);
+					} else {
+						stringBuffer.append(TEXT_138);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_139);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_140);
+					}
+				} else if (genFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_136);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_115);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_141);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_98);
+				} else if (genFeature.isFeatureMapType()) {
+					stringBuffer.append(TEXT_138);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_142);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_143);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_144);
+				} else {
+					stringBuffer.append(TEXT_130);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_98);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_145);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_146);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getESetGenFeatures())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useGenerics()) {
+				for (GenFeature genFeature : genClass.getESetGenFeatures()) {
+					if (genFeature.isUncheckedCast(genClass) && !genFeature.isFeatureMapType()
+							&& !genFeature.isMapType()) {
+						stringBuffer.append(TEXT_72);
+						break;
+					}
+				}
+			}
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_147);
+			stringBuffer.append(negativeOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenFeature genFeature : genClass.getESetGenFeatures()) {
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(TEXT_79);
+				if (genFeature.isListType()) {
+					if (genFeature.isWrappedFeatureMapType()) {
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_149);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_115);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_150);
+					} else if (genFeature.isFeatureMapType()) {
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_143);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_151);
+					} else if (genFeature.isMapType()) {
+						if (genFeature.isEffectiveSuppressEMFTypes()) {
+							stringBuffer.append(TEXT_148);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+							stringBuffer.append(TEXT_152);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EMap"));
+							stringBuffer.append(TEXT_82);
+							stringBuffer.append(genFeature.getImportedMapTemplateArguments(genClass));
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_153);
+						} else {
+							stringBuffer.append(TEXT_148);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+							stringBuffer.append(TEXT_154);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_151);
+						}
+					} else {
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_155);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_156);
+						stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+						if (isJDK50) {
+							stringBuffer.append(TEXT_157);
+							stringBuffer.append(genFeature.getListItemType(genClass));
+							stringBuffer.append(TEXT_158);
+						}
+						stringBuffer.append(TEXT_159);
+					}
+				} else if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_160);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_161);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_162);
+					stringBuffer.append(genFeature.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_133);
+				} else {
+					stringBuffer.append(TEXT_160);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_81);
+					if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType()
+							|| !genFeature.getRawType().equals(genFeature.getType(genClass))) {
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_83);
+					}
+					stringBuffer.append(TEXT_163);
+				}
+				stringBuffer.append(TEXT_164);
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_165);
+				if (forceDefaultCase) {
+					stringBuffer.append(TEXT_164);
+				}
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_166);
+				if (forceDefaultCase) {
+					stringBuffer.append(TEXT_164);
+				}
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEUnsetGenFeatures())) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.eUnset.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_03KfMGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/eUnset.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation()
+				&& genClass.implementsAny(genClass.getEIsSetGenFeatures())) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.eIsSet.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_03TpIGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/eIsSet.override.javajetinc
+		}
+		if (isImplementation && (!genClass.getMixinGenFeatures().isEmpty()
+				|| genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty())) {
+			if (!genClass.getMixinGenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_71);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_67);
+				}
+				stringBuffer.append(TEXT_167);
+				stringBuffer.append(singleWildcard);
+				stringBuffer.append(TEXT_168);
+				for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {
+					stringBuffer.append(TEXT_169);
+					stringBuffer.append(mixinGenClass.getRawImportedInterfaceName());
+					stringBuffer.append(TEXT_170);
+					stringBuffer.append(negativeOffsetCorrection);
+					stringBuffer.append(TEXT_171);
+					for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {
+						stringBuffer.append(TEXT_172);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(TEXT_173);
+						stringBuffer.append(mixinGenClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_174);
+				}
+				stringBuffer.append(TEXT_175);
+			}
+			stringBuffer.append(TEXT_176);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_177);
+			stringBuffer.append(singleWildcard);
+			stringBuffer.append(TEXT_168);
+			for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(mixinGenClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_178);
+				for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(mixinGenClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			if (genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(genClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_179);
+				stringBuffer.append(negativeOffsetCorrection);
+				stringBuffer.append(TEXT_171);
+				for (GenFeature genFeature : genClass.getGenFeatures()) {
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			stringBuffer.append(TEXT_180);
+		}
+		if (genModel.isOperationReflection() && isImplementation
+				&& (!genClass.getMixinGenOperations().isEmpty()
+						|| !genClass.getOverrideGenOperations(genClass.getExtendedGenOperations(),
+								genClass.getImplementedGenOperations()).isEmpty()
+						|| genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty())) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_181);
+			stringBuffer.append(singleWildcard);
+			stringBuffer.append(TEXT_168);
+			for (GenClass extendedGenClass : genClass.getExtendedGenClasses()) {
+				List<GenOperation> extendedImplementedGenOperations = extendedGenClass.getImplementedGenOperations();
+				List<GenOperation> implementedGenOperations = genClass.getImplementedGenOperations();
+				if (!genClass.getOverrideGenOperations(extendedImplementedGenOperations, implementedGenOperations)
+						.isEmpty()) {
+					stringBuffer.append(TEXT_169);
+					stringBuffer.append(extendedGenClass.getRawImportedInterfaceName());
+					stringBuffer.append(TEXT_182);
+					for (GenOperation genOperation : extendedImplementedGenOperations) {
+						GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);
+						if (implementedGenOperations.contains(overrideGenOperation)) {
+							stringBuffer.append(TEXT_172);
+							stringBuffer.append(extendedGenClass.getQualifiedOperationID(genOperation));
+							stringBuffer.append(TEXT_173);
+							stringBuffer.append(genClass.getQualifiedOperationID(overrideGenOperation));
+							stringBuffer.append(positiveOperationOffsetCorrection);
+							stringBuffer.append(TEXT_3);
+						}
+					}
+					stringBuffer.append(TEXT_183);
+				}
+			}
+			for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(mixinGenClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_182);
+				for (GenOperation genOperation : mixinGenClass.getGenOperations()) {
+					GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(mixinGenClass.getQualifiedOperationID(genOperation));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedOperationID(
+							overrideGenOperation != null ? overrideGenOperation : genOperation));
+					stringBuffer.append(positiveOperationOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			if (genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty()) {
+				stringBuffer.append(TEXT_169);
+				stringBuffer.append(genClass.getRawImportedInterfaceName());
+				stringBuffer.append(TEXT_184);
+				stringBuffer.append(negativeOperationOffsetCorrection);
+				stringBuffer.append(TEXT_171);
+				for (GenOperation genOperation : genClass.getGenOperations()) {
+					stringBuffer.append(TEXT_172);
+					stringBuffer.append(genClass.getQualifiedOperationID(genOperation));
+					stringBuffer.append(TEXT_173);
+					stringBuffer.append(genClass.getQualifiedOperationID(genOperation));
+					stringBuffer.append(positiveOperationOffsetCorrection);
+					stringBuffer.append(TEXT_3);
+				}
+				stringBuffer.append(TEXT_174);
+			}
+			stringBuffer.append(TEXT_185);
+		}
+		if (isImplementation && genModel.isVirtualDelegation()) {
+			String eVirtualValuesField = genClass.getEVirtualValuesField();
+			if (eVirtualValuesField != null) {
+				stringBuffer.append(TEXT_71);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_67);
+				}
+				stringBuffer.append(TEXT_186);
+				stringBuffer.append(eVirtualValuesField);
+				stringBuffer.append(TEXT_187);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_67);
+				}
+				stringBuffer.append(TEXT_188);
+				stringBuffer.append(eVirtualValuesField);
+				stringBuffer.append(TEXT_189);
+			}
+			{
+				List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());
+				if (!eVirtualIndexBitFields.isEmpty()) {
+					List<String> allEVirtualIndexBitFields = genClass
+							.getAllEVirtualIndexBitFields(new ArrayList<String>());
+					stringBuffer.append(TEXT_71);
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_67);
+					}
+					stringBuffer.append(TEXT_190);
+					for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_191);
+						stringBuffer.append(allEVirtualIndexBitFields.get(i));
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_192);
+					if (genModel.useClassOverrideAnnotation()) {
+						stringBuffer.append(TEXT_67);
+					}
+					stringBuffer.append(TEXT_193);
+					for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_194);
+						stringBuffer.append(allEVirtualIndexBitFields.get(i));
+						stringBuffer.append(TEXT_195);
+					}
+					stringBuffer.append(TEXT_196);
+				}
+			}
+		}
+		if (genModel.isOperationReflection() && isImplementation && !genClass.getImplementedGenOperations().isEmpty()) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			if (genModel.useGenerics()) {
+				boolean isUnchecked = false;
+				boolean isRaw = false;
+				LOOP: for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods()
+						? genClass.getImplementedGenOperations()
+						: genClass.getAllGenOperations())) {
+					for (GenParameter genParameter : genOperation.getGenParameters()) {
+						if (genParameter.isUncheckedCast()) {
+							if (genParameter.getTypeGenDataType() == null
+									|| !genParameter.getTypeGenDataType().isObjectType()) {
+								isUnchecked = true;
+							}
+							if (genParameter.usesOperationTypeParameters() && !genParameter.getEcoreParameter()
+									.getEGenericType().getETypeArguments().isEmpty()) {
+								isRaw = true;
+								break LOOP;
+							}
+						}
+					}
+				}
+				if (isUnchecked) {
+					stringBuffer.append(TEXT_197);
+					if (!isRaw) {
+						stringBuffer.append(TEXT_198);
+					} else {
+						stringBuffer.append(TEXT_199);
+					}
+					stringBuffer.append(TEXT_83);
+				}
+			}
+			stringBuffer.append(TEXT_200);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.EList"));
+			stringBuffer.append(singleWildcard);
+			stringBuffer.append(TEXT_201);
+			stringBuffer.append(genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException"
+					: "java.lang.reflect.InvocationTargetException"));
+			stringBuffer.append(TEXT_202);
+			stringBuffer.append(negativeOperationOffsetCorrection);
+			stringBuffer.append(TEXT_77);
+			for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods()
+					? genClass.getImplementedGenOperations()
+					: genClass.getAllGenOperations())) {
+				List<GenParameter> genParameters = genOperation.getGenParameters();
+				int size = genParameters.size();
+				boolean hasCheckedException = genOperation.hasCheckedException();
+				String indent = hasCheckedException ? "\t" : "";
+				GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass
+						.getQualifiedOperationID(overrideGenOperation != null ? overrideGenOperation : genOperation));
+				stringBuffer.append(TEXT_79);
+				if (hasCheckedException) {
+					stringBuffer.append(TEXT_203);
+					/*}*/}
+				if (genOperation.isVoid()) {
+					stringBuffer.append(TEXT_93);
+					stringBuffer.append(indent);
+					stringBuffer.append(genOperation.getName());
+					stringBuffer.append(TEXT_81);
+					for (int i = 0; i < size; i++) {
+						GenParameter genParameter = genParameters.get(i);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_81);
+						}
+						if (genParameter.getTypeGenDataType() == null
+								|| !genParameter.getTypeGenDataType().isObjectType()
+								|| !genParameter.usesOperationTypeParameters()
+										&& !genParameter.getRawType().equals(genParameter.getType(genClass))) {
+							stringBuffer.append(TEXT_81);
+							stringBuffer.append(
+									genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType()
+											: genParameter.getObjectType(genClass));
+							stringBuffer.append(TEXT_83);
+						}
+						stringBuffer.append(TEXT_204);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_83);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_205);
+							stringBuffer.append(genParameter.getPrimitiveValueFunction());
+							stringBuffer.append(TEXT_40);
+						}
+						if (i < (size - 1)) {
+							stringBuffer.append(TEXT_105);
+						}
+					}
+					stringBuffer.append(TEXT_206);
+					stringBuffer.append(indent);
+					stringBuffer.append(TEXT_207);
+				} else {
+					stringBuffer.append(TEXT_93);
+					stringBuffer.append(indent);
+					stringBuffer.append(TEXT_208);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_209);
+						stringBuffer.append(genOperation.getObjectType(genClass));
+						stringBuffer.append(TEXT_81);
+					}
+					stringBuffer.append(genOperation.getName());
+					stringBuffer.append(TEXT_81);
+					for (int i = 0; i < size; i++) {
+						GenParameter genParameter = genParameters.get(i);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_81);
+						}
+						if (genParameter.getTypeGenDataType() == null
+								|| !genParameter.getTypeGenDataType().isObjectType()
+								|| !genParameter.usesOperationTypeParameters()
+										&& !genParameter.getRawType().equals(genParameter.getType(genClass))) {
+							stringBuffer.append(TEXT_81);
+							stringBuffer.append(
+									genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType()
+											: genParameter.getObjectType(genClass));
+							stringBuffer.append(TEXT_83);
+						}
+						stringBuffer.append(TEXT_204);
+						stringBuffer.append(i);
+						stringBuffer.append(TEXT_83);
+						if (!isJDK50 && genParameter.isPrimitiveType()) {
+							stringBuffer.append(TEXT_205);
+							stringBuffer.append(genParameter.getPrimitiveValueFunction());
+							stringBuffer.append(TEXT_40);
+						}
+						if (i < (size - 1)) {
+							stringBuffer.append(TEXT_105);
+						}
+					}
+					stringBuffer.append(TEXT_83);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_83);
+					}
+					stringBuffer.append(TEXT_3);
+				}
+				if (hasCheckedException) {/*{*/
+					stringBuffer.append(TEXT_210);
+					stringBuffer.append(genModel.getImportedName("java.lang.Throwable"));
+					stringBuffer.append(TEXT_211);
+					stringBuffer.append(
+							genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException"
+									: "java.lang.reflect.InvocationTargetException"));
+					stringBuffer.append(TEXT_212);
+				}
+			}
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_107);
+			} else { // {
+				stringBuffer.append(TEXT_108);
+			}
+			if (genModel.isMinimalReflectiveMethods()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_213);
+			} else {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(indentDefaultCase);
+				stringBuffer.append(TEXT_214);
+			}
+			if (forceDefaultCase) { // {
+				stringBuffer.append(TEXT_108);
+			} // }
+			stringBuffer.append(TEXT_111);
+		}
+		if (!genClass.hasImplementedToStringGenOperation() && isImplementation && !genModel.isReflectiveDelegation()
+				&& !genModel.isDynamicDelegation() && !genClass.getToStringGenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_71);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_215);
+			stringBuffer.append(genModel.useGenerics() ? "StringBuilder" : "StringBuffer");
+			stringBuffer.append(TEXT_216);
+			stringBuffer.append(genModel.useGenerics() ? "StringBuilder" : "StringBuffer");
+			stringBuffer.append(TEXT_217);
+			{
+				boolean first = true;
+				for (GenFeature genFeature : genClass.getToStringGenFeatures()) {
+					if (first) {
+						first = false;
+						stringBuffer.append(TEXT_218);
+						stringBuffer.append(genFeature.getName());
+						stringBuffer.append(TEXT_219);
+						stringBuffer.append(genModel.getNonNLS());
+					} else {
+						stringBuffer.append(TEXT_220);
+						stringBuffer.append(genFeature.getName());
+						stringBuffer.append(TEXT_219);
+						stringBuffer.append(genModel.getNonNLS());
+					}
+					if (genFeature.isUnsettable() && !genFeature.isListType()) {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_221);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_222);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_223);
+							stringBuffer.append(genModel.getNonNLS());
+						} else {
+							if (genClass.isFlag(genFeature)) {
+								if (genFeature.isBooleanType()) {
+									stringBuffer.append(TEXT_224);
+									if (genClass.isESetFlag(genFeature)) {
+										stringBuffer.append(TEXT_81);
+										stringBuffer.append(genClass.getESetFlagsField(genFeature));
+										stringBuffer.append(TEXT_225);
+										stringBuffer.append(genFeature.getUpperName());
+										stringBuffer.append(TEXT_226);
+									} else {
+										stringBuffer.append(genFeature.getUncapName());
+										stringBuffer.append(TEXT_227);
+									}
+									stringBuffer.append(TEXT_228);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_229);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_224);
+									if (genClass.isESetFlag(genFeature)) {
+										stringBuffer.append(TEXT_81);
+										stringBuffer.append(genClass.getESetFlagsField(genFeature));
+										stringBuffer.append(TEXT_225);
+										stringBuffer.append(genFeature.getUpperName());
+										stringBuffer.append(TEXT_226);
+									} else {
+										stringBuffer.append(genFeature.getUncapName());
+										stringBuffer.append(TEXT_227);
+									}
+									stringBuffer.append(TEXT_230);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_231);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_232);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_233);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							} else {
+								stringBuffer.append(TEXT_224);
+								if (genClass.isESetFlag(genFeature)) {
+									stringBuffer.append(TEXT_81);
+									stringBuffer.append(genClass.getESetFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_226);
+								} else {
+									stringBuffer.append(genFeature.getUncapName());
+									stringBuffer.append(TEXT_227);
+								}
+								stringBuffer.append(TEXT_230);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_234);
+								stringBuffer.append(genModel.getNonNLS());
+							}
+						}
+					} else {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_235);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							if (!genFeature.isListType() && !genFeature.isReferenceType()) {
+								stringBuffer.append(TEXT_105);
+								stringBuffer.append(genFeature.getEDefault());
+							}
+							stringBuffer.append(TEXT_236);
+						} else {
+							if (genClass.isFlag(genFeature)) {
+								if (genFeature.isBooleanType()) {
+									stringBuffer.append(TEXT_237);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_238);
+								} else {
+									stringBuffer.append(TEXT_239);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_231);
+									stringBuffer.append(genClass.getFlagsField(genFeature));
+									stringBuffer.append(TEXT_225);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_232);
+									stringBuffer.append(genFeature.getUpperName());
+									stringBuffer.append(TEXT_240);
+								}
+							} else {
+								stringBuffer.append(TEXT_239);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_96);
+							}
+						}
+					}
+				}
+			}
+			stringBuffer.append(TEXT_241);
+		}
+		if (isImplementation && genClass.isMapEntry()) {
+			GenFeature keyFeature = genClass.getMapEntryKeyFeature();
+			GenFeature valueFeature = genClass.getMapEntryValueFeature();
+			String objectType = genModel.getImportedName("java.lang.Object");
+			String keyType = isJDK50 ? keyFeature.getObjectType(genClass) : objectType;
+			String valueType = isJDK50 ? valueFeature.getObjectType(genClass) : objectType;
+			String eMapType = genModel.getImportedName("org.eclipse.emf.common.util.EMap")
+					+ (isJDK50 ? "<" + keyType + ", " + valueType + ">" : "");
+			stringBuffer.append(TEXT_71);
+			if (isGWT) {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+			}
+			stringBuffer.append(TEXT_242);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_243);
+			stringBuffer.append(objectType);
+			stringBuffer.append(TEXT_244);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_245);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(keyType);
+			stringBuffer.append(TEXT_246);
+			if (!isJDK50 && keyFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_247);
+				stringBuffer.append(keyFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_248);
+			} else {
+				stringBuffer.append(TEXT_249);
+			}
+			stringBuffer.append(TEXT_66);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_250);
+			stringBuffer.append(keyType);
+			stringBuffer.append(TEXT_251);
+			if (keyFeature.isListType()) {
+				stringBuffer.append(TEXT_252);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+					stringBuffer.append(TEXT_83);
+				}
+				stringBuffer.append(TEXT_253);
+			} else if (isJDK50) {
+				stringBuffer.append(TEXT_254);
+			} else if (keyFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_255);
+				stringBuffer.append(keyFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_256);
+				stringBuffer.append(keyFeature.getPrimitiveValueFunction());
+				stringBuffer.append(TEXT_133);
+			} else {
+				stringBuffer.append(TEXT_257);
+				stringBuffer.append(keyFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_258);
+			}
+			stringBuffer.append(TEXT_66);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_259);
+			if (!isJDK50 && valueFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_247);
+				stringBuffer.append(valueFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_260);
+			} else {
+				stringBuffer.append(TEXT_261);
+			}
+			stringBuffer.append(TEXT_66);
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_67);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_262);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_263);
+			stringBuffer.append(valueType);
+			stringBuffer.append(TEXT_264);
+			if (valueFeature.isListType()) {
+				stringBuffer.append(TEXT_265);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+					stringBuffer.append(TEXT_83);
+				}
+				stringBuffer.append(TEXT_266);
+			} else if (isJDK50) {
+				stringBuffer.append(TEXT_267);
+			} else if (valueFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_268);
+				stringBuffer.append(valueFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_269);
+				stringBuffer.append(valueFeature.getPrimitiveValueFunction());
+				stringBuffer.append(TEXT_133);
+			} else {
+				stringBuffer.append(TEXT_270);
+				stringBuffer.append(valueFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_271);
+			}
+			stringBuffer.append(TEXT_272);
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_72);
+			}
+			stringBuffer.append(TEXT_73);
+			stringBuffer.append(eMapType);
+			stringBuffer.append(TEXT_273);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+			stringBuffer.append(TEXT_274);
+			stringBuffer.append(eMapType);
+			stringBuffer.append(TEXT_275);
+		}
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_03daIGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_276);
+		stringBuffer.append(isInterface ? " " + genClass.getInterfaceName() : genClass.getClassName());
+		// TODO fix the space above
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenClass genClass = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate
+				&& (!genClass.isExternalInterface() && (!genModel.isSuppressInterfaces() || genClass.isInterface()));
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ManifestMF.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ManifestMF.java
new file mode 100644
index 0000000..5f6078d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ManifestMF.java
@@ -0,0 +1,272 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ManifestMF extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ManifestMF create(String lineSeparator) {
+		nl = lineSeparator;
+		ManifestMF result = new ManifestMF();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "Manifest-Version: 1.0" + NL + "Bundle-ManifestVersion: 2" + NL + "Bundle-Name: ";
+	protected final String TEXT_2 = NL + "Bundle-SymbolicName: ";
+	protected final String TEXT_3 = ";singleton:=true" + NL + "Automatic-Module-Name: ";
+	protected final String TEXT_4 = NL + "Bundle-Version: 1.0.0.qualifier" + NL + "Bundle-ClassPath: ";
+	protected final String TEXT_5 = ".jar";
+	protected final String TEXT_6 = ".";
+	protected final String TEXT_7 = NL + "Bundle-Activator: ";
+	protected final String TEXT_8 = "$Implementation";
+	protected final String TEXT_9 = "$Activator";
+	protected final String TEXT_10 = NL + "Bundle-Vendor: ";
+	protected final String TEXT_11 = NL + "Bundle-Localization: ";
+	protected final String TEXT_12 = NL + "Bundle-RequiredExecutionEnvironment: J2SE-1.5";
+	protected final String TEXT_13 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.6";
+	protected final String TEXT_14 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.7";
+	protected final String TEXT_15 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.8";
+	protected final String TEXT_16 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-9";
+	protected final String TEXT_17 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-10";
+	protected final String TEXT_18 = NL + "Export-Package: ";
+	protected final String TEXT_19 = ",";
+	protected final String TEXT_20 = NL + " ";
+	protected final String TEXT_21 = NL + "Require-Bundle: ";
+	protected final String TEXT_22 = ";resolution:=optional;x-installation:=greedy";
+	protected final String TEXT_23 = ";visibility:=reexport";
+	protected final String TEXT_24 = NL + "Import-Package: org.osgi.framework";
+	protected final String TEXT_25 = NL + "Eclipse-LazyStart: true";
+	protected final String TEXT_26 = NL + "Bundle-ActivationPolicy: lazy" + NL;
+	protected final String TEXT_27 = NL;
+
+	public ManifestMF() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getModelProjectDirectory() + "/META-INF/MANIFEST.MF";
+		overwrite = genModel.isUpdateClasspath();
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005-2007 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genModel.getModelBundleNameKey());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getModelPluginID());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getModelPluginID());
+		stringBuffer.append(TEXT_4);
+		if (genModel.isRuntimeJar()) {
+			stringBuffer.append(genModel.getModelPluginID());
+			stringBuffer.append(TEXT_5);
+		} else {
+			stringBuffer.append(TEXT_6);
+		}
+		if (genModel.hasModelPluginClass()) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genModel.getQualifiedModelPluginClassName());
+			stringBuffer.append(TEXT_8);
+			if (genModel.isOSGiCompatible()) {
+				stringBuffer.append(TEXT_9);
+			}
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getModelBundleVendorKey());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genModel.getModelBundleLocalization());
+		if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {
+			stringBuffer.append(TEXT_12);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {
+			stringBuffer.append(TEXT_13);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {
+			stringBuffer.append(TEXT_14);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {
+			stringBuffer.append(TEXT_15);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {
+			stringBuffer.append(TEXT_16);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {
+			stringBuffer.append(TEXT_17);
+		}
+		Iterator<String> packagesIterator = genModel.getModelQualifiedPackageNames().iterator();
+		if (packagesIterator.hasNext()) {
+			String pack = packagesIterator.next();
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(pack);
+			while (packagesIterator.hasNext()) {
+				pack = packagesIterator.next();
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(pack);
+			}
+		}
+		Iterator<String> requiredPluginIterator = genModel.getModelRequiredPlugins().iterator();
+		if (requiredPluginIterator.hasNext()) {
+			String pluginID = requiredPluginIterator.next();
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(pluginID);
+			if (pluginID.startsWith("org.eclipse.core.runtime")) {
+				if (genModel.isOSGiCompatible()) {
+					stringBuffer.append(TEXT_22);
+				}
+			} else {
+				stringBuffer.append(TEXT_23);
+			}
+			while (requiredPluginIterator.hasNext()) {
+				pluginID = requiredPluginIterator.next();
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(pluginID);
+				if (pluginID.startsWith("org.eclipse.core.runtime")) {
+					if (genModel.isOSGiCompatible()) {
+						stringBuffer.append(TEXT_22);
+					}
+				} else if (!pluginID.equals("org.eclipse.xtext.xbase.lib")
+						&& !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {
+					stringBuffer.append(TEXT_23);
+				}
+			}
+		}
+		if (genModel.isOSGiCompatible() && genModel.hasModelPluginClass()) {
+			stringBuffer.append(TEXT_24);
+		}
+		if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22
+				|| genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {
+			stringBuffer.append(TEXT_25);
+		}
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genModel.isBundleManifest()) && (genModel.hasPluginSupport()
+				&& !genModel.sameModelEditProject() && !genModel.sameModelEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ModuleGWTXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ModuleGWTXML.java
new file mode 100644
index 0000000..32d2748
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ModuleGWTXML.java
@@ -0,0 +1,202 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModuleGWTXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ModuleGWTXML create(String lineSeparator) {
+		nl = lineSeparator;
+		ModuleGWTXML result = new ModuleGWTXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL
+			+ "<!DOCTYPE module PUBLIC \"-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN\" \"http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd\">"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + NL + "<module>";
+	protected final String TEXT_4 = NL + "  <inherits name=\"";
+	protected final String TEXT_5 = "\" />";
+	protected final String TEXT_6 = NL + "  <source path=\"";
+	protected final String TEXT_7 = "\"/>";
+	protected final String TEXT_8 = NL + "</module>" + NL;
+	protected final String TEXT_9 = NL;
+
+	public ModuleGWTXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(TEXT_9);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getModelDirectory() + "/" + genModel.getQualifiedModelModuleName().replace(".", "/")
+				+ ".gwt.xml";
+		overwrite = false;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2010 Ed Merks and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   Ed Merks - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		for (String inherits : genModel.getModelModuleInherits()) {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(inherits);
+			stringBuffer.append(TEXT_5);
+		}
+		for (String source : genModel.getModelModuleSources()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(source);
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT
+				&& !genModel.sameModelEditProject() && !genModel.sameModelEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PackageClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PackageClass.java
new file mode 100644
index 0000000..2ffa756
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PackageClass.java
@@ -0,0 +1,2762 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PackageClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized PackageClass create(String lineSeparator) {
+		nl = lineSeparator;
+		PackageClass result = new PackageClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Package</b> for the model." + NL + " * It contains accessors for the meta objects to represent"
+			+ NL + " * <ul>" + NL + " *   <li>each class,</li>" + NL + " *   <li>each feature of each class,</li>";
+	protected final String TEXT_6 = NL + " *   <li>each operation of each class,</li>";
+	protected final String TEXT_7 = NL + " *   <li>each enum,</li>" + NL + " *   <li>and each data type</li>" + NL
+			+ " * </ul>" + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_8 = NL + " * <!-- begin-model-doc -->" + NL + " * ";
+	protected final String TEXT_9 = NL + " * <!-- end-model-doc -->";
+	protected final String TEXT_10 = NL + " * @see ";
+	protected final String TEXT_11 = NL + " * @model ";
+	protected final String TEXT_12 = NL + " *        ";
+	protected final String TEXT_13 = NL + " * @model";
+	protected final String TEXT_14 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_15 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * An implementation of the model <b>Package</b>." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_16 = NL + " * ";
+	protected final String TEXT_17 = NL + "@Deprecated";
+	protected final String TEXT_18 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_19 = NL + "public class ";
+	protected final String TEXT_20 = " extends ";
+	protected final String TEXT_21 = " implements ";
+	protected final String TEXT_22 = NL + "public interface ";
+	protected final String TEXT_23 = NL + "{";
+	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_25 = " copyright = ";
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * The package name." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_27 = " eNAME = \"";
+	protected final String TEXT_28 = "\";";
+	protected final String TEXT_29 = NL + NL + "\t/**" + NL + "\t * The package namespace URI." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_30 = " eNS_URI = \"";
+	protected final String TEXT_31 = NL + NL + "\t/**" + NL + "\t * The package namespace name." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_32 = " eNS_PREFIX = \"";
+	protected final String TEXT_33 = NL + NL + "\t/**" + NL + "\t * The package content type ID." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_34 = " eCONTENT_TYPE = \"";
+	protected final String TEXT_35 = NL + NL + "\t/**" + NL + "\t * The singleton instance of the package." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_36 = " eINSTANCE = ";
+	protected final String TEXT_37 = ".init();" + NL;
+	protected final String TEXT_38 = NL + "\t/**";
+	protected final String TEXT_39 = NL + "\t * The meta object id for the '{@link ";
+	protected final String TEXT_40 = " <em>";
+	protected final String TEXT_41 = "</em>}' class." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_42 = "</em>}' enum." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_43 = NL + "\t * The meta object id for the '<em>";
+	protected final String TEXT_44 = "</em>' data type." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_45 = NL + "\t * @see ";
+	protected final String TEXT_46 = "#get";
+	protected final String TEXT_47 = "()";
+	protected final String TEXT_48 = NL + "\t * ";
+	protected final String TEXT_49 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_50 = NL + "\t@Deprecated";
+	protected final String TEXT_51 = NL + "\t";
+	protected final String TEXT_52 = "int ";
+	protected final String TEXT_53 = " = ";
+	protected final String TEXT_54 = ";" + NL;
+	protected final String TEXT_55 = NL + "\t/**" + NL + "\t * The feature id for the '<em><b>";
+	protected final String TEXT_56 = "</b></em>' ";
+	protected final String TEXT_57 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_58 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_59 = NL + "\t/**" + NL + "\t * The number of structural features of the '<em>";
+	protected final String TEXT_60 = "</em>' class." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_61 = NL + "\t/**" + NL + "\t * The operation id for the '<em>";
+	protected final String TEXT_62 = "</em>' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_63 = NL + "\t/**" + NL + "\t * The number of operations of the '<em>";
+	protected final String TEXT_64 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected String packageFilename = \"";
+	protected final String TEXT_65 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_66 = NL + "\tprivate ";
+	protected final String TEXT_67 = " ";
+	protected final String TEXT_68 = " = null;" + NL;
+	protected final String TEXT_69 = NL + "\t/**" + NL
+			+ "\t * Creates an instance of the model <b>Package</b>, registered with" + NL
+			+ "\t * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package" + NL
+			+ "\t * package URI value." + NL + "\t * <p>Note: the correct way to create the package is via the static"
+			+ NL + "\t * factory method {@link #init init()}, which also performs" + NL
+			+ "\t * initialization of the package, or returns the registered package," + NL
+			+ "\t * if one already exists." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @see org.eclipse.emf.ecore.EPackage.Registry" + NL + "\t * @see ";
+	protected final String TEXT_70 = "#eNS_URI" + NL + "\t * @see #init()" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate ";
+	protected final String TEXT_71 = "()" + NL + "\t{" + NL + "\t\tsuper(eNS_URI, ";
+	protected final String TEXT_72 = ");" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate static boolean isInited = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends."
+			+ NL + "\t *" + NL + "\t * <p>This method is used to initialize {@link ";
+	protected final String TEXT_73 = "#eINSTANCE} when that field is accessed." + NL
+			+ "\t * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @see #eNS_URI";
+	protected final String TEXT_74 = NL + "\t * @see #createPackageContents()" + NL
+			+ "\t * @see #initializePackageContents()";
+	protected final String TEXT_75 = NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static ";
+	protected final String TEXT_76 = " init()" + NL + "\t{" + NL + "\t\tif (isInited) return (";
+	protected final String TEXT_77 = ")";
+	protected final String TEXT_78 = ".Registry.INSTANCE.getEPackage(";
+	protected final String TEXT_79 = ".eNS_URI);" + NL;
+	protected final String TEXT_80 = NL + "\t\tinitializeRegistryHelpers();" + NL;
+	protected final String TEXT_81 = NL + "\t\t// Obtain or create and register package" + NL + "\t\tObject registered";
+	protected final String TEXT_82 = ".Registry.INSTANCE.get(eNS_URI);" + NL + "\t\t";
+	protected final String TEXT_83 = " the";
+	protected final String TEXT_84 = " = registered";
+	protected final String TEXT_85 = " instanceof ";
+	protected final String TEXT_86 = " ? (";
+	protected final String TEXT_87 = ")registered";
+	protected final String TEXT_88 = " : new ";
+	protected final String TEXT_89 = "();" + NL + "" + NL + "\t\tisInited = true;" + NL;
+	protected final String TEXT_90 = NL + "\t\t// Initialize simple dependencies";
+	protected final String TEXT_91 = NL + "\t\t";
+	protected final String TEXT_92 = ".eINSTANCE.eClass();";
+	protected final String TEXT_93 = NL + "\t\t// Obtain or create and register interdependencies";
+	protected final String TEXT_94 = "Object ";
+	protected final String TEXT_95 = "registeredPackage = ";
+	protected final String TEXT_96 = ".eNS_URI);" + NL + "\t\t";
+	protected final String TEXT_97 = " = (";
+	protected final String TEXT_98 = ")(registeredPackage instanceof ";
+	protected final String TEXT_99 = " ? registeredPackage : ";
+	protected final String TEXT_100 = ".eINSTANCE);";
+	protected final String TEXT_101 = NL + "\t\t// Load packages";
+	protected final String TEXT_102 = NL + "\t\tthe";
+	protected final String TEXT_103 = ".loadPackage();";
+	protected final String TEXT_104 = NL + "\t\t// Create package meta-data objects";
+	protected final String TEXT_105 = ".createPackageContents();";
+	protected final String TEXT_106 = NL + NL + "\t\t// Initialize created meta-data";
+	protected final String TEXT_107 = ".initializePackageContents();";
+	protected final String TEXT_108 = NL + "\t\t// Fix loaded packages";
+	protected final String TEXT_109 = ".fixPackageContents();";
+	protected final String TEXT_110 = NL + "\t\t// Register package validator" + NL + "\t\t";
+	protected final String TEXT_111 = ".Registry.INSTANCE.put" + NL + "\t\t\t(the";
+	protected final String TEXT_112 = "," + NL + "\t\t\t new ";
+	protected final String TEXT_113 = ".Descriptor()" + NL + "\t\t\t {";
+	protected final String TEXT_114 = NL + "\t\t\t\t @Override";
+	protected final String TEXT_115 = NL + "\t\t\t\t public ";
+	protected final String TEXT_116 = " getEValidator()" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return ";
+	protected final String TEXT_117 = ".INSTANCE;" + NL + "\t\t\t\t }" + NL + "\t\t\t });" + NL;
+	protected final String TEXT_118 = NL + "\t\t// Mark meta-data to indicate it can't be changed" + NL + "\t\tthe";
+	protected final String TEXT_119 = ".freeze();" + NL;
+	protected final String TEXT_120 = NL + "\t\t// Update the registry and return the package" + NL + "\t\t";
+	protected final String TEXT_121 = ".Registry.INSTANCE.put(";
+	protected final String TEXT_122 = ".eNS_URI, the";
+	protected final String TEXT_123 = ");" + NL + "\t\treturn the";
+	protected final String TEXT_124 = ";" + NL + "\t}";
+	protected final String TEXT_125 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static void initializeRegistryHelpers()" + NL + "\t{";
+	protected final String TEXT_126 = ".register" + NL + "\t\t\t(";
+	protected final String TEXT_127 = ".class," + NL + "\t\t\t new ";
+	protected final String TEXT_128 = ".Helper()" + NL + "\t\t\t {" + NL
+			+ "\t\t\t\t public boolean isInstance(Object instance)" + NL + "\t\t\t\t {" + NL
+			+ "\t\t\t\t\t return instance instanceof ";
+	protected final String TEXT_129 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
+			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return new ";
+	protected final String TEXT_130 = "[size];" + NL + "\t\t\t\t }" + NL + "\t\t\t });";
+	protected final String TEXT_131 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
+			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {";
+	protected final String TEXT_132 = NL + "\t\t\t\t\t return new ";
+	protected final String TEXT_133 = "[size]";
+	protected final String TEXT_134 = "[size];";
+	protected final String TEXT_135 = NL + "\t\t\t\t }" + NL + "\t\t});";
+	protected final String TEXT_136 = NL + "\t}" + NL + "" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static class WhiteList implements ";
+	protected final String TEXT_137 = ", EBasicWhiteList" + NL + "\t{";
+	protected final String TEXT_138 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
+	protected final String TEXT_139 = NL + "\t}";
+	protected final String TEXT_140 = NL + "\t * Returns the meta object for class '{@link ";
+	protected final String TEXT_141 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for class '<em>";
+	protected final String TEXT_142 = "</em>'." + NL + "\t * @see ";
+	protected final String TEXT_143 = NL + "\t * @model ";
+	protected final String TEXT_144 = NL + "\t *        ";
+	protected final String TEXT_145 = NL + "\t * @model";
+	protected final String TEXT_146 = NL + "\t * Returns the meta object for enum '{@link ";
+	protected final String TEXT_147 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for enum '<em>";
+	protected final String TEXT_148 = NL + "\t * Returns the meta object for data type '<em>";
+	protected final String TEXT_149 = "</em>'.";
+	protected final String TEXT_150 = NL + "\t * Returns the meta object for data type '{@link ";
+	protected final String TEXT_151 = "</em>}'.";
+	protected final String TEXT_152 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_153 = NL + "     * <!-- begin-model-doc -->" + NL + "     * ";
+	protected final String TEXT_154 = NL + "     * <!-- end-model-doc -->";
+	protected final String TEXT_155 = NL + "\t * @return the meta object for data type '<em>";
+	protected final String TEXT_156 = NL + "\t@Override";
+	protected final String TEXT_157 = NL + "\tpublic ";
+	protected final String TEXT_158 = " get";
+	protected final String TEXT_159 = "()" + NL + "\t{";
+	protected final String TEXT_160 = NL + "\t\tif (";
+	protected final String TEXT_161 = " == null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_162 = ".eNS_URI).getEClassifiers().get(";
+	protected final String TEXT_163 = ");" + NL + "\t\t}";
+	protected final String TEXT_164 = NL + "\t\treturn ";
+	protected final String TEXT_165 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_166 = "();" + NL;
+	protected final String TEXT_167 = NL + "\t/**" + NL + "\t * Returns the meta object for the ";
+	protected final String TEXT_168 = " '{@link ";
+	protected final String TEXT_169 = "#";
+	protected final String TEXT_170 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the ";
+	protected final String TEXT_171 = " '<em>";
+	protected final String TEXT_172 = NL + "\t * @see #get";
+	protected final String TEXT_173 = NL + "\t\treturn (";
+	protected final String TEXT_174 = ".getEStructuralFeatures().get(";
+	protected final String TEXT_175 = ");";
+	protected final String TEXT_176 = NL + "        return (";
+	protected final String TEXT_177 = ")get";
+	protected final String TEXT_178 = "().getEStructuralFeatures().get(";
+	protected final String TEXT_179 = "();";
+	protected final String TEXT_180 = NL + "\t/**" + NL + "\t * Returns the meta object for the '{@link ";
+	protected final String TEXT_181 = "(";
+	protected final String TEXT_182 = ") <em>";
+	protected final String TEXT_183 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the '<em>";
+	protected final String TEXT_184 = "</em>' operation." + NL + "\t * @see ";
+	protected final String TEXT_185 = ".getEOperations().get(";
+	protected final String TEXT_186 = NL + "        return get";
+	protected final String TEXT_187 = "().getEOperations().get(";
+	protected final String TEXT_188 = NL + "\t/**" + NL
+			+ "\t * Returns the factory that creates the instances of the model." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the factory that creates the instances of the model." + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_189 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_190 = "()" + NL + "\t{" + NL + "\t\treturn (";
+	protected final String TEXT_191 = ")getEFactoryInstance();" + NL + "\t}";
+	protected final String TEXT_192 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isCreated = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates the meta-model objects for the package.  This method is" + NL
+			+ "\t * guarded to have no affect on any invocation but its first." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_193 = NL + "\t@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_194 = NL + "\tpublic void createPackageContents()" + NL + "\t{" + NL
+			+ "\t\tif (isCreated) return;" + NL + "\t\tisCreated = true;";
+	protected final String TEXT_195 = NL + NL + "\t\t// Create classes and their features";
+	protected final String TEXT_196 = " = create";
+	protected final String TEXT_197 = NL + "\t\tcreate";
+	protected final String TEXT_198 = ", ";
+	protected final String TEXT_199 = NL + "\t\tcreateEOperation(";
+	protected final String TEXT_200 = NL + NL + "\t\t// Create enums";
+	protected final String TEXT_201 = " = createEEnum(";
+	protected final String TEXT_202 = NL + NL + "\t\t// Create data types";
+	protected final String TEXT_203 = " = createEDataType(";
+	protected final String TEXT_204 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isInitialized = false;" + NL;
+	protected final String TEXT_205 = NL + "\t/**" + NL
+			+ "\t * Complete the initialization of the package and its meta-model.  This" + NL
+			+ "\t * method is guarded to have no affect on any invocation but its first." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_206 = NL + "\tpublic void initializePackageContents()" + NL + "\t{" + NL
+			+ "\t\tif (isInitialized) return;" + NL + "\t\tisInitialized = true;" + NL + "" + NL
+			+ "\t\t// Initialize package" + NL + "\t\tsetName(eNAME);" + NL + "\t\tsetNsPrefix(eNS_PREFIX);" + NL
+			+ "\t\tsetNsURI(eNS_URI);";
+	protected final String TEXT_207 = NL + NL + "\t\t// Obtain other dependent packages";
+	protected final String TEXT_208 = ".eNS_URI);";
+	protected final String TEXT_209 = NL + NL + "\t\t// Add subpackages";
+	protected final String TEXT_210 = NL + "\t\tgetESubpackages().add(";
+	protected final String TEXT_211 = NL + NL + "\t\t// Create type parameters";
+	protected final String TEXT_212 = "_";
+	protected final String TEXT_213 = " = addETypeParameter(";
+	protected final String TEXT_214 = ", \"";
+	protected final String TEXT_215 = "\");";
+	protected final String TEXT_216 = NL + "\t\taddETypeParameter(";
+	protected final String TEXT_217 = NL + NL + "\t\t// Set bounds for type parameters";
+	protected final String TEXT_218 = "g";
+	protected final String TEXT_219 = " = createEGenericType(";
+	protected final String TEXT_220 = NL + "\t\tg";
+	protected final String TEXT_221 = ".";
+	protected final String TEXT_222 = "(g";
+	protected final String TEXT_223 = ".getEBounds().add(g1);";
+	protected final String TEXT_224 = NL + NL + "\t\t// Add supertypes to classes";
+	protected final String TEXT_225 = ".getESuperTypes().add(";
+	protected final String TEXT_226 = ".get";
+	protected final String TEXT_227 = "());";
+	protected final String TEXT_228 = ".getEGenericSuperTypes().add(g1);";
+	protected final String TEXT_229 = NL + NL + "\t\t// Initialize classes";
+	protected final String TEXT_230 = ", features, and operations; add parameters";
+	protected final String TEXT_231 = " and features; add operations and parameters";
+	protected final String TEXT_232 = NL + "\t\tinitEClass(";
+	protected final String TEXT_233 = "null";
+	protected final String TEXT_234 = ".class";
+	protected final String TEXT_235 = "\", ";
+	protected final String TEXT_236 = "\"";
+	protected final String TEXT_237 = NL + "\t\tinitEReference(get";
+	protected final String TEXT_238 = "(), ";
+	protected final String TEXT_239 = "g1";
+	protected final String TEXT_240 = NL + "\t\tget";
+	protected final String TEXT_241 = "().getEKeys().add(";
+	protected final String TEXT_242 = NL + "\t\tinitEAttribute(get";
+	protected final String TEXT_243 = "initEOperation(get";
+	protected final String TEXT_244 = "addEOperation(";
+	protected final String TEXT_245 = "(), \"";
+	protected final String TEXT_246 = ", null, \"";
+	protected final String TEXT_247 = "addETypeParameter(op, \"";
+	protected final String TEXT_248 = NL + "\t\tt";
+	protected final String TEXT_249 = NL + "\t\taddEParameter(op, ";
+	protected final String TEXT_250 = NL + "\t\taddEException(op, g";
+	protected final String TEXT_251 = NL + "\t\taddEException(op, ";
+	protected final String TEXT_252 = NL + "\t\tinitEOperation(op, g1);";
+	protected final String TEXT_253 = NL + NL + "\t\t// Initialize enums and add enum literals";
+	protected final String TEXT_254 = NL + "\t\tinitEEnum(";
+	protected final String TEXT_255 = ".class, \"";
+	protected final String TEXT_256 = NL + "\t\taddEEnumLiteral(";
+	protected final String TEXT_257 = NL + NL + "\t\t// Initialize data types";
+	protected final String TEXT_258 = NL + "\t\tinitEDataType(";
+	protected final String TEXT_259 = NL + NL + "\t\t// Create resource" + NL + "\t\tcreateResource(";
+	protected final String TEXT_260 = NL + NL + "\t\t// Create annotations";
+	protected final String TEXT_261 = NL + "\t\t// ";
+	protected final String TEXT_262 = "Annotations();";
+	protected final String TEXT_263 = NL + "\t}" + NL;
+	protected final String TEXT_264 = NL + "\t/**" + NL + "\t * Initializes the annotations for <b>";
+	protected final String TEXT_265 = "</b>." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void create";
+	protected final String TEXT_266 = "Annotations()" + NL + "\t{" + NL + "\t\tString source = ";
+	protected final String TEXT_267 = "null;";
+	protected final String TEXT_268 = NL + "\t\taddAnnotation" + NL + "\t\t  (";
+	protected final String TEXT_269 = "," + NL + "\t\t   source," + NL + "\t\t   new String[]" + NL + "\t\t   {";
+	protected final String TEXT_270 = NL + "\t\t\t   ";
+	protected final String TEXT_271 = NL + "\t\t   }";
+	protected final String TEXT_272 = ",";
+	protected final String TEXT_273 = NL + "\t\t   new ";
+	protected final String TEXT_274 = "[]" + NL + "\t\t   {";
+	protected final String TEXT_275 = NL + "\t\t\t ";
+	protected final String TEXT_276 = ".createURI(";
+	protected final String TEXT_277 = "eNS_URI).appendFragment(\"";
+	protected final String TEXT_278 = "\")";
+	protected final String TEXT_279 = NL + "\t\t   });";
+	protected final String TEXT_280 = "," + NL + "\t\t   ";
+	protected final String TEXT_281 = "new boolean[] { ";
+	protected final String TEXT_282 = " }";
+	protected final String TEXT_283 = "null,";
+	protected final String TEXT_284 = "\",";
+	protected final String TEXT_285 = NL + "\t\t   new String[]" + NL + "\t\t   {";
+	protected final String TEXT_286 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isLoaded = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Laods the package and any sub-packages from their serialized form." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic void loadPackage()" + NL + "\t{" + NL + "\t\tif (isLoaded) return;" + NL
+			+ "\t\tisLoaded = true;" + NL + "" + NL + "\t\t";
+	protected final String TEXT_287 = " url = getClass().getResource(packageFilename);" + NL + "\t\tif (url == null)"
+			+ NL + "\t\t{" + NL
+			+ "\t\t\tthrow new RuntimeException(\"Missing serialized package: \" + packageFilename);";
+	protected final String TEXT_288 = NL + "\t\t}" + NL + "\t\t";
+	protected final String TEXT_289 = " uri = ";
+	protected final String TEXT_290 = ".createURI(url.toString());" + NL + "\t\t";
+	protected final String TEXT_291 = " resource = new ";
+	protected final String TEXT_292 = "().createResource(uri);" + NL + "\t\ttry" + NL + "\t\t{" + NL
+			+ "\t\t\tresource.load(null);" + NL + "\t\t}" + NL + "\t\tcatch (";
+	protected final String TEXT_293 = " exception)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
+	protected final String TEXT_294 = "(exception);" + NL + "\t\t}" + NL + "\t\tinitializeFromLoadedEPackage(this, (";
+	protected final String TEXT_295 = ")resource.getContents().get(0));" + NL + "\t\tcreateResource(eNS_URI);" + NL
+			+ "\t}" + NL;
+	protected final String TEXT_296 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isFixed = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Fixes up the loaded package, to make it appear as if it had been programmatically built." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic void fixPackageContents()" + NL + "\t{" + NL + "\t\tif (isFixed) return;" + NL
+			+ "\t\tisFixed = true;" + NL + "\t\tfixEClassifiers();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Sets the instance class on the given classifier." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_297 = NL + "\tprotected void fixInstanceClass(";
+	protected final String TEXT_298 = " eClassifier)" + NL + "\t{" + NL
+			+ "\t\tif (eClassifier.getInstanceClassName() == null)" + NL + "\t\t{";
+	protected final String TEXT_299 = NL + "\t\t\teClassifier.setInstanceClassName(\"";
+	protected final String TEXT_300 = ".\" + eClassifier.getName());";
+	protected final String TEXT_301 = NL + "\t\t\tsetGeneratedClassName(eClassifier);";
+	protected final String TEXT_302 = NL + "\t\t\tswitch (eClassifier.getClassifierID())" + NL + "\t\t\t{";
+	protected final String TEXT_303 = NL + "\t\t\t\tcase ";
+	protected final String TEXT_304 = ":";
+	protected final String TEXT_305 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tbreak;" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tdefault:" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\teClassifier.setInstanceClassName(\"";
+	protected final String TEXT_306 = NL + "\t\t\t\t\tsetGeneratedClassName(eClassifier);" + NL + "\t\t\t\t\tbreak;"
+			+ NL + "\t\t\t\t}" + NL + "\t\t\t}";
+	protected final String TEXT_307 = NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_308 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_309 = " addEOperation(";
+	protected final String TEXT_310 = " owner, ";
+	protected final String TEXT_311 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)"
+			+ NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_312 = " o = addEOperation(owner, type, name, lowerBound, upperBound);" + NL
+			+ "\t\to.setUnique(isUnique);" + NL + "\t\to.setOrdered(isOrdered);" + NL + "\t\treturn o;" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_313 = " addEParameter(";
+	protected final String TEXT_314 = " p = ecoreFactory.createEParameter();" + NL + "\t\tp.setEType(type);" + NL
+			+ "\t\tp.setName(name);" + NL + "\t\tp.setLowerBound(lowerBound);" + NL + "\t\tp.setUpperBound(upperBound);"
+			+ NL + "\t\tp.setUnique(isUnique);" + NL + "\t\tp.setOrdered(isOrdered);" + NL
+			+ "\t\towner.getEParameters().add(p);" + NL + "\t\treturn p;" + NL + "\t}" + NL;
+	protected final String TEXT_315 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * Defines literals for the meta objects that represent" + NL + "\t * <ul>" + NL
+			+ "\t *   <li>each class,</li>" + NL + "\t *   <li>each feature of each class,</li>";
+	protected final String TEXT_316 = NL + "\t *   <li>each operation of each class,</li>";
+	protected final String TEXT_317 = NL + "\t *   <li>each enum,</li>" + NL + "\t *   <li>and each data type</li>" + NL
+			+ "\t * </ul>" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_318 = "public ";
+	protected final String TEXT_319 = "interface Literals" + NL + "\t{";
+	protected final String TEXT_320 = NL + "\t\t/**";
+	protected final String TEXT_321 = NL + "\t\t * The meta object literal for the '{@link ";
+	protected final String TEXT_322 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+	protected final String TEXT_323 = "</em>}' enum." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+	protected final String TEXT_324 = NL + "\t\t * The meta object literal for the '<em>";
+	protected final String TEXT_325 = "</em>' data type." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_326 = NL + "\t\t * @see ";
+	protected final String TEXT_327 = NL + "\t\t * ";
+	protected final String TEXT_328 = NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_329 = NL + "\t\t@Deprecated";
+	protected final String TEXT_330 = " = eINSTANCE.get";
+	protected final String TEXT_331 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
+	protected final String TEXT_332 = " feature." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_333 = "</b></em>' operation." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_334 = NL + "} //";
+	protected final String TEXT_335 = NL;
+
+	public PackageClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_335);
+		stringBuffer.append(TEXT_335);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getReflectionClassPackageName();
+		className = genPackage.getPackageClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = ((Object[]) new Object[] {
+				new Object[] { genPackage,
+						genPackage.getGenModel().isSuppressEMFMetaData()
+								|| genPackage.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE,
+						Boolean.TRUE } })[0];
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		final GenPackage genPackage = (GenPackage) ((Object[]) argument)[0];
+		final GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
+		boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
+		boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation()
+				&& !(isInterface && isImplementation);
+		boolean packageNeedsSuppressDeprecation = isJDK50
+				&& GenModelUtil.hasAPIDeprecatedTag(genPackage.getOrderedGenClassifiers())
+				&& !genPackage.hasAPIDeprecatedTag() && !genModel.isSuppressEMFMetaData();
+		String publicStaticFinalFlag = isImplementation ? "public static final " : "";
+		boolean needsAddEOperation = false;
+		boolean needsAddEParameter = false;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (isImplementation && !genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getClassPackageName());
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getReflectionPackageName());
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		genModel.markImportLocation(stringBuffer, genPackage);
+		if (isImplementation) {
+			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Registry");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Descriptor");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.EPackageImpl.EBasicWhiteList");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");
+			if (genPackage.isLiteralsInterface()) {
+				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + ".Literals");
+			}
+			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers())
+				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + "."
+						+ genPackage.getClassifierID(genClassifier));
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_5);
+			if (genModel.isOperationReflection()) {
+				stringBuffer.append(TEXT_6);
+			}
+			stringBuffer.append(TEXT_7);
+			if (genPackage.hasDocumentation()) {
+				stringBuffer.append(TEXT_8);
+				stringBuffer.append(genPackage.getDocumentation(genModel.getIndentation(stringBuffer)));
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genPackage.getQualifiedFactoryInterfaceName());
+			if (!genModel.isSuppressEMFModelTags()) {
+				boolean first = true;
+				for (StringTokenizer stringTokenizer = new StringTokenizer(genPackage.getModelInfo(),
+						"\n\r"); stringTokenizer.hasMoreTokens();) {
+					String modelInfo = stringTokenizer.nextToken();
+					if (first) {
+						first = false;
+						stringBuffer.append(TEXT_11);
+						stringBuffer.append(modelInfo);
+					} else {
+						stringBuffer.append(TEXT_12);
+						stringBuffer.append(modelInfo);
+					}
+				}
+				if (first) {
+					stringBuffer.append(TEXT_13);
+				}
+			}
+			stringBuffer.append(TEXT_14);
+		} else {
+			stringBuffer.append(TEXT_15);
+			if (genPackage.hasAPITags()) {
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_14);
+		}
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_17);
+		}
+		if (isImplementation) {
+			if (packageNeedsSuppressDeprecation) {
+				stringBuffer.append(TEXT_18);
+			}
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageImpl"));
+			if (!isInterface) {
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			}
+		} else {
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+		}
+		stringBuffer.append(TEXT_23);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genPackage.getPackageName());
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genPackage.getNSURI());
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genPackage.getNSName());
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getNonNLS());
+			if (genPackage.isContentType()) {
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(publicStaticFinalFlag);
+				stringBuffer.append(genModel.getImportedName("java.lang.String"));
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genPackage.getContentTypeIdentifier());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genModel.getNonNLS());
+			}
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genPackage.getQualifiedPackageClassName());
+			stringBuffer.append(TEXT_37);
+			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) {
+				stringBuffer.append(TEXT_38);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					if (!genClass.isInterface()) {
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genClass.getQualifiedClassName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genClass.getQualifiedClassName());
+					} else {
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					}
+				} else if (genClassifier instanceof GenEnum) {
+					GenEnum genEnum = (GenEnum) genClassifier;
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genEnum.getQualifiedName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(genEnum.getQualifiedName());
+				} else if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genDataType.getFormattedName());
+					stringBuffer.append(TEXT_44);
+					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+					}
+				}
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genPackage.getQualifiedPackageClassName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_47);
+				if (genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_49);
+				if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(publicStaticFinalFlag);
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genPackage.getClassifierID(genClassifier));
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genPackage.getClassifierValue(genClassifier));
+				stringBuffer.append(TEXT_54);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					for (GenFeature genFeature : genClass.getAllGenFeatures()) {
+						stringBuffer.append(TEXT_55);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_56);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_57);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_58);
+						if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_50);
+						}
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(publicStaticFinalFlag);
+						stringBuffer.append(TEXT_52);
+						stringBuffer.append(genClass.getFeatureID(genFeature));
+						stringBuffer.append(TEXT_53);
+						stringBuffer.append(genClass.getFeatureValue(genFeature));
+						stringBuffer.append(TEXT_54);
+					}
+					stringBuffer.append(TEXT_59);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_60);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_58);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(publicStaticFinalFlag);
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genClass.getFeatureCountID());
+					stringBuffer.append(TEXT_53);
+					stringBuffer.append(genClass.getFeatureCountValue());
+					stringBuffer.append(TEXT_54);
+					if (genModel.isOperationReflection()) {
+						for (GenOperation genOperation : genClass.getAllGenOperations(false)) {
+							if (genClass.getOverrideGenOperation(genOperation) == null) {
+								stringBuffer.append(TEXT_61);
+								stringBuffer.append(genOperation.getFormattedName());
+								stringBuffer.append(TEXT_62);
+								if (genOperation.hasImplicitAPITags()) {
+									stringBuffer.append(TEXT_48);
+									stringBuffer.append(
+											genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+								}
+								stringBuffer.append(TEXT_58);
+								if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {
+									stringBuffer.append(TEXT_50);
+								}
+								stringBuffer.append(TEXT_51);
+								stringBuffer.append(publicStaticFinalFlag);
+								stringBuffer.append(TEXT_52);
+								stringBuffer.append(genClass.getOperationID(genOperation, false));
+								stringBuffer.append(TEXT_53);
+								stringBuffer.append(genClass.getOperationValue(genOperation));
+								stringBuffer.append(TEXT_54);
+							}
+						}
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_60);
+						if (genClass.hasAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_58);
+						if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_50);
+						}
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(publicStaticFinalFlag);
+						stringBuffer.append(TEXT_52);
+						stringBuffer.append(genClass.getOperationCountID());
+						stringBuffer.append(TEXT_53);
+						stringBuffer.append(genClass.getOperationCountValue());
+						stringBuffer.append(TEXT_54);
+					}
+				}
+			}
+		}
+		if (isImplementation) {
+			if (genPackage.isLoadingInitialization()) {
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genPackage.getSerializedPackageFilename());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_4);
+			}
+			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+				stringBuffer.append(TEXT_65);
+				if (genClassifier.hasAPITags(true)) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer), true));
+				}
+				stringBuffer.append(TEXT_49);
+				if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_66);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genClassifier.getClassifierInstanceName());
+				stringBuffer.append(TEXT_68);
+			}
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			stringBuffer.append(TEXT_70);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_71);
+			stringBuffer.append(genPackage.getQualifiedEFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_72);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_73);
+			if (!genPackage.isLoadedInitialization()) {
+				stringBuffer.append(TEXT_74);
+			}
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_77);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_78);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_79);
+			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+				stringBuffer.append(TEXT_80);
+			}
+			stringBuffer.append(TEXT_81);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_53);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_82);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_83);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_84);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_85);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_86);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_87);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_88);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_89);
+			if (!genPackage.getPackageSimpleDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_90);
+				for (GenPackage dep : genPackage.getPackageSimpleDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(dep.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_92);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (!genPackage.getPackageInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_93);
+				for (ListIterator<GenPackage> i = genPackage.getPackageInterDependencies().listIterator(); i
+						.hasNext();) {
+					GenPackage interdep = i.next();
+					stringBuffer.append(TEXT_91);
+					if (i.previousIndex() == 0) {
+						stringBuffer.append(TEXT_94);
+					}
+					stringBuffer.append(TEXT_95);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+					stringBuffer.append(TEXT_78);
+					stringBuffer.append(interdep.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_96);
+					stringBuffer.append(interdep.getImportedPackageClassName());
+					stringBuffer.append(TEXT_67);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_97);
+					stringBuffer.append(interdep.getImportedPackageClassName());
+					stringBuffer.append(TEXT_98);
+					stringBuffer.append(interdep.getImportedPackageClassName());
+					stringBuffer.append(TEXT_99);
+					stringBuffer.append(interdep.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_100);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_101);
+				if (genPackage.isLoadingInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_103);
+				}
+				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
+					if (interdep.isLoadingInitialization()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+						stringBuffer.append(TEXT_103);
+					}
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (!genPackage.isLoadedInitialization() || !genPackage.getPackageBuildInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_104);
+				if (!genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_105);
+				}
+				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_105);
+				}
+				stringBuffer.append(TEXT_106);
+				if (!genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_107);
+				}
+				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_107);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_108);
+				if (genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_109);
+				}
+				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_109);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (genPackage.hasConstraints()) {
+				stringBuffer.append(TEXT_110);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
+				stringBuffer.append(TEXT_111);
+				stringBuffer.append(genPackage.getBasicPackageName());
+				stringBuffer.append(TEXT_112);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
+				stringBuffer.append(TEXT_113);
+				if (genModel.useInterfaceOverrideAnnotation()) {
+					stringBuffer.append(TEXT_114);
+				}
+				stringBuffer.append(TEXT_115);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
+				stringBuffer.append(TEXT_116);
+				stringBuffer.append(genPackage.getImportedValidatorClassName());
+				stringBuffer.append(TEXT_117);
+			}
+			if (!genPackage.isEcorePackage()) {
+				stringBuffer.append(TEXT_118);
+				stringBuffer.append(genPackage.getBasicPackageName());
+				stringBuffer.append(TEXT_119);
+			}
+			stringBuffer.append(TEXT_120);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_121);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_122);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_123);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_124);
+			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+				stringBuffer.append(TEXT_125);
+				Set<String> helpers = new HashSet<String>();
+				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+					if (genClassifier instanceof GenClass) {
+						GenClass genClass = (GenClass) genClassifier;
+						if (!genClass.isDynamic()) {
+							String theClass = genClass.isMapEntry() ? genClass.getImportedClassName()
+									: genClass.getRawImportedInterfaceName();
+							if (helpers.add(theClass)) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_127);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_128);
+								stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
+										: genClass.getRawImportedInterfaceName()
+												+ genClass.getInterfaceWildTypeArguments());
+								stringBuffer.append(TEXT_129);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_130);
+							}
+						}
+					} else if (genClassifier instanceof GenDataType) {
+						GenDataType genDataType = (GenDataType) genClassifier;
+						if (!genDataType.isPrimitiveType() && !genDataType.isObjectType()) {
+							String theClass = genDataType.getRawImportedInstanceClassName();
+							if (helpers.add(theClass)) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_127);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_128);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_131);
+								if (genDataType.isArrayType()) {
+									String componentType = theClass;
+									String indices = "";
+									while (componentType.endsWith("[]")) {
+										componentType = componentType.substring(0, componentType.length() - 2);
+										indices += "[]";
+									}
+									stringBuffer.append(TEXT_132);
+									stringBuffer.append(componentType);
+									stringBuffer.append(TEXT_133);
+									stringBuffer.append(indices);
+									stringBuffer.append(TEXT_3);
+								} else {
+									stringBuffer.append(TEXT_132);
+									stringBuffer.append(theClass);
+									stringBuffer.append(TEXT_134);
+								}
+								stringBuffer.append(TEXT_135);
+							}
+						}
+					}
+				}
+				stringBuffer.append(TEXT_136);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.IsSerializable"));
+				stringBuffer.append(TEXT_137);
+				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+					if (genClassifier instanceof GenClass) {
+						GenClass genClass = (GenClass) genClassifier;
+						if (!genClass.isDynamic()) {
+							stringBuffer.append(TEXT_138);
+							stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
+									: genClass.getImportedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genClass.getSafeUncapName());
+							stringBuffer.append(TEXT_54);
+						}
+					} else if (genClassifier instanceof GenDataType) {
+						GenDataType genDataType = (GenDataType) genClassifier;
+						if (!genDataType.isObjectType() && genDataType.isSerializable()) {
+							stringBuffer.append(TEXT_138);
+							stringBuffer.append(genDataType.getImportedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_54);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_139);
+			}
+			stringBuffer.append(TEXT_4);
+		}
+		if (isInterface) { // TODO REMOVE THIS BOGUS EMPTY LINE
+			stringBuffer.append(TEXT_4);
+		}
+		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+			if (isInterface) {
+				stringBuffer.append(TEXT_38);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					stringBuffer.append(TEXT_140);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_141);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_142);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					if (!genModel.isSuppressEMFModelTags()
+							&& (genClass.isExternalInterface() || genClass.isDynamic())) {
+						boolean first = true;
+						for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(),
+								"\n\r"); stringTokenizer.hasMoreTokens();) {
+							String modelInfo = stringTokenizer.nextToken();
+							if (first) {
+								first = false;
+								stringBuffer.append(TEXT_143);
+								stringBuffer.append(modelInfo);
+							} else {
+								stringBuffer.append(TEXT_144);
+								stringBuffer.append(modelInfo);
+							}
+						}
+						if (first) {
+							stringBuffer.append(TEXT_145);
+						}
+					}
+				} else if (genClassifier instanceof GenEnum) {
+					GenEnum genEnum = (GenEnum) genClassifier;
+					stringBuffer.append(TEXT_146);
+					stringBuffer.append(genEnum.getQualifiedName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_147);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_142);
+					stringBuffer.append(genEnum.getQualifiedName());
+				} else if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					if (genDataType.isPrimitiveType() || genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_149);
+					} else {
+						stringBuffer.append(TEXT_150);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_151);
+					}
+					stringBuffer.append(TEXT_152);
+					if (genDataType.hasDocumentation()) {
+						stringBuffer.append(TEXT_153);
+						stringBuffer.append(genDataType.getDocumentation(genModel.getIndentation(stringBuffer)));
+						stringBuffer.append(TEXT_154);
+					}
+					stringBuffer.append(TEXT_155);
+					stringBuffer.append(genDataType.getFormattedName());
+					stringBuffer.append(TEXT_149);
+					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+					}
+					if (!genModel.isSuppressEMFModelTags()) {
+						boolean first = true;
+						for (StringTokenizer stringTokenizer = new StringTokenizer(genDataType.getModelInfo(),
+								"\n\r"); stringTokenizer.hasMoreTokens();) {
+							String modelInfo = stringTokenizer.nextToken();
+							if (first) {
+								first = false;
+								stringBuffer.append(TEXT_143);
+								stringBuffer.append(modelInfo);
+							} else {
+								stringBuffer.append(TEXT_144);
+								stringBuffer.append(modelInfo);
+							}
+						}
+						if (first) {
+							stringBuffer.append(TEXT_145);
+						}
+					}
+				}
+				if ((genClassifier instanceof GenClass || genClassifier instanceof GenEnum)
+						&& genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_49);
+			} else {
+				stringBuffer.append(TEXT_65);
+				if (genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_49);
+			}
+			if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_50);
+			}
+			if (isImplementation) {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_156);
+				}
+				stringBuffer.append(TEXT_157);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_158);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_159);
+				if (genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_160);
+					stringBuffer.append(genClassifier.getClassifierInstanceName());
+					stringBuffer.append(TEXT_161);
+					stringBuffer.append(genClassifier.getClassifierInstanceName());
+					stringBuffer.append(TEXT_97);
+					stringBuffer.append(genClassifier.getImportedMetaType());
+					stringBuffer.append(TEXT_77);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+					stringBuffer.append(TEXT_78);
+					stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_162);
+					stringBuffer.append(genPackage.getLocalClassifierIndex(genClassifier));
+					stringBuffer.append(TEXT_163);
+				}
+				stringBuffer.append(TEXT_164);
+				stringBuffer.append(genClassifier.getClassifierInstanceName());
+				stringBuffer.append(TEXT_165);
+			} else {
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_158);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_166);
+			}
+			if (genClassifier instanceof GenClass) {
+				GenClass genClass = (GenClass) genClassifier;
+				for (GenFeature genFeature : genClass.getGenFeatures()) {
+					if (isInterface) {
+						stringBuffer.append(TEXT_167);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_168);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genFeature.getGetAccessor());
+						}
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_170);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_171);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_142);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_47);
+						}
+						stringBuffer.append(TEXT_172);
+						stringBuffer.append(genClass.getClassifierAccessorName());
+						stringBuffer.append(TEXT_47);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_49);
+					} else {
+						stringBuffer.append(TEXT_65);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_49);
+					}
+					if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					if (isImplementation) {
+						if (useInterfaceOverrideAnnotation) {
+							stringBuffer.append(TEXT_156);
+						}
+						stringBuffer.append(TEXT_157);
+						stringBuffer.append(genFeature.getImportedMetaType());
+						stringBuffer.append(TEXT_158);
+						stringBuffer.append(genFeature.getFeatureAccessorName());
+						stringBuffer.append(TEXT_159);
+						if (!genPackage.isLoadedInitialization()) {
+							stringBuffer.append(TEXT_173);
+							stringBuffer.append(genFeature.getImportedMetaType());
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genClass.getClassifierInstanceName());
+							stringBuffer.append(TEXT_174);
+							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
+							stringBuffer.append(TEXT_175);
+						} else {
+							stringBuffer.append(TEXT_176);
+							stringBuffer.append(genFeature.getImportedMetaType());
+							stringBuffer.append(TEXT_177);
+							stringBuffer.append(genClassifier.getClassifierAccessorName());
+							stringBuffer.append(TEXT_178);
+							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
+							stringBuffer.append(TEXT_175);
+						}
+						stringBuffer.append(TEXT_139);
+					} else {
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genFeature.getImportedMetaType());
+						stringBuffer.append(TEXT_158);
+						stringBuffer.append(genFeature.getFeatureAccessorName());
+						stringBuffer.append(TEXT_179);
+					}
+					stringBuffer.append(TEXT_4);
+				}
+				if (genModel.isOperationReflection()) {
+					for (GenOperation genOperation : genClass.getGenOperations()) {
+						if (isInterface) {
+							stringBuffer.append(TEXT_180);
+							stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genOperation.getName());
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(genOperation.getParameterTypes(", "));
+							stringBuffer.append(TEXT_182);
+							stringBuffer.append(genOperation.getFormattedName());
+							stringBuffer.append(TEXT_183);
+							stringBuffer.append(genOperation.getFormattedName());
+							stringBuffer.append(TEXT_184);
+							stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genOperation.getName());
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(genOperation.getParameterTypes(", "));
+							stringBuffer.append(TEXT_77);
+							if (genOperation.hasImplicitAPITags()) {
+								stringBuffer.append(TEXT_48);
+								stringBuffer
+										.append(genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+							}
+							stringBuffer.append(TEXT_49);
+						} else {
+							stringBuffer.append(TEXT_65);
+							if (genOperation.hasImplicitAPITags()) {
+								stringBuffer.append(TEXT_48);
+								stringBuffer
+										.append(genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+							}
+							stringBuffer.append(TEXT_49);
+						}
+						if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_50);
+						}
+						if (isImplementation) {
+							if (useInterfaceOverrideAnnotation) {
+								stringBuffer.append(TEXT_156);
+							}
+							stringBuffer.append(TEXT_157);
+							stringBuffer.append(genOperation.getImportedMetaType());
+							stringBuffer.append(TEXT_158);
+							stringBuffer.append(genOperation.getOperationAccessorName());
+							stringBuffer.append(TEXT_159);
+							if (!genPackage.isLoadedInitialization()) {
+								stringBuffer.append(TEXT_164);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_185);
+								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
+								stringBuffer.append(TEXT_175);
+							} else {
+								stringBuffer.append(TEXT_186);
+								stringBuffer.append(genClassifier.getClassifierAccessorName());
+								stringBuffer.append(TEXT_187);
+								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
+								stringBuffer.append(TEXT_175);
+							}
+							stringBuffer.append(TEXT_139);
+						} else {
+							stringBuffer.append(TEXT_51);
+							stringBuffer.append(genOperation.getImportedMetaType());
+							stringBuffer.append(TEXT_158);
+							stringBuffer.append(genOperation.getOperationAccessorName());
+							stringBuffer.append(TEXT_179);
+						}
+						stringBuffer.append(TEXT_4);
+					}
+				}
+			}
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_188);
+		} else {
+			stringBuffer.append(TEXT_189);
+		}
+		if (isImplementation) {
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_156);
+			}
+			stringBuffer.append(TEXT_157);
+			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
+			stringBuffer.append(TEXT_158);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_190);
+			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
+			stringBuffer.append(TEXT_191);
+		} else {
+			stringBuffer.append(TEXT_51);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			stringBuffer.append(TEXT_158);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_179);
+		}
+		stringBuffer.append(TEXT_4);
+		if (isImplementation) {
+			if (!genPackage.isLoadedInitialization()) {
+				stringBuffer.append(TEXT_192);
+				{
+					boolean needsSuppressDeprecation = false;
+					if (!packageNeedsSuppressDeprecation && isJDK50 && !genModel.isSuppressEMFMetaData()) {
+						LOOP: for (GenClass genClass : genPackage.getGenClasses()) {
+							for (GenFeature genFeature : genClass.getGenFeatures()) {
+								if (genFeature.hasAPIDeprecatedTag()) {
+									needsSuppressDeprecation = true;
+									break LOOP;
+								}
+							}
+							for (GenOperation genOperation : genClass.getGenOperations()) {
+								if (genOperation.hasAPIDeprecatedTag()) {
+									needsSuppressDeprecation = true;
+									break LOOP;
+								}
+							}
+						}
+						if (needsSuppressDeprecation) {
+							stringBuffer.append(TEXT_193);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_194);
+				if (!genPackage.getGenClasses().isEmpty()) {
+					stringBuffer.append(TEXT_195);
+					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
+						GenClass genClass = c.next();
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genClass.getClassifierInstanceName());
+						stringBuffer.append(TEXT_196);
+						stringBuffer.append(genClass.getMetaType());
+						stringBuffer.append(TEXT_181);
+						stringBuffer.append(genClass.getClassifierID());
+						stringBuffer.append(TEXT_175);
+						for (GenFeature genFeature : genClass.getGenFeatures()) {
+							stringBuffer.append(TEXT_197);
+							stringBuffer.append(genFeature.getMetaType());
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(genClass.getClassifierInstanceName());
+							stringBuffer.append(TEXT_198);
+							stringBuffer.append(genClass.getFeatureID(genFeature));
+							stringBuffer.append(TEXT_175);
+						}
+						if (genModel.isOperationReflection()) {
+							for (GenOperation genOperation : genClass.getGenOperations()) {
+								stringBuffer.append(TEXT_199);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genClass.getOperationID(genOperation, false));
+								stringBuffer.append(TEXT_175);
+							}
+						}
+						if (c.hasNext()) {
+							stringBuffer.append(TEXT_4);
+						}
+					}
+				}
+				if (!genPackage.getGenEnums().isEmpty()) {
+					stringBuffer.append(TEXT_200);
+					for (GenEnum genEnum : genPackage.getGenEnums()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genEnum.getClassifierInstanceName());
+						stringBuffer.append(TEXT_201);
+						stringBuffer.append(genEnum.getClassifierID());
+						stringBuffer.append(TEXT_175);
+					}
+				}
+				if (!genPackage.getGenDataTypes().isEmpty()) {
+					stringBuffer.append(TEXT_202);
+					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genDataType.getClassifierInstanceName());
+						stringBuffer.append(TEXT_203);
+						stringBuffer.append(genDataType.getClassifierID());
+						stringBuffer.append(TEXT_175);
+					}
+				}
+				stringBuffer.append(TEXT_204);
+
+				///////////////////////
+				class Information {
+					@SuppressWarnings("unused")
+					EGenericType eGenericType;
+					int depth;
+					String type;
+					String accessor;
+				}
+
+				class InformationIterator {
+					Iterator<Object> iterator;
+
+					InformationIterator(EGenericType eGenericType) {
+						iterator = EcoreUtil.getAllContents(Collections.singleton(eGenericType));
+					}
+
+					boolean hasNext() {
+						return iterator.hasNext();
+					}
+
+					Information next() {
+						Information information = new Information();
+						EGenericType eGenericType = information.eGenericType = (EGenericType) iterator.next();
+						for (EObject container = eGenericType
+								.eContainer(); container instanceof EGenericType; container = container.eContainer()) {
+							++information.depth;
+						}
+						if (eGenericType.getEClassifier() != null) {
+							GenClassifier genClassifier = genModel.findGenClassifier(eGenericType.getEClassifier());
+							information.type = genPackage.getPackageInstanceVariable(genClassifier.getGenPackage())
+									+ ".get" + genClassifier.getClassifierAccessorName() + "()";
+						} else if (eGenericType.getETypeParameter() != null) {
+							ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
+							if (eTypeParameter.eContainer() instanceof EClass) {
+								information.type = genModel.findGenClassifier((EClass) eTypeParameter.eContainer())
+										.getClassifierInstanceName() + "_" + eGenericType.getETypeParameter().getName();
+							} else {
+								information.type = "t" + (((EOperation) eTypeParameter.eContainer())
+										.getETypeParameters().indexOf(eTypeParameter) + 1);
+							}
+						} else {
+							information.type = "";
+						}
+						if (information.depth > 0) {
+							if (eGenericType.eContainmentFeature().isMany()) {
+								information.accessor = "getE"
+										+ eGenericType.eContainmentFeature().getName().substring(1) + "().add";
+							} else {
+								information.accessor = "setE"
+										+ eGenericType.eContainmentFeature().getName().substring(1);
+							}
+						}
+						return information;
+					}
+				}
+				///////////////////////
+				int maxGenericTypeAssignment = 0;
+
+				stringBuffer.append(TEXT_205);
+				{
+					boolean needsSuppressDeprecation = false;
+					if (!packageNeedsSuppressDeprecation && isJDK50) {
+						LOOP: for (GenEnum genEnum : genPackage.getGenEnums()) {
+							for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+								if (genEnumLiteral.hasAPIDeprecatedTag()) {
+									needsSuppressDeprecation = true;
+									break LOOP;
+								}
+							}
+						}
+						if (needsSuppressDeprecation) {
+							stringBuffer.append(TEXT_193);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_206);
+				if (!genPackage.getPackageInitializationDependencies().isEmpty()) {
+					stringBuffer.append(TEXT_207);
+					for (GenPackage dep : genPackage.getPackageInitializationDependencies()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(dep.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_67);
+						stringBuffer.append(genPackage.getPackageInstanceVariable(dep));
+						stringBuffer.append(TEXT_97);
+						stringBuffer.append(dep.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(dep.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_208);
+					}
+				}
+				if (!genPackage.getSubGenPackages().isEmpty()) {
+					stringBuffer.append(TEXT_209);
+					for (GenPackage sub : genPackage.getSubGenPackages()) {
+						stringBuffer.append(TEXT_210);
+						stringBuffer.append(genPackage.getPackageInstanceVariable(sub));
+						stringBuffer.append(TEXT_175);
+					}
+				}
+				if (!genPackage.getGenClasses().isEmpty()) {
+					boolean firstOperationAssignment = true;
+					int maxTypeParameterAssignment = 0;
+					if (genModel.useGenerics()) {
+						stringBuffer.append(TEXT_211);
+						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
+								if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
+										|| genTypeParameter.isUsed()) {
+									stringBuffer.append(TEXT_91);
+									stringBuffer
+											.append(genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter"));
+									stringBuffer.append(TEXT_67);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_212);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_213);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_215);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_216);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_215);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							}
+						}
+					}
+					if (genModel.useGenerics()) {
+						stringBuffer.append(TEXT_217);
+						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
+								for (EGenericType bound : genTypeParameter.getEcoreTypeParameter().getEBounds()) {
+									for (InformationIterator i = new InformationIterator(bound); i.hasNext();) {
+										Information info = i.next();
+										String prefix = "";
+										if (maxGenericTypeAssignment <= info.depth) {
+											++maxGenericTypeAssignment;
+											prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+													+ " ";
+										}
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(prefix);
+										stringBuffer.append(TEXT_218);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_219);
+										stringBuffer.append(info.type);
+										stringBuffer.append(TEXT_175);
+										if (info.depth > 0) {
+											stringBuffer.append(TEXT_220);
+											stringBuffer.append(info.depth);
+											stringBuffer.append(TEXT_221);
+											stringBuffer.append(info.accessor);
+											stringBuffer.append(TEXT_222);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_175);
+										}
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_212);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_223);
+								}
+							}
+						}
+					}
+					stringBuffer.append(TEXT_224);
+					for (GenClass genClass : genPackage.getGenClasses()) {
+						if (!genClass.hasGenericSuperTypes()) {
+							for (GenClass baseGenClass : genClass.getBaseGenClasses()) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_225);
+								stringBuffer
+										.append(genPackage.getPackageInstanceVariable(baseGenClass.getGenPackage()));
+								stringBuffer.append(TEXT_226);
+								stringBuffer.append(baseGenClass.getClassifierAccessorName());
+								stringBuffer.append(TEXT_227);
+							}
+						} else {
+							for (EGenericType superType : genClass.getEcoreClass().getEGenericSuperTypes()) {
+								for (InformationIterator i = new InformationIterator(superType); i.hasNext();) {
+									Information info = i.next();
+									String prefix = "";
+									if (maxGenericTypeAssignment <= info.depth) {
+										++maxGenericTypeAssignment;
+										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									stringBuffer.append(TEXT_218);
+									stringBuffer.append(info.depth + 1);
+									stringBuffer.append(TEXT_219);
+									stringBuffer.append(info.type);
+									stringBuffer.append(TEXT_175);
+									if (info.depth > 0) {
+										stringBuffer.append(TEXT_220);
+										stringBuffer.append(info.depth);
+										stringBuffer.append(TEXT_221);
+										stringBuffer.append(info.accessor);
+										stringBuffer.append(TEXT_222);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_228);
+							}
+						}
+					}
+					stringBuffer.append(TEXT_229);
+					if (genModel.isOperationReflection()) {
+						stringBuffer.append(TEXT_230);
+					} else {
+						stringBuffer.append(TEXT_231);
+					}
+					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
+						GenClass genClass = c.next();
+						boolean hasInstanceTypeName = genModel.useGenerics()
+								&& genClass.getEcoreClass().getInstanceTypeName() != null
+								&& genClass.getEcoreClass().getInstanceTypeName().contains("<");
+						stringBuffer.append(TEXT_232);
+						stringBuffer.append(genClass.getClassifierInstanceName());
+						stringBuffer.append(TEXT_198);
+						if (genClass.isDynamic()) {
+							stringBuffer.append(TEXT_233);
+						} else {
+							stringBuffer.append(genClass.getRawImportedInterfaceName());
+							stringBuffer.append(TEXT_234);
+						}
+						stringBuffer.append(TEXT_214);
+						stringBuffer.append(genClass.getName());
+						stringBuffer.append(TEXT_235);
+						stringBuffer.append(genClass.getAbstractFlag());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genClass.getInterfaceFlag());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genClass.getGeneratedInstanceClassFlag());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genClass.getEcoreClass().getInstanceTypeName());
+							stringBuffer.append(TEXT_236);
+						}
+						stringBuffer.append(TEXT_175);
+						stringBuffer.append(genModel.getNonNLS());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(genModel.getNonNLS(2));
+						}
+						for (GenFeature genFeature : genClass.getGenFeatures()) {
+							if (genFeature.hasGenericType()) {
+								for (InformationIterator i = new InformationIterator(
+										genFeature.getEcoreFeature().getEGenericType()); i.hasNext();) {
+									Information info = i.next();
+									String prefix = "";
+									if (maxGenericTypeAssignment <= info.depth) {
+										++maxGenericTypeAssignment;
+										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									stringBuffer.append(TEXT_218);
+									stringBuffer.append(info.depth + 1);
+									stringBuffer.append(TEXT_219);
+									stringBuffer.append(info.type);
+									stringBuffer.append(TEXT_175);
+									if (info.depth > 0) {
+										stringBuffer.append(TEXT_220);
+										stringBuffer.append(info.depth);
+										stringBuffer.append(TEXT_221);
+										stringBuffer.append(info.accessor);
+										stringBuffer.append(TEXT_222);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+							}
+							if (genFeature.isReferenceType()) {
+								GenFeature reverseGenFeature = genFeature.getReverse();
+								String reverse = reverseGenFeature == null ? "null"
+										: genPackage.getPackageInstanceVariable(reverseGenFeature.getGenPackage())
+												+ ".get" + reverseGenFeature.getFeatureAccessorName() + "()";
+								stringBuffer.append(TEXT_237);
+								stringBuffer.append(genFeature.getFeatureAccessorName());
+								stringBuffer.append(TEXT_238);
+								if (genFeature.hasGenericType()) {
+									stringBuffer.append(TEXT_239);
+								} else {
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_47);
+								}
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(reverse);
+								stringBuffer.append(TEXT_214);
+								stringBuffer.append(genFeature.getName());
+								stringBuffer.append(TEXT_235);
+								stringBuffer.append(genFeature.getDefaultValue());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getLowerBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUpperBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getContainerClass());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getTransientFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getVolatileFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getChangeableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getContainmentFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getResolveProxiesFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUnsettableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUniqueFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getDerivedFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getOrderedFlag());
+								stringBuffer.append(TEXT_175);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
+								for (GenFeature keyFeature : genFeature.getKeys()) {
+									stringBuffer.append(TEXT_240);
+									stringBuffer.append(genFeature.getFeatureAccessorName());
+									stringBuffer.append(TEXT_241);
+									stringBuffer
+											.append(genPackage.getPackageInstanceVariable(keyFeature.getGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(keyFeature.getFeatureAccessorName());
+									stringBuffer.append(TEXT_227);
+								}
+							} else {
+								stringBuffer.append(TEXT_242);
+								stringBuffer.append(genFeature.getFeatureAccessorName());
+								stringBuffer.append(TEXT_238);
+								if (genFeature.hasGenericType()) {
+									stringBuffer.append(TEXT_239);
+								} else {
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_47);
+								}
+								stringBuffer.append(TEXT_214);
+								stringBuffer.append(genFeature.getName());
+								stringBuffer.append(TEXT_235);
+								stringBuffer.append(genFeature.getDefaultValue());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getLowerBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUpperBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getContainerClass());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getTransientFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getVolatileFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getChangeableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUnsettableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getIDFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUniqueFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getDerivedFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getOrderedFlag());
+								stringBuffer.append(TEXT_175);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
+							}
+						}
+						for (GenOperation genOperation : genClass.getGenOperations()) {
+							String prefix = "";
+							if (genOperation.hasGenericType() || !genOperation.getGenParameters().isEmpty()
+									|| !genOperation.getGenExceptions().isEmpty()
+									|| !genOperation.getGenTypeParameters().isEmpty()) {
+								if (firstOperationAssignment) {
+									firstOperationAssignment = false;
+									prefix = genModel.getImportedName("org.eclipse.emf.ecore.EOperation") + " op = ";
+								} else {
+									prefix = "op = ";
+								}
+							}
+							stringBuffer.append(TEXT_4);
+							if (genModel.useGenerics()) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(prefix);
+								if (genModel.isOperationReflection()) {
+									stringBuffer.append(TEXT_243);
+									stringBuffer.append(genOperation.getOperationAccessorName());
+									stringBuffer.append(TEXT_47);
+								} else {
+									stringBuffer.append(TEXT_244);
+									stringBuffer.append(genClass.getClassifierInstanceName());
+								}
+								stringBuffer.append(TEXT_198);
+								if (genOperation.isVoid() || genOperation.hasGenericType()) {
+									stringBuffer.append(TEXT_233);
+								} else {
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_47);
+								}
+								stringBuffer.append(TEXT_214);
+								stringBuffer.append(genOperation.getName());
+								stringBuffer.append(TEXT_235);
+								stringBuffer.append(genOperation.getLowerBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genOperation.getUpperBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genOperation.getUniqueFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genOperation.getOrderedFlag());
+								stringBuffer.append(TEXT_175);
+								stringBuffer.append(genModel.getNonNLS());
+							} else if (!genOperation.isVoid()) {
+								if (!genOperation.getEcoreOperation().isOrdered()
+										|| !genOperation.getEcoreOperation().isUnique()) {
+									needsAddEOperation = true;
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									if (genModel.isOperationReflection()) {
+										stringBuffer.append(TEXT_243);
+										stringBuffer.append(genOperation.getOperationAccessorName());
+										stringBuffer.append(TEXT_47);
+									} else {
+										stringBuffer.append(TEXT_244);
+										stringBuffer.append(genClass.getClassifierInstanceName());
+									}
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_245);
+									stringBuffer.append(genOperation.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genOperation.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getUpperBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getUniqueFlag());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getOrderedFlag());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									if (genModel.isOperationReflection()) {
+										stringBuffer.append(TEXT_243);
+										stringBuffer.append(genOperation.getOperationAccessorName());
+										stringBuffer.append(TEXT_47);
+									} else {
+										stringBuffer.append(TEXT_244);
+										stringBuffer.append(genClass.getClassifierInstanceName());
+									}
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_245);
+									stringBuffer.append(genOperation.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genOperation.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getUpperBound());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							} else {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(prefix);
+								if (genModel.isOperationReflection()) {
+									stringBuffer.append(TEXT_243);
+									stringBuffer.append(genOperation.getOperationAccessorName());
+									stringBuffer.append(TEXT_47);
+								} else {
+									stringBuffer.append(TEXT_244);
+									stringBuffer.append(genClass.getClassifierInstanceName());
+								}
+								stringBuffer.append(TEXT_246);
+								stringBuffer.append(genOperation.getName());
+								stringBuffer.append(TEXT_215);
+								stringBuffer.append(genModel.getNonNLS());
+							}
+							if (genModel.useGenerics()) {
+								for (ListIterator<GenTypeParameter> t = genOperation.getGenTypeParameters()
+										.listIterator(); t.hasNext();) {
+									GenTypeParameter genTypeParameter = t.next();
+									String typeParameterVariable = "";
+									if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
+											|| genTypeParameter.isUsed()) {
+										if (maxTypeParameterAssignment <= t.previousIndex()) {
+											++maxTypeParameterAssignment;
+											typeParameterVariable = genModel
+													.getImportedName("org.eclipse.emf.ecore.ETypeParameter") + " t"
+													+ t.nextIndex() + " = ";
+										} else {
+											typeParameterVariable = "t" + t.nextIndex() + " = ";
+										}
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(typeParameterVariable);
+									stringBuffer.append(TEXT_247);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_215);
+									stringBuffer.append(genModel.getNonNLS());
+									for (EGenericType typeParameter : genTypeParameter.getEcoreTypeParameter()
+											.getEBounds()) {
+										for (InformationIterator i = new InformationIterator(typeParameter); i
+												.hasNext();) {
+											Information info = i.next();
+											String typePrefix = "";
+											if (maxGenericTypeAssignment <= info.depth) {
+												++maxGenericTypeAssignment;
+												typePrefix = genModel
+														.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
+											}
+											stringBuffer.append(TEXT_91);
+											stringBuffer.append(typePrefix);
+											stringBuffer.append(TEXT_218);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_219);
+											stringBuffer.append(info.type);
+											stringBuffer.append(TEXT_175);
+											if (info.depth > 0) {
+												stringBuffer.append(TEXT_220);
+												stringBuffer.append(info.depth);
+												stringBuffer.append(TEXT_221);
+												stringBuffer.append(info.accessor);
+												stringBuffer.append(TEXT_222);
+												stringBuffer.append(info.depth + 1);
+												stringBuffer.append(TEXT_175);
+											}
+										}
+										stringBuffer.append(TEXT_248);
+										stringBuffer.append(t.nextIndex());
+										stringBuffer.append(TEXT_223);
+									}
+								}
+							}
+							for (GenParameter genParameter : genOperation.getGenParameters()) {
+								if (genParameter.hasGenericType()) {
+									for (InformationIterator i = new InformationIterator(
+											genParameter.getEcoreParameter().getEGenericType()); i.hasNext();) {
+										Information info = i.next();
+										String typePrefix = "";
+										if (maxGenericTypeAssignment <= info.depth) {
+											++maxGenericTypeAssignment;
+											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+													+ " ";
+										}
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(typePrefix);
+										stringBuffer.append(TEXT_218);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_219);
+										stringBuffer.append(info.type);
+										stringBuffer.append(TEXT_175);
+										if (info.depth > 0) {
+											stringBuffer.append(TEXT_220);
+											stringBuffer.append(info.depth);
+											stringBuffer.append(TEXT_221);
+											stringBuffer.append(info.accessor);
+											stringBuffer.append(TEXT_222);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_175);
+										}
+									}
+								}
+								if (genModel.useGenerics()) {
+									stringBuffer.append(TEXT_249);
+									if (genParameter.hasGenericType()) {
+										stringBuffer.append(TEXT_239);
+									} else {
+										stringBuffer.append(genPackage
+												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
+										stringBuffer.append(TEXT_226);
+										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
+										stringBuffer.append(TEXT_47);
+									}
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genParameter.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genParameter.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUpperBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUniqueFlag());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getOrderedFlag());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								} else if (!genParameter.getEcoreParameter().isOrdered()
+										|| !genParameter.getEcoreParameter().isUnique()) {
+									needsAddEParameter = true;
+									stringBuffer.append(TEXT_249);
+									if (genParameter.hasGenericType()) {
+										stringBuffer.append(TEXT_239);
+									} else {
+										stringBuffer.append(genPackage
+												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
+										stringBuffer.append(TEXT_226);
+										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
+										stringBuffer.append(TEXT_47);
+									}
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genParameter.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genParameter.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUpperBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUniqueFlag());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getOrderedFlag());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_249);
+									if (genParameter.hasGenericType()) {
+										stringBuffer.append(TEXT_239);
+									} else {
+										stringBuffer.append(genPackage
+												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
+										stringBuffer.append(TEXT_226);
+										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
+										stringBuffer.append(TEXT_47);
+									}
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genParameter.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genParameter.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUpperBound());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							}
+							if (genOperation.hasGenericExceptions()) {
+								for (EGenericType genericExceptions : genOperation.getEcoreOperation()
+										.getEGenericExceptions()) {
+									for (InformationIterator i = new InformationIterator(genericExceptions); i
+											.hasNext();) {
+										Information info = i.next();
+										String typePrefix = "";
+										if (maxGenericTypeAssignment <= info.depth) {
+											++maxGenericTypeAssignment;
+											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+													+ " ";
+										}
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(typePrefix);
+										stringBuffer.append(TEXT_218);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_219);
+										stringBuffer.append(info.type);
+										stringBuffer.append(TEXT_175);
+										if (info.depth > 0) {
+											stringBuffer.append(TEXT_220);
+											stringBuffer.append(info.depth);
+											stringBuffer.append(TEXT_221);
+											stringBuffer.append(info.accessor);
+											stringBuffer.append(TEXT_222);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_175);
+										}
+										stringBuffer.append(TEXT_250);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+							} else {
+								for (GenClassifier genException : genOperation.getGenExceptions()) {
+									stringBuffer.append(TEXT_251);
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genException.getGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genException.getClassifierAccessorName());
+									stringBuffer.append(TEXT_227);
+								}
+							}
+							if (!genOperation.isVoid() && genOperation.hasGenericType()) {
+								for (InformationIterator i = new InformationIterator(
+										genOperation.getEcoreOperation().getEGenericType()); i.hasNext();) {
+									Information info = i.next();
+									String typePrefix = "";
+									if (maxGenericTypeAssignment <= info.depth) {
+										++maxGenericTypeAssignment;
+										typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+												+ " ";
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(typePrefix);
+									stringBuffer.append(TEXT_218);
+									stringBuffer.append(info.depth + 1);
+									stringBuffer.append(TEXT_219);
+									stringBuffer.append(info.type);
+									stringBuffer.append(TEXT_175);
+									if (info.depth > 0) {
+										stringBuffer.append(TEXT_220);
+										stringBuffer.append(info.depth);
+										stringBuffer.append(TEXT_221);
+										stringBuffer.append(info.accessor);
+										stringBuffer.append(TEXT_222);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+								stringBuffer.append(TEXT_252);
+							}
+						}
+						if (c.hasNext()) {
+							stringBuffer.append(TEXT_4);
+						}
+					}
+				}
+				if (!genPackage.getGenEnums().isEmpty()) {
+					stringBuffer.append(TEXT_253);
+					for (Iterator<GenEnum> e = genPackage.getGenEnums().iterator(); e.hasNext();) {
+						GenEnum genEnum = e.next();
+						stringBuffer.append(TEXT_254);
+						stringBuffer.append(genEnum.getClassifierInstanceName());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genEnum.getImportedName());
+						stringBuffer.append(TEXT_255);
+						stringBuffer.append(genEnum.getName());
+						stringBuffer.append(TEXT_215);
+						stringBuffer.append(genModel.getNonNLS());
+						for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+							stringBuffer.append(TEXT_256);
+							stringBuffer.append(genEnum.getClassifierInstanceName());
+							stringBuffer.append(TEXT_198);
+							stringBuffer.append(genEnum.getImportedName().equals(genEnum.getClassifierID())
+									? genEnum.getQualifiedName()
+									: genEnum.getImportedName());
+							stringBuffer.append(TEXT_221);
+							stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+							stringBuffer.append(TEXT_175);
+						}
+						if (e.hasNext()) {
+							stringBuffer.append(TEXT_4);
+						}
+					}
+				}
+				if (!genPackage.getGenDataTypes().isEmpty()) {
+					stringBuffer.append(TEXT_257);
+					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
+						boolean hasInstanceTypeName = genModel.useGenerics()
+								&& genDataType.getEcoreDataType().getInstanceTypeName() != null
+								&& genDataType.getEcoreDataType().getInstanceTypeName().contains("<");
+						stringBuffer.append(TEXT_258);
+						stringBuffer.append(genDataType.getClassifierInstanceName());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genDataType.getRawImportedInstanceClassName());
+						stringBuffer.append(TEXT_255);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_235);
+						stringBuffer.append(genDataType.getSerializableFlag());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genDataType.getGeneratedInstanceClassFlag());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genDataType.getEcoreDataType().getInstanceTypeName());
+							stringBuffer.append(TEXT_236);
+						}
+						stringBuffer.append(TEXT_175);
+						stringBuffer.append(genModel.getNonNLS());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(genModel.getNonNLS(2));
+						}
+					}
+				}
+				if (genPackage.getSuperGenPackage() == null) {
+					stringBuffer.append(TEXT_259);
+					stringBuffer.append(genPackage.getSchemaLocation());
+					stringBuffer.append(TEXT_175);
+				}
+				if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {
+					stringBuffer.append(TEXT_260);
+					for (String annotationSource : genPackage.getAnnotationSources()) {
+						stringBuffer.append(TEXT_261);
+						stringBuffer.append(annotationSource);
+						stringBuffer.append(TEXT_197);
+						stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
+						stringBuffer.append(TEXT_262);
+					}
+				}
+				stringBuffer.append(TEXT_263);
+				for (String annotationSource : genPackage.getAnnotationSources()) {
+					stringBuffer.append(TEXT_264);
+					stringBuffer.append(annotationSource);
+					stringBuffer.append(TEXT_265);
+					stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
+					stringBuffer.append(TEXT_266);
+					if (annotationSource == null) {
+						stringBuffer.append(TEXT_267);
+					} else {
+						stringBuffer.append(TEXT_236);
+						stringBuffer.append(annotationSource);
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genModel.getNonNLS());
+					}
+					for (EAnnotation eAnnotation : genPackage.getAllAnnotations()) {
+						List<GenPackage.AnnotationReferenceData> annotationReferenceDataList = genPackage
+								.getReferenceData(eAnnotation);
+						if (annotationSource == null ? eAnnotation.getSource() == null
+								: annotationSource.equals(eAnnotation.getSource())) {
+							stringBuffer.append(TEXT_268);
+							stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
+							stringBuffer.append(TEXT_269);
+							for (Iterator<Map.Entry<String, String>> k = eAnnotation.getDetails().iterator(); k
+									.hasNext();) {
+								Map.Entry<String, String> detail = k.next();
+								String key = Literals.toStringLiteral(detail.getKey(), genModel);
+								String value = Literals.toStringLiteral(detail.getValue(), genModel);
+								stringBuffer.append(TEXT_270);
+								stringBuffer.append(key);
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(value);
+								stringBuffer.append(k.hasNext() ? "," : "");
+								stringBuffer.append(genModel.getNonNLS(key + value));
+							}
+							stringBuffer.append(TEXT_271);
+							if (annotationReferenceDataList.isEmpty()) {
+								stringBuffer.append(TEXT_175);
+							} else {
+								stringBuffer.append(TEXT_272);
+							}
+							if (!annotationReferenceDataList.isEmpty()) {
+								stringBuffer.append(TEXT_273);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+								stringBuffer.append(TEXT_274);
+								for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList
+										.iterator(); k.hasNext();) {
+									GenPackage.AnnotationReferenceData annotationReferenceData = k.next();
+									stringBuffer.append(TEXT_275);
+									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+									stringBuffer.append(TEXT_276);
+									if (annotationReferenceData.containingGenPackage != genPackage) {
+										stringBuffer.append(annotationReferenceData.containingGenPackage
+												.getImportedPackageInterfaceName());
+										stringBuffer.append(TEXT_221);
+									}
+									stringBuffer.append(TEXT_277);
+									stringBuffer.append(annotationReferenceData.uriFragment);
+									stringBuffer.append(TEXT_278);
+									if (k.hasNext()) {
+										stringBuffer.append(TEXT_272);
+									}
+									stringBuffer.append(genModel.getNonNLS());
+								}
+								stringBuffer.append(TEXT_279);
+							}
+							for (EAnnotation nestedEAnnotation : genPackage.getAllNestedAnnotations(eAnnotation)) {
+								String nestedAnnotationSource = nestedEAnnotation.getSource();
+								int depth = 0;
+								boolean nonContentAnnotation = false;
+								StringBuilder path = new StringBuilder();
+								for (EObject eContainer = nestedEAnnotation
+										.eContainer(), child = nestedEAnnotation; child != eAnnotation; child = eContainer, eContainer = eContainer
+												.eContainer()) {
+									boolean nonContentChild = child
+											.eContainmentFeature() != EcorePackage.Literals.EANNOTATION__CONTENTS;
+									if (path.length() != 0) {
+										path.insert(0, ", ");
+									}
+									path.insert(0, nonContentChild);
+									if (nonContentChild) {
+										nonContentAnnotation = true;
+									}
+									++depth;
+								}
+								List<GenPackage.AnnotationReferenceData> nestedAnnotationReferenceDataList = genPackage
+										.getReferenceData(nestedEAnnotation);
+								stringBuffer.append(TEXT_268);
+								stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
+								stringBuffer.append(TEXT_280);
+								if (nonContentAnnotation
+										&& genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {
+									stringBuffer.append(TEXT_281);
+									stringBuffer.append(path.toString());
+									stringBuffer.append(TEXT_282);
+								} else {
+									stringBuffer.append(depth);
+								}
+								stringBuffer.append(TEXT_280);
+								if (nestedAnnotationSource == null) {
+									stringBuffer.append(TEXT_283);
+								} else {
+									stringBuffer.append(TEXT_236);
+									stringBuffer.append(nestedAnnotationSource);
+									stringBuffer.append(TEXT_284);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+								stringBuffer.append(TEXT_285);
+								for (Iterator<Map.Entry<String, String>> l = nestedEAnnotation.getDetails()
+										.iterator(); l.hasNext();) {
+									Map.Entry<String, String> detail = l.next();
+									String key = Literals.toStringLiteral(detail.getKey(), genModel);
+									String value = Literals.toStringLiteral(detail.getValue(), genModel);
+									stringBuffer.append(TEXT_270);
+									stringBuffer.append(key);
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(value);
+									stringBuffer.append(l.hasNext() ? "," : "");
+									stringBuffer.append(genModel.getNonNLS(key + value));
+								}
+								stringBuffer.append(TEXT_271);
+								if (nestedAnnotationReferenceDataList.isEmpty()) {
+									stringBuffer.append(TEXT_175);
+								} else {
+									stringBuffer.append(TEXT_272);
+								}
+								if (!nestedAnnotationReferenceDataList.isEmpty()) {
+									stringBuffer.append(TEXT_273);
+									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+									stringBuffer.append(TEXT_274);
+									for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList
+											.iterator(); l.hasNext();) {
+										GenPackage.AnnotationReferenceData annotationReferenceData = l.next();
+										stringBuffer.append(TEXT_275);
+										stringBuffer
+												.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+										stringBuffer.append(TEXT_276);
+										if (annotationReferenceData.containingGenPackage != genPackage) {
+											stringBuffer.append(annotationReferenceData.containingGenPackage
+													.getImportedPackageInterfaceName());
+											stringBuffer.append(TEXT_221);
+										}
+										stringBuffer.append(TEXT_277);
+										stringBuffer.append(annotationReferenceData.uriFragment);
+										stringBuffer.append(TEXT_278);
+										if (l.hasNext()) {
+											stringBuffer.append(TEXT_272);
+										}
+										stringBuffer.append(genModel.getNonNLS());
+									}
+									stringBuffer.append(TEXT_279);
+								}
+							}
+						}
+					}
+					stringBuffer.append(TEXT_263);
+				}
+			} else {
+				if (genPackage.isLoadingInitialization()) {
+					stringBuffer.append(TEXT_286);
+					stringBuffer.append(genModel.getImportedName("java.net.URL"));
+					stringBuffer.append(TEXT_287);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_288);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+					stringBuffer.append(TEXT_289);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+					stringBuffer.append(TEXT_290);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
+					stringBuffer.append(TEXT_291);
+					stringBuffer.append(
+							genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl"));
+					stringBuffer.append(TEXT_292);
+					stringBuffer.append(genModel.getImportedName("java.io.IOException"));
+					stringBuffer.append(TEXT_293);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
+					stringBuffer.append(TEXT_294);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+					stringBuffer.append(TEXT_295);
+				}
+				stringBuffer.append(TEXT_296);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_156);
+				}
+				stringBuffer.append(TEXT_297);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+				stringBuffer.append(TEXT_298);
+				ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>();
+				for (GenClass genClass : genPackage.getGenClasses()) {
+					if (genClass.isDynamic()) {
+						dynamicGenClasses.add(genClass);
+					}
+				}
+				if (dynamicGenClasses.isEmpty()) {
+					stringBuffer.append(TEXT_299);
+					stringBuffer.append(genPackage.getInterfacePackageName());
+					stringBuffer.append(TEXT_300);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_301);
+				} else {
+					stringBuffer.append(TEXT_302);
+					for (GenClass genClass : dynamicGenClasses) {
+						if (genClass.isDynamic()) {
+							stringBuffer.append(TEXT_303);
+							stringBuffer.append(genPackage.getClassifierID(genClass));
+							stringBuffer.append(TEXT_304);
+						}
+					}
+					stringBuffer.append(TEXT_305);
+					stringBuffer.append(genPackage.getInterfacePackageName());
+					stringBuffer.append(TEXT_300);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_306);
+				}
+				stringBuffer.append(TEXT_307);
+			}
+			if (needsAddEOperation) {
+				stringBuffer.append(TEXT_308);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_309);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+				stringBuffer.append(TEXT_310);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+				stringBuffer.append(TEXT_311);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_312);
+			}
+			if (needsAddEParameter) {
+				stringBuffer.append(TEXT_308);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
+				stringBuffer.append(TEXT_313);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_310);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+				stringBuffer.append(TEXT_311);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
+				stringBuffer.append(TEXT_314);
+			}
+		}
+		if (isInterface && genPackage.isLiteralsInterface()) {
+			stringBuffer.append(TEXT_315);
+			if (genModel.isOperationReflection()) {
+				stringBuffer.append(TEXT_316);
+			}
+			stringBuffer.append(TEXT_317);
+			if (isImplementation) {
+				stringBuffer.append(TEXT_318);
+			}
+			stringBuffer.append(TEXT_319);
+			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+				stringBuffer.append(TEXT_320);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					if (!genClass.isInterface()) {
+						stringBuffer.append(TEXT_321);
+						stringBuffer.append(genClass.getQualifiedClassName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_322);
+						stringBuffer.append(genClass.getQualifiedClassName());
+					} else {
+						stringBuffer.append(TEXT_321);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_322);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					}
+				} else if (genClassifier instanceof GenEnum) {
+					GenEnum genEnum = (GenEnum) genClassifier;
+					stringBuffer.append(TEXT_321);
+					stringBuffer.append(genEnum.getQualifiedName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_323);
+					stringBuffer.append(genEnum.getQualifiedName());
+				} else if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					stringBuffer.append(TEXT_324);
+					stringBuffer.append(genDataType.getFormattedName());
+					stringBuffer.append(TEXT_325);
+					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_326);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+					}
+				}
+				stringBuffer.append(TEXT_326);
+				stringBuffer.append(genPackage.getQualifiedPackageClassName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_47);
+				if (genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_327);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_328);
+				if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_329);
+				}
+				stringBuffer.append(TEXT_91);
+				stringBuffer.append(publicStaticFinalFlag);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genPackage.getClassifierID(genClassifier));
+				stringBuffer.append(TEXT_330);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_166);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					for (GenFeature genFeature : genClass.getGenFeatures()) {
+						stringBuffer.append(TEXT_331);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_56);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_332);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_327);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_328);
+						if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_329);
+						}
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(publicStaticFinalFlag);
+						stringBuffer.append(genFeature.getImportedMetaType());
+						stringBuffer.append(TEXT_67);
+						stringBuffer.append(genClass.getFeatureID(genFeature));
+						stringBuffer.append(TEXT_330);
+						stringBuffer.append(genFeature.getFeatureAccessorName());
+						stringBuffer.append(TEXT_166);
+					}
+					if (genModel.isOperationReflection()) {
+						for (GenOperation genOperation : genClass.getGenOperations()) {
+							stringBuffer.append(TEXT_331);
+							stringBuffer.append(genOperation.getFormattedName());
+							stringBuffer.append(TEXT_333);
+							if (genOperation.hasImplicitAPITags()) {
+								stringBuffer.append(TEXT_327);
+								stringBuffer
+										.append(genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+							}
+							stringBuffer.append(TEXT_328);
+							if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {
+								stringBuffer.append(TEXT_329);
+							}
+							stringBuffer.append(TEXT_91);
+							stringBuffer.append(publicStaticFinalFlag);
+							stringBuffer.append(genOperation.getImportedMetaType());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genClass.getOperationID(genOperation, false));
+							stringBuffer.append(TEXT_330);
+							stringBuffer.append(genOperation.getOperationAccessorName());
+							stringBuffer.append(TEXT_166);
+						}
+					}
+				}
+			}
+			stringBuffer.append(TEXT_263);
+		}
+		stringBuffer.append(TEXT_334);
+		stringBuffer.append(isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PackageInterface.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PackageInterface.java
new file mode 100644
index 0000000..b6b0a58
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PackageInterface.java
@@ -0,0 +1,2759 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PackageInterface extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized PackageInterface create(String lineSeparator) {
+		nl = lineSeparator;
+		PackageInterface result = new PackageInterface();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Package</b> for the model." + NL + " * It contains accessors for the meta objects to represent"
+			+ NL + " * <ul>" + NL + " *   <li>each class,</li>" + NL + " *   <li>each feature of each class,</li>";
+	protected final String TEXT_6 = NL + " *   <li>each operation of each class,</li>";
+	protected final String TEXT_7 = NL + " *   <li>each enum,</li>" + NL + " *   <li>and each data type</li>" + NL
+			+ " * </ul>" + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_8 = NL + " * <!-- begin-model-doc -->" + NL + " * ";
+	protected final String TEXT_9 = NL + " * <!-- end-model-doc -->";
+	protected final String TEXT_10 = NL + " * @see ";
+	protected final String TEXT_11 = NL + " * @model ";
+	protected final String TEXT_12 = NL + " *        ";
+	protected final String TEXT_13 = NL + " * @model";
+	protected final String TEXT_14 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_15 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * An implementation of the model <b>Package</b>." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_16 = NL + " * ";
+	protected final String TEXT_17 = NL + "@Deprecated";
+	protected final String TEXT_18 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_19 = NL + "public class ";
+	protected final String TEXT_20 = " extends ";
+	protected final String TEXT_21 = " implements ";
+	protected final String TEXT_22 = NL + "public interface ";
+	protected final String TEXT_23 = NL + "{";
+	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_25 = " copyright = ";
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * The package name." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_27 = " eNAME = \"";
+	protected final String TEXT_28 = "\";";
+	protected final String TEXT_29 = NL + NL + "\t/**" + NL + "\t * The package namespace URI." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_30 = " eNS_URI = \"";
+	protected final String TEXT_31 = NL + NL + "\t/**" + NL + "\t * The package namespace name." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_32 = " eNS_PREFIX = \"";
+	protected final String TEXT_33 = NL + NL + "\t/**" + NL + "\t * The package content type ID." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_34 = " eCONTENT_TYPE = \"";
+	protected final String TEXT_35 = NL + NL + "\t/**" + NL + "\t * The singleton instance of the package." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t";
+	protected final String TEXT_36 = " eINSTANCE = ";
+	protected final String TEXT_37 = ".init();" + NL;
+	protected final String TEXT_38 = NL + "\t/**";
+	protected final String TEXT_39 = NL + "\t * The meta object id for the '{@link ";
+	protected final String TEXT_40 = " <em>";
+	protected final String TEXT_41 = "</em>}' class." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_42 = "</em>}' enum." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_43 = NL + "\t * The meta object id for the '<em>";
+	protected final String TEXT_44 = "</em>' data type." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_45 = NL + "\t * @see ";
+	protected final String TEXT_46 = "#get";
+	protected final String TEXT_47 = "()";
+	protected final String TEXT_48 = NL + "\t * ";
+	protected final String TEXT_49 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_50 = NL + "\t@Deprecated";
+	protected final String TEXT_51 = NL + "\t";
+	protected final String TEXT_52 = "int ";
+	protected final String TEXT_53 = " = ";
+	protected final String TEXT_54 = ";" + NL;
+	protected final String TEXT_55 = NL + "\t/**" + NL + "\t * The feature id for the '<em><b>";
+	protected final String TEXT_56 = "</b></em>' ";
+	protected final String TEXT_57 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_58 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_59 = NL + "\t/**" + NL + "\t * The number of structural features of the '<em>";
+	protected final String TEXT_60 = "</em>' class." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_61 = NL + "\t/**" + NL + "\t * The operation id for the '<em>";
+	protected final String TEXT_62 = "</em>' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_63 = NL + "\t/**" + NL + "\t * The number of operations of the '<em>";
+	protected final String TEXT_64 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected String packageFilename = \"";
+	protected final String TEXT_65 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_66 = NL + "\tprivate ";
+	protected final String TEXT_67 = " ";
+	protected final String TEXT_68 = " = null;" + NL;
+	protected final String TEXT_69 = NL + "\t/**" + NL
+			+ "\t * Creates an instance of the model <b>Package</b>, registered with" + NL
+			+ "\t * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package" + NL
+			+ "\t * package URI value." + NL + "\t * <p>Note: the correct way to create the package is via the static"
+			+ NL + "\t * factory method {@link #init init()}, which also performs" + NL
+			+ "\t * initialization of the package, or returns the registered package," + NL
+			+ "\t * if one already exists." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @see org.eclipse.emf.ecore.EPackage.Registry" + NL + "\t * @see ";
+	protected final String TEXT_70 = "#eNS_URI" + NL + "\t * @see #init()" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate ";
+	protected final String TEXT_71 = "()" + NL + "\t{" + NL + "\t\tsuper(eNS_URI, ";
+	protected final String TEXT_72 = ");" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate static boolean isInited = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends."
+			+ NL + "\t *" + NL + "\t * <p>This method is used to initialize {@link ";
+	protected final String TEXT_73 = "#eINSTANCE} when that field is accessed." + NL
+			+ "\t * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @see #eNS_URI";
+	protected final String TEXT_74 = NL + "\t * @see #createPackageContents()" + NL
+			+ "\t * @see #initializePackageContents()";
+	protected final String TEXT_75 = NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static ";
+	protected final String TEXT_76 = " init()" + NL + "\t{" + NL + "\t\tif (isInited) return (";
+	protected final String TEXT_77 = ")";
+	protected final String TEXT_78 = ".Registry.INSTANCE.getEPackage(";
+	protected final String TEXT_79 = ".eNS_URI);" + NL;
+	protected final String TEXT_80 = NL + "\t\tinitializeRegistryHelpers();" + NL;
+	protected final String TEXT_81 = NL + "\t\t// Obtain or create and register package" + NL + "\t\tObject registered";
+	protected final String TEXT_82 = ".Registry.INSTANCE.get(eNS_URI);" + NL + "\t\t";
+	protected final String TEXT_83 = " the";
+	protected final String TEXT_84 = " = registered";
+	protected final String TEXT_85 = " instanceof ";
+	protected final String TEXT_86 = " ? (";
+	protected final String TEXT_87 = ")registered";
+	protected final String TEXT_88 = " : new ";
+	protected final String TEXT_89 = "();" + NL + "" + NL + "\t\tisInited = true;" + NL;
+	protected final String TEXT_90 = NL + "\t\t// Initialize simple dependencies";
+	protected final String TEXT_91 = NL + "\t\t";
+	protected final String TEXT_92 = ".eINSTANCE.eClass();";
+	protected final String TEXT_93 = NL + "\t\t// Obtain or create and register interdependencies";
+	protected final String TEXT_94 = "Object ";
+	protected final String TEXT_95 = "registeredPackage = ";
+	protected final String TEXT_96 = ".eNS_URI);" + NL + "\t\t";
+	protected final String TEXT_97 = " = (";
+	protected final String TEXT_98 = ")(registeredPackage instanceof ";
+	protected final String TEXT_99 = " ? registeredPackage : ";
+	protected final String TEXT_100 = ".eINSTANCE);";
+	protected final String TEXT_101 = NL + "\t\t// Load packages";
+	protected final String TEXT_102 = NL + "\t\tthe";
+	protected final String TEXT_103 = ".loadPackage();";
+	protected final String TEXT_104 = NL + "\t\t// Create package meta-data objects";
+	protected final String TEXT_105 = ".createPackageContents();";
+	protected final String TEXT_106 = NL + NL + "\t\t// Initialize created meta-data";
+	protected final String TEXT_107 = ".initializePackageContents();";
+	protected final String TEXT_108 = NL + "\t\t// Fix loaded packages";
+	protected final String TEXT_109 = ".fixPackageContents();";
+	protected final String TEXT_110 = NL + "\t\t// Register package validator" + NL + "\t\t";
+	protected final String TEXT_111 = ".Registry.INSTANCE.put" + NL + "\t\t\t(the";
+	protected final String TEXT_112 = "," + NL + "\t\t\t new ";
+	protected final String TEXT_113 = ".Descriptor()" + NL + "\t\t\t {";
+	protected final String TEXT_114 = NL + "\t\t\t\t @Override";
+	protected final String TEXT_115 = NL + "\t\t\t\t public ";
+	protected final String TEXT_116 = " getEValidator()" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return ";
+	protected final String TEXT_117 = ".INSTANCE;" + NL + "\t\t\t\t }" + NL + "\t\t\t });" + NL;
+	protected final String TEXT_118 = NL + "\t\t// Mark meta-data to indicate it can't be changed" + NL + "\t\tthe";
+	protected final String TEXT_119 = ".freeze();" + NL;
+	protected final String TEXT_120 = NL + "\t\t// Update the registry and return the package" + NL + "\t\t";
+	protected final String TEXT_121 = ".Registry.INSTANCE.put(";
+	protected final String TEXT_122 = ".eNS_URI, the";
+	protected final String TEXT_123 = ");" + NL + "\t\treturn the";
+	protected final String TEXT_124 = ";" + NL + "\t}";
+	protected final String TEXT_125 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static void initializeRegistryHelpers()" + NL + "\t{";
+	protected final String TEXT_126 = ".register" + NL + "\t\t\t(";
+	protected final String TEXT_127 = ".class," + NL + "\t\t\t new ";
+	protected final String TEXT_128 = ".Helper()" + NL + "\t\t\t {" + NL
+			+ "\t\t\t\t public boolean isInstance(Object instance)" + NL + "\t\t\t\t {" + NL
+			+ "\t\t\t\t\t return instance instanceof ";
+	protected final String TEXT_129 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
+			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return new ";
+	protected final String TEXT_130 = "[size];" + NL + "\t\t\t\t }" + NL + "\t\t\t });";
+	protected final String TEXT_131 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
+			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {";
+	protected final String TEXT_132 = NL + "\t\t\t\t\t return new ";
+	protected final String TEXT_133 = "[size]";
+	protected final String TEXT_134 = "[size];";
+	protected final String TEXT_135 = NL + "\t\t\t\t }" + NL + "\t\t});";
+	protected final String TEXT_136 = NL + "\t}" + NL + "" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static class WhiteList implements ";
+	protected final String TEXT_137 = ", EBasicWhiteList" + NL + "\t{";
+	protected final String TEXT_138 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
+	protected final String TEXT_139 = NL + "\t}";
+	protected final String TEXT_140 = NL + "\t * Returns the meta object for class '{@link ";
+	protected final String TEXT_141 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for class '<em>";
+	protected final String TEXT_142 = "</em>'." + NL + "\t * @see ";
+	protected final String TEXT_143 = NL + "\t * @model ";
+	protected final String TEXT_144 = NL + "\t *        ";
+	protected final String TEXT_145 = NL + "\t * @model";
+	protected final String TEXT_146 = NL + "\t * Returns the meta object for enum '{@link ";
+	protected final String TEXT_147 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for enum '<em>";
+	protected final String TEXT_148 = NL + "\t * Returns the meta object for data type '<em>";
+	protected final String TEXT_149 = "</em>'.";
+	protected final String TEXT_150 = NL + "\t * Returns the meta object for data type '{@link ";
+	protected final String TEXT_151 = "</em>}'.";
+	protected final String TEXT_152 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_153 = NL + "     * <!-- begin-model-doc -->" + NL + "     * ";
+	protected final String TEXT_154 = NL + "     * <!-- end-model-doc -->";
+	protected final String TEXT_155 = NL + "\t * @return the meta object for data type '<em>";
+	protected final String TEXT_156 = NL + "\t@Override";
+	protected final String TEXT_157 = NL + "\tpublic ";
+	protected final String TEXT_158 = " get";
+	protected final String TEXT_159 = "()" + NL + "\t{";
+	protected final String TEXT_160 = NL + "\t\tif (";
+	protected final String TEXT_161 = " == null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_162 = ".eNS_URI).getEClassifiers().get(";
+	protected final String TEXT_163 = ");" + NL + "\t\t}";
+	protected final String TEXT_164 = NL + "\t\treturn ";
+	protected final String TEXT_165 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_166 = "();" + NL;
+	protected final String TEXT_167 = NL + "\t/**" + NL + "\t * Returns the meta object for the ";
+	protected final String TEXT_168 = " '{@link ";
+	protected final String TEXT_169 = "#";
+	protected final String TEXT_170 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the ";
+	protected final String TEXT_171 = " '<em>";
+	protected final String TEXT_172 = NL + "\t * @see #get";
+	protected final String TEXT_173 = NL + "\t\treturn (";
+	protected final String TEXT_174 = ".getEStructuralFeatures().get(";
+	protected final String TEXT_175 = ");";
+	protected final String TEXT_176 = NL + "        return (";
+	protected final String TEXT_177 = ")get";
+	protected final String TEXT_178 = "().getEStructuralFeatures().get(";
+	protected final String TEXT_179 = "();";
+	protected final String TEXT_180 = NL + "\t/**" + NL + "\t * Returns the meta object for the '{@link ";
+	protected final String TEXT_181 = "(";
+	protected final String TEXT_182 = ") <em>";
+	protected final String TEXT_183 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the '<em>";
+	protected final String TEXT_184 = "</em>' operation." + NL + "\t * @see ";
+	protected final String TEXT_185 = ".getEOperations().get(";
+	protected final String TEXT_186 = NL + "        return get";
+	protected final String TEXT_187 = "().getEOperations().get(";
+	protected final String TEXT_188 = NL + "\t/**" + NL
+			+ "\t * Returns the factory that creates the instances of the model." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the factory that creates the instances of the model." + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_189 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_190 = "()" + NL + "\t{" + NL + "\t\treturn (";
+	protected final String TEXT_191 = ")getEFactoryInstance();" + NL + "\t}";
+	protected final String TEXT_192 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isCreated = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates the meta-model objects for the package.  This method is" + NL
+			+ "\t * guarded to have no affect on any invocation but its first." + NL + "\t * <!-- begin-user-doc -->"
+			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_193 = NL + "\t@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_194 = NL + "\tpublic void createPackageContents()" + NL + "\t{" + NL
+			+ "\t\tif (isCreated) return;" + NL + "\t\tisCreated = true;";
+	protected final String TEXT_195 = NL + NL + "\t\t// Create classes and their features";
+	protected final String TEXT_196 = " = create";
+	protected final String TEXT_197 = NL + "\t\tcreate";
+	protected final String TEXT_198 = ", ";
+	protected final String TEXT_199 = NL + "\t\tcreateEOperation(";
+	protected final String TEXT_200 = NL + NL + "\t\t// Create enums";
+	protected final String TEXT_201 = " = createEEnum(";
+	protected final String TEXT_202 = NL + NL + "\t\t// Create data types";
+	protected final String TEXT_203 = " = createEDataType(";
+	protected final String TEXT_204 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isInitialized = false;" + NL;
+	protected final String TEXT_205 = NL + "\t/**" + NL
+			+ "\t * Complete the initialization of the package and its meta-model.  This" + NL
+			+ "\t * method is guarded to have no affect on any invocation but its first." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_206 = NL + "\tpublic void initializePackageContents()" + NL + "\t{" + NL
+			+ "\t\tif (isInitialized) return;" + NL + "\t\tisInitialized = true;" + NL + "" + NL
+			+ "\t\t// Initialize package" + NL + "\t\tsetName(eNAME);" + NL + "\t\tsetNsPrefix(eNS_PREFIX);" + NL
+			+ "\t\tsetNsURI(eNS_URI);";
+	protected final String TEXT_207 = NL + NL + "\t\t// Obtain other dependent packages";
+	protected final String TEXT_208 = ".eNS_URI);";
+	protected final String TEXT_209 = NL + NL + "\t\t// Add subpackages";
+	protected final String TEXT_210 = NL + "\t\tgetESubpackages().add(";
+	protected final String TEXT_211 = NL + NL + "\t\t// Create type parameters";
+	protected final String TEXT_212 = "_";
+	protected final String TEXT_213 = " = addETypeParameter(";
+	protected final String TEXT_214 = ", \"";
+	protected final String TEXT_215 = "\");";
+	protected final String TEXT_216 = NL + "\t\taddETypeParameter(";
+	protected final String TEXT_217 = NL + NL + "\t\t// Set bounds for type parameters";
+	protected final String TEXT_218 = "g";
+	protected final String TEXT_219 = " = createEGenericType(";
+	protected final String TEXT_220 = NL + "\t\tg";
+	protected final String TEXT_221 = ".";
+	protected final String TEXT_222 = "(g";
+	protected final String TEXT_223 = ".getEBounds().add(g1);";
+	protected final String TEXT_224 = NL + NL + "\t\t// Add supertypes to classes";
+	protected final String TEXT_225 = ".getESuperTypes().add(";
+	protected final String TEXT_226 = ".get";
+	protected final String TEXT_227 = "());";
+	protected final String TEXT_228 = ".getEGenericSuperTypes().add(g1);";
+	protected final String TEXT_229 = NL + NL + "\t\t// Initialize classes";
+	protected final String TEXT_230 = ", features, and operations; add parameters";
+	protected final String TEXT_231 = " and features; add operations and parameters";
+	protected final String TEXT_232 = NL + "\t\tinitEClass(";
+	protected final String TEXT_233 = "null";
+	protected final String TEXT_234 = ".class";
+	protected final String TEXT_235 = "\", ";
+	protected final String TEXT_236 = "\"";
+	protected final String TEXT_237 = NL + "\t\tinitEReference(get";
+	protected final String TEXT_238 = "(), ";
+	protected final String TEXT_239 = "g1";
+	protected final String TEXT_240 = NL + "\t\tget";
+	protected final String TEXT_241 = "().getEKeys().add(";
+	protected final String TEXT_242 = NL + "\t\tinitEAttribute(get";
+	protected final String TEXT_243 = "initEOperation(get";
+	protected final String TEXT_244 = "addEOperation(";
+	protected final String TEXT_245 = "(), \"";
+	protected final String TEXT_246 = ", null, \"";
+	protected final String TEXT_247 = "addETypeParameter(op, \"";
+	protected final String TEXT_248 = NL + "\t\tt";
+	protected final String TEXT_249 = NL + "\t\taddEParameter(op, ";
+	protected final String TEXT_250 = NL + "\t\taddEException(op, g";
+	protected final String TEXT_251 = NL + "\t\taddEException(op, ";
+	protected final String TEXT_252 = NL + "\t\tinitEOperation(op, g1);";
+	protected final String TEXT_253 = NL + NL + "\t\t// Initialize enums and add enum literals";
+	protected final String TEXT_254 = NL + "\t\tinitEEnum(";
+	protected final String TEXT_255 = ".class, \"";
+	protected final String TEXT_256 = NL + "\t\taddEEnumLiteral(";
+	protected final String TEXT_257 = NL + NL + "\t\t// Initialize data types";
+	protected final String TEXT_258 = NL + "\t\tinitEDataType(";
+	protected final String TEXT_259 = NL + NL + "\t\t// Create resource" + NL + "\t\tcreateResource(";
+	protected final String TEXT_260 = NL + NL + "\t\t// Create annotations";
+	protected final String TEXT_261 = NL + "\t\t// ";
+	protected final String TEXT_262 = "Annotations();";
+	protected final String TEXT_263 = NL + "\t}" + NL;
+	protected final String TEXT_264 = NL + "\t/**" + NL + "\t * Initializes the annotations for <b>";
+	protected final String TEXT_265 = "</b>." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
+			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void create";
+	protected final String TEXT_266 = "Annotations()" + NL + "\t{" + NL + "\t\tString source = ";
+	protected final String TEXT_267 = "null;";
+	protected final String TEXT_268 = NL + "\t\taddAnnotation" + NL + "\t\t  (";
+	protected final String TEXT_269 = "," + NL + "\t\t   source," + NL + "\t\t   new String[]" + NL + "\t\t   {";
+	protected final String TEXT_270 = NL + "\t\t\t   ";
+	protected final String TEXT_271 = NL + "\t\t   }";
+	protected final String TEXT_272 = ",";
+	protected final String TEXT_273 = NL + "\t\t   new ";
+	protected final String TEXT_274 = "[]" + NL + "\t\t   {";
+	protected final String TEXT_275 = NL + "\t\t\t ";
+	protected final String TEXT_276 = ".createURI(";
+	protected final String TEXT_277 = "eNS_URI).appendFragment(\"";
+	protected final String TEXT_278 = "\")";
+	protected final String TEXT_279 = NL + "\t\t   });";
+	protected final String TEXT_280 = "," + NL + "\t\t   ";
+	protected final String TEXT_281 = "new boolean[] { ";
+	protected final String TEXT_282 = " }";
+	protected final String TEXT_283 = "null,";
+	protected final String TEXT_284 = "\",";
+	protected final String TEXT_285 = NL + "\t\t   new String[]" + NL + "\t\t   {";
+	protected final String TEXT_286 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isLoaded = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Laods the package and any sub-packages from their serialized form." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic void loadPackage()" + NL + "\t{" + NL + "\t\tif (isLoaded) return;" + NL
+			+ "\t\tisLoaded = true;" + NL + "" + NL + "\t\t";
+	protected final String TEXT_287 = " url = getClass().getResource(packageFilename);" + NL + "\t\tif (url == null)"
+			+ NL + "\t\t{" + NL
+			+ "\t\t\tthrow new RuntimeException(\"Missing serialized package: \" + packageFilename);";
+	protected final String TEXT_288 = NL + "\t\t}" + NL + "\t\t";
+	protected final String TEXT_289 = " uri = ";
+	protected final String TEXT_290 = ".createURI(url.toString());" + NL + "\t\t";
+	protected final String TEXT_291 = " resource = new ";
+	protected final String TEXT_292 = "().createResource(uri);" + NL + "\t\ttry" + NL + "\t\t{" + NL
+			+ "\t\t\tresource.load(null);" + NL + "\t\t}" + NL + "\t\tcatch (";
+	protected final String TEXT_293 = " exception)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
+	protected final String TEXT_294 = "(exception);" + NL + "\t\t}" + NL + "\t\tinitializeFromLoadedEPackage(this, (";
+	protected final String TEXT_295 = ")resource.getContents().get(0));" + NL + "\t\tcreateResource(eNS_URI);" + NL
+			+ "\t}" + NL;
+	protected final String TEXT_296 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprivate boolean isFixed = false;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Fixes up the loaded package, to make it appear as if it had been programmatically built." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic void fixPackageContents()" + NL + "\t{" + NL + "\t\tif (isFixed) return;" + NL
+			+ "\t\tisFixed = true;" + NL + "\t\tfixEClassifiers();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Sets the instance class on the given classifier." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_297 = NL + "\tprotected void fixInstanceClass(";
+	protected final String TEXT_298 = " eClassifier)" + NL + "\t{" + NL
+			+ "\t\tif (eClassifier.getInstanceClassName() == null)" + NL + "\t\t{";
+	protected final String TEXT_299 = NL + "\t\t\teClassifier.setInstanceClassName(\"";
+	protected final String TEXT_300 = ".\" + eClassifier.getName());";
+	protected final String TEXT_301 = NL + "\t\t\tsetGeneratedClassName(eClassifier);";
+	protected final String TEXT_302 = NL + "\t\t\tswitch (eClassifier.getClassifierID())" + NL + "\t\t\t{";
+	protected final String TEXT_303 = NL + "\t\t\t\tcase ";
+	protected final String TEXT_304 = ":";
+	protected final String TEXT_305 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tbreak;" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tdefault:" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\teClassifier.setInstanceClassName(\"";
+	protected final String TEXT_306 = NL + "\t\t\t\t\tsetGeneratedClassName(eClassifier);" + NL + "\t\t\t\t\tbreak;"
+			+ NL + "\t\t\t\t}" + NL + "\t\t\t}";
+	protected final String TEXT_307 = NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_308 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_309 = " addEOperation(";
+	protected final String TEXT_310 = " owner, ";
+	protected final String TEXT_311 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)"
+			+ NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_312 = " o = addEOperation(owner, type, name, lowerBound, upperBound);" + NL
+			+ "\t\to.setUnique(isUnique);" + NL + "\t\to.setOrdered(isOrdered);" + NL + "\t\treturn o;" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_313 = " addEParameter(";
+	protected final String TEXT_314 = " p = ecoreFactory.createEParameter();" + NL + "\t\tp.setEType(type);" + NL
+			+ "\t\tp.setName(name);" + NL + "\t\tp.setLowerBound(lowerBound);" + NL + "\t\tp.setUpperBound(upperBound);"
+			+ NL + "\t\tp.setUnique(isUnique);" + NL + "\t\tp.setOrdered(isOrdered);" + NL
+			+ "\t\towner.getEParameters().add(p);" + NL + "\t\treturn p;" + NL + "\t}" + NL;
+	protected final String TEXT_315 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * Defines literals for the meta objects that represent" + NL + "\t * <ul>" + NL
+			+ "\t *   <li>each class,</li>" + NL + "\t *   <li>each feature of each class,</li>";
+	protected final String TEXT_316 = NL + "\t *   <li>each operation of each class,</li>";
+	protected final String TEXT_317 = NL + "\t *   <li>each enum,</li>" + NL + "\t *   <li>and each data type</li>" + NL
+			+ "\t * </ul>" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
+	protected final String TEXT_318 = "public ";
+	protected final String TEXT_319 = "interface Literals" + NL + "\t{";
+	protected final String TEXT_320 = NL + "\t\t/**";
+	protected final String TEXT_321 = NL + "\t\t * The meta object literal for the '{@link ";
+	protected final String TEXT_322 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+	protected final String TEXT_323 = "</em>}' enum." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+	protected final String TEXT_324 = NL + "\t\t * The meta object literal for the '<em>";
+	protected final String TEXT_325 = "</em>' data type." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_326 = NL + "\t\t * @see ";
+	protected final String TEXT_327 = NL + "\t\t * ";
+	protected final String TEXT_328 = NL + "\t\t * @generated" + NL + "\t\t */";
+	protected final String TEXT_329 = NL + "\t\t@Deprecated";
+	protected final String TEXT_330 = " = eINSTANCE.get";
+	protected final String TEXT_331 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
+	protected final String TEXT_332 = " feature." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_333 = "</b></em>' operation." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_334 = NL + "} //";
+	protected final String TEXT_335 = NL;
+
+	public PackageInterface() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_335);
+		stringBuffer.append(TEXT_335);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getReflectionPackageName();
+		className = genPackage.getPackageInterfaceName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = ((Object[]) new Object[] { new Object[] { genPackage, Boolean.TRUE, Boolean.FALSE } })[0];
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2010 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		final GenPackage genPackage = (GenPackage) ((Object[]) argument)[0];
+		final GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
+		boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
+		boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation()
+				&& !(isInterface && isImplementation);
+		boolean packageNeedsSuppressDeprecation = isJDK50
+				&& GenModelUtil.hasAPIDeprecatedTag(genPackage.getOrderedGenClassifiers())
+				&& !genPackage.hasAPIDeprecatedTag() && !genModel.isSuppressEMFMetaData();
+		String publicStaticFinalFlag = isImplementation ? "public static final " : "";
+		boolean needsAddEOperation = false;
+		boolean needsAddEParameter = false;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (isImplementation && !genModel.isSuppressInterfaces()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getClassPackageName());
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genPackage.getReflectionPackageName());
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		genModel.markImportLocation(stringBuffer, genPackage);
+		if (isImplementation) {
+			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Registry");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Descriptor");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.EPackageImpl.EBasicWhiteList");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");
+			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");
+			if (genPackage.isLiteralsInterface()) {
+				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + ".Literals");
+			}
+			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers())
+				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + "."
+						+ genPackage.getClassifierID(genClassifier));
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_5);
+			if (genModel.isOperationReflection()) {
+				stringBuffer.append(TEXT_6);
+			}
+			stringBuffer.append(TEXT_7);
+			if (genPackage.hasDocumentation()) {
+				stringBuffer.append(TEXT_8);
+				stringBuffer.append(genPackage.getDocumentation(genModel.getIndentation(stringBuffer)));
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genPackage.getQualifiedFactoryInterfaceName());
+			if (!genModel.isSuppressEMFModelTags()) {
+				boolean first = true;
+				for (StringTokenizer stringTokenizer = new StringTokenizer(genPackage.getModelInfo(),
+						"\n\r"); stringTokenizer.hasMoreTokens();) {
+					String modelInfo = stringTokenizer.nextToken();
+					if (first) {
+						first = false;
+						stringBuffer.append(TEXT_11);
+						stringBuffer.append(modelInfo);
+					} else {
+						stringBuffer.append(TEXT_12);
+						stringBuffer.append(modelInfo);
+					}
+				}
+				if (first) {
+					stringBuffer.append(TEXT_13);
+				}
+			}
+			stringBuffer.append(TEXT_14);
+		} else {
+			stringBuffer.append(TEXT_15);
+			if (genPackage.hasAPITags()) {
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_14);
+		}
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_17);
+		}
+		if (isImplementation) {
+			if (packageNeedsSuppressDeprecation) {
+				stringBuffer.append(TEXT_18);
+			}
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageImpl"));
+			if (!isInterface) {
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			}
+		} else {
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+		}
+		stringBuffer.append(TEXT_23);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_4);
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genPackage.getPackageName());
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genPackage.getNSURI());
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genPackage.getNSName());
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getNonNLS());
+			if (genPackage.isContentType()) {
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(publicStaticFinalFlag);
+				stringBuffer.append(genModel.getImportedName("java.lang.String"));
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genPackage.getContentTypeIdentifier());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genModel.getNonNLS());
+			}
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(publicStaticFinalFlag);
+			stringBuffer.append(genPackage.getPackageInterfaceName());
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genPackage.getQualifiedPackageClassName());
+			stringBuffer.append(TEXT_37);
+			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) {
+				stringBuffer.append(TEXT_38);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					if (!genClass.isInterface()) {
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genClass.getQualifiedClassName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genClass.getQualifiedClassName());
+					} else {
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					}
+				} else if (genClassifier instanceof GenEnum) {
+					GenEnum genEnum = (GenEnum) genClassifier;
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genEnum.getQualifiedName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(genEnum.getQualifiedName());
+				} else if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genDataType.getFormattedName());
+					stringBuffer.append(TEXT_44);
+					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+					}
+				}
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genPackage.getQualifiedPackageClassName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_47);
+				if (genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_49);
+				if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(publicStaticFinalFlag);
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genPackage.getClassifierID(genClassifier));
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genPackage.getClassifierValue(genClassifier));
+				stringBuffer.append(TEXT_54);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					for (GenFeature genFeature : genClass.getAllGenFeatures()) {
+						stringBuffer.append(TEXT_55);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_56);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_57);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_58);
+						if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_50);
+						}
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(publicStaticFinalFlag);
+						stringBuffer.append(TEXT_52);
+						stringBuffer.append(genClass.getFeatureID(genFeature));
+						stringBuffer.append(TEXT_53);
+						stringBuffer.append(genClass.getFeatureValue(genFeature));
+						stringBuffer.append(TEXT_54);
+					}
+					stringBuffer.append(TEXT_59);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_60);
+					if (genClass.hasAPITags()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_58);
+					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(publicStaticFinalFlag);
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genClass.getFeatureCountID());
+					stringBuffer.append(TEXT_53);
+					stringBuffer.append(genClass.getFeatureCountValue());
+					stringBuffer.append(TEXT_54);
+					if (genModel.isOperationReflection()) {
+						for (GenOperation genOperation : genClass.getAllGenOperations(false)) {
+							if (genClass.getOverrideGenOperation(genOperation) == null) {
+								stringBuffer.append(TEXT_61);
+								stringBuffer.append(genOperation.getFormattedName());
+								stringBuffer.append(TEXT_62);
+								if (genOperation.hasImplicitAPITags()) {
+									stringBuffer.append(TEXT_48);
+									stringBuffer.append(
+											genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+								}
+								stringBuffer.append(TEXT_58);
+								if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {
+									stringBuffer.append(TEXT_50);
+								}
+								stringBuffer.append(TEXT_51);
+								stringBuffer.append(publicStaticFinalFlag);
+								stringBuffer.append(TEXT_52);
+								stringBuffer.append(genClass.getOperationID(genOperation, false));
+								stringBuffer.append(TEXT_53);
+								stringBuffer.append(genClass.getOperationValue(genOperation));
+								stringBuffer.append(TEXT_54);
+							}
+						}
+						stringBuffer.append(TEXT_63);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_60);
+						if (genClass.hasAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_58);
+						if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_50);
+						}
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(publicStaticFinalFlag);
+						stringBuffer.append(TEXT_52);
+						stringBuffer.append(genClass.getOperationCountID());
+						stringBuffer.append(TEXT_53);
+						stringBuffer.append(genClass.getOperationCountValue());
+						stringBuffer.append(TEXT_54);
+					}
+				}
+			}
+		}
+		if (isImplementation) {
+			if (genPackage.isLoadingInitialization()) {
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genPackage.getSerializedPackageFilename());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_4);
+			}
+			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+				stringBuffer.append(TEXT_65);
+				if (genClassifier.hasAPITags(true)) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer), true));
+				}
+				stringBuffer.append(TEXT_49);
+				if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_66);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genClassifier.getClassifierInstanceName());
+				stringBuffer.append(TEXT_68);
+			}
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			stringBuffer.append(TEXT_70);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_71);
+			stringBuffer.append(genPackage.getQualifiedEFactoryInstanceAccessor());
+			stringBuffer.append(TEXT_72);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_73);
+			if (!genPackage.isLoadedInitialization()) {
+				stringBuffer.append(TEXT_74);
+			}
+			stringBuffer.append(TEXT_75);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_76);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_77);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_78);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_79);
+			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+				stringBuffer.append(TEXT_80);
+			}
+			stringBuffer.append(TEXT_81);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_53);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_82);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_83);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_84);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_85);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_86);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_87);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_88);
+			stringBuffer.append(genPackage.getPackageClassName());
+			stringBuffer.append(TEXT_89);
+			if (!genPackage.getPackageSimpleDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_90);
+				for (GenPackage dep : genPackage.getPackageSimpleDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(dep.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_92);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (!genPackage.getPackageInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_93);
+				for (ListIterator<GenPackage> i = genPackage.getPackageInterDependencies().listIterator(); i
+						.hasNext();) {
+					GenPackage interdep = i.next();
+					stringBuffer.append(TEXT_91);
+					if (i.previousIndex() == 0) {
+						stringBuffer.append(TEXT_94);
+					}
+					stringBuffer.append(TEXT_95);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+					stringBuffer.append(TEXT_78);
+					stringBuffer.append(interdep.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_96);
+					stringBuffer.append(interdep.getImportedPackageClassName());
+					stringBuffer.append(TEXT_67);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_97);
+					stringBuffer.append(interdep.getImportedPackageClassName());
+					stringBuffer.append(TEXT_98);
+					stringBuffer.append(interdep.getImportedPackageClassName());
+					stringBuffer.append(TEXT_99);
+					stringBuffer.append(interdep.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_100);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_101);
+				if (genPackage.isLoadingInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_103);
+				}
+				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
+					if (interdep.isLoadingInitialization()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+						stringBuffer.append(TEXT_103);
+					}
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (!genPackage.isLoadedInitialization() || !genPackage.getPackageBuildInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_104);
+				if (!genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_105);
+				}
+				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_105);
+				}
+				stringBuffer.append(TEXT_106);
+				if (!genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_107);
+				}
+				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_107);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
+				stringBuffer.append(TEXT_108);
+				if (genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_102);
+					stringBuffer.append(genPackage.getBasicPackageName());
+					stringBuffer.append(TEXT_109);
+				}
+				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
+					stringBuffer.append(TEXT_91);
+					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
+					stringBuffer.append(TEXT_109);
+				}
+				stringBuffer.append(TEXT_4);
+			}
+			if (genPackage.hasConstraints()) {
+				stringBuffer.append(TEXT_110);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
+				stringBuffer.append(TEXT_111);
+				stringBuffer.append(genPackage.getBasicPackageName());
+				stringBuffer.append(TEXT_112);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
+				stringBuffer.append(TEXT_113);
+				if (genModel.useInterfaceOverrideAnnotation()) {
+					stringBuffer.append(TEXT_114);
+				}
+				stringBuffer.append(TEXT_115);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
+				stringBuffer.append(TEXT_116);
+				stringBuffer.append(genPackage.getImportedValidatorClassName());
+				stringBuffer.append(TEXT_117);
+			}
+			if (!genPackage.isEcorePackage()) {
+				stringBuffer.append(TEXT_118);
+				stringBuffer.append(genPackage.getBasicPackageName());
+				stringBuffer.append(TEXT_119);
+			}
+			stringBuffer.append(TEXT_120);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_121);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_122);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_123);
+			stringBuffer.append(genPackage.getBasicPackageName());
+			stringBuffer.append(TEXT_124);
+			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+				stringBuffer.append(TEXT_125);
+				Set<String> helpers = new HashSet<String>();
+				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+					if (genClassifier instanceof GenClass) {
+						GenClass genClass = (GenClass) genClassifier;
+						if (!genClass.isDynamic()) {
+							String theClass = genClass.isMapEntry() ? genClass.getImportedClassName()
+									: genClass.getRawImportedInterfaceName();
+							if (helpers.add(theClass)) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_127);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_128);
+								stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
+										: genClass.getRawImportedInterfaceName()
+												+ genClass.getInterfaceWildTypeArguments());
+								stringBuffer.append(TEXT_129);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_130);
+							}
+						}
+					} else if (genClassifier instanceof GenDataType) {
+						GenDataType genDataType = (GenDataType) genClassifier;
+						if (!genDataType.isPrimitiveType() && !genDataType.isObjectType()) {
+							String theClass = genDataType.getRawImportedInstanceClassName();
+							if (helpers.add(theClass)) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_127);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
+								stringBuffer.append(TEXT_128);
+								stringBuffer.append(theClass);
+								stringBuffer.append(TEXT_131);
+								if (genDataType.isArrayType()) {
+									String componentType = theClass;
+									String indices = "";
+									while (componentType.endsWith("[]")) {
+										componentType = componentType.substring(0, componentType.length() - 2);
+										indices += "[]";
+									}
+									stringBuffer.append(TEXT_132);
+									stringBuffer.append(componentType);
+									stringBuffer.append(TEXT_133);
+									stringBuffer.append(indices);
+									stringBuffer.append(TEXT_3);
+								} else {
+									stringBuffer.append(TEXT_132);
+									stringBuffer.append(theClass);
+									stringBuffer.append(TEXT_134);
+								}
+								stringBuffer.append(TEXT_135);
+							}
+						}
+					}
+				}
+				stringBuffer.append(TEXT_136);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.IsSerializable"));
+				stringBuffer.append(TEXT_137);
+				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+					if (genClassifier instanceof GenClass) {
+						GenClass genClass = (GenClass) genClassifier;
+						if (!genClass.isDynamic()) {
+							stringBuffer.append(TEXT_138);
+							stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
+									: genClass.getImportedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genClass.getSafeUncapName());
+							stringBuffer.append(TEXT_54);
+						}
+					} else if (genClassifier instanceof GenDataType) {
+						GenDataType genDataType = (GenDataType) genClassifier;
+						if (!genDataType.isObjectType() && genDataType.isSerializable()) {
+							stringBuffer.append(TEXT_138);
+							stringBuffer.append(genDataType.getImportedWildcardInstanceClassName());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_54);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_139);
+			}
+			stringBuffer.append(TEXT_4);
+		}
+		if (isInterface) { // TODO REMOVE THIS BOGUS EMPTY LINE
+			stringBuffer.append(TEXT_4);
+		}
+		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+			if (isInterface) {
+				stringBuffer.append(TEXT_38);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					stringBuffer.append(TEXT_140);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_141);
+					stringBuffer.append(genClass.getFormattedName());
+					stringBuffer.append(TEXT_142);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					if (!genModel.isSuppressEMFModelTags()
+							&& (genClass.isExternalInterface() || genClass.isDynamic())) {
+						boolean first = true;
+						for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(),
+								"\n\r"); stringTokenizer.hasMoreTokens();) {
+							String modelInfo = stringTokenizer.nextToken();
+							if (first) {
+								first = false;
+								stringBuffer.append(TEXT_143);
+								stringBuffer.append(modelInfo);
+							} else {
+								stringBuffer.append(TEXT_144);
+								stringBuffer.append(modelInfo);
+							}
+						}
+						if (first) {
+							stringBuffer.append(TEXT_145);
+						}
+					}
+				} else if (genClassifier instanceof GenEnum) {
+					GenEnum genEnum = (GenEnum) genClassifier;
+					stringBuffer.append(TEXT_146);
+					stringBuffer.append(genEnum.getQualifiedName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_147);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_142);
+					stringBuffer.append(genEnum.getQualifiedName());
+				} else if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					if (genDataType.isPrimitiveType() || genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_149);
+					} else {
+						stringBuffer.append(TEXT_150);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genDataType.getFormattedName());
+						stringBuffer.append(TEXT_151);
+					}
+					stringBuffer.append(TEXT_152);
+					if (genDataType.hasDocumentation()) {
+						stringBuffer.append(TEXT_153);
+						stringBuffer.append(genDataType.getDocumentation(genModel.getIndentation(stringBuffer)));
+						stringBuffer.append(TEXT_154);
+					}
+					stringBuffer.append(TEXT_155);
+					stringBuffer.append(genDataType.getFormattedName());
+					stringBuffer.append(TEXT_149);
+					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+					}
+					if (!genModel.isSuppressEMFModelTags()) {
+						boolean first = true;
+						for (StringTokenizer stringTokenizer = new StringTokenizer(genDataType.getModelInfo(),
+								"\n\r"); stringTokenizer.hasMoreTokens();) {
+							String modelInfo = stringTokenizer.nextToken();
+							if (first) {
+								first = false;
+								stringBuffer.append(TEXT_143);
+								stringBuffer.append(modelInfo);
+							} else {
+								stringBuffer.append(TEXT_144);
+								stringBuffer.append(modelInfo);
+							}
+						}
+						if (first) {
+							stringBuffer.append(TEXT_145);
+						}
+					}
+				}
+				if ((genClassifier instanceof GenClass || genClassifier instanceof GenEnum)
+						&& genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_49);
+			} else {
+				stringBuffer.append(TEXT_65);
+				if (genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_49);
+			}
+			if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_50);
+			}
+			if (isImplementation) {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_156);
+				}
+				stringBuffer.append(TEXT_157);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_158);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_159);
+				if (genPackage.isLoadedInitialization()) {
+					stringBuffer.append(TEXT_160);
+					stringBuffer.append(genClassifier.getClassifierInstanceName());
+					stringBuffer.append(TEXT_161);
+					stringBuffer.append(genClassifier.getClassifierInstanceName());
+					stringBuffer.append(TEXT_97);
+					stringBuffer.append(genClassifier.getImportedMetaType());
+					stringBuffer.append(TEXT_77);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+					stringBuffer.append(TEXT_78);
+					stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+					stringBuffer.append(TEXT_162);
+					stringBuffer.append(genPackage.getLocalClassifierIndex(genClassifier));
+					stringBuffer.append(TEXT_163);
+				}
+				stringBuffer.append(TEXT_164);
+				stringBuffer.append(genClassifier.getClassifierInstanceName());
+				stringBuffer.append(TEXT_165);
+			} else {
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_158);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_166);
+			}
+			if (genClassifier instanceof GenClass) {
+				GenClass genClass = (GenClass) genClassifier;
+				for (GenFeature genFeature : genClass.getGenFeatures()) {
+					if (isInterface) {
+						stringBuffer.append(TEXT_167);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_168);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genFeature.getGetAccessor());
+						}
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_170);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_171);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_142);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_47);
+						}
+						stringBuffer.append(TEXT_172);
+						stringBuffer.append(genClass.getClassifierAccessorName());
+						stringBuffer.append(TEXT_47);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_49);
+					} else {
+						stringBuffer.append(TEXT_65);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_48);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_49);
+					}
+					if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_50);
+					}
+					if (isImplementation) {
+						if (useInterfaceOverrideAnnotation) {
+							stringBuffer.append(TEXT_156);
+						}
+						stringBuffer.append(TEXT_157);
+						stringBuffer.append(genFeature.getImportedMetaType());
+						stringBuffer.append(TEXT_158);
+						stringBuffer.append(genFeature.getFeatureAccessorName());
+						stringBuffer.append(TEXT_159);
+						if (!genPackage.isLoadedInitialization()) {
+							stringBuffer.append(TEXT_173);
+							stringBuffer.append(genFeature.getImportedMetaType());
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genClass.getClassifierInstanceName());
+							stringBuffer.append(TEXT_174);
+							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
+							stringBuffer.append(TEXT_175);
+						} else {
+							stringBuffer.append(TEXT_176);
+							stringBuffer.append(genFeature.getImportedMetaType());
+							stringBuffer.append(TEXT_177);
+							stringBuffer.append(genClassifier.getClassifierAccessorName());
+							stringBuffer.append(TEXT_178);
+							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
+							stringBuffer.append(TEXT_175);
+						}
+						stringBuffer.append(TEXT_139);
+					} else {
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genFeature.getImportedMetaType());
+						stringBuffer.append(TEXT_158);
+						stringBuffer.append(genFeature.getFeatureAccessorName());
+						stringBuffer.append(TEXT_179);
+					}
+					stringBuffer.append(TEXT_4);
+				}
+				if (genModel.isOperationReflection()) {
+					for (GenOperation genOperation : genClass.getGenOperations()) {
+						if (isInterface) {
+							stringBuffer.append(TEXT_180);
+							stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genOperation.getName());
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(genOperation.getParameterTypes(", "));
+							stringBuffer.append(TEXT_182);
+							stringBuffer.append(genOperation.getFormattedName());
+							stringBuffer.append(TEXT_183);
+							stringBuffer.append(genOperation.getFormattedName());
+							stringBuffer.append(TEXT_184);
+							stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genOperation.getName());
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(genOperation.getParameterTypes(", "));
+							stringBuffer.append(TEXT_77);
+							if (genOperation.hasImplicitAPITags()) {
+								stringBuffer.append(TEXT_48);
+								stringBuffer
+										.append(genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+							}
+							stringBuffer.append(TEXT_49);
+						} else {
+							stringBuffer.append(TEXT_65);
+							if (genOperation.hasImplicitAPITags()) {
+								stringBuffer.append(TEXT_48);
+								stringBuffer
+										.append(genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+							}
+							stringBuffer.append(TEXT_49);
+						}
+						if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_50);
+						}
+						if (isImplementation) {
+							if (useInterfaceOverrideAnnotation) {
+								stringBuffer.append(TEXT_156);
+							}
+							stringBuffer.append(TEXT_157);
+							stringBuffer.append(genOperation.getImportedMetaType());
+							stringBuffer.append(TEXT_158);
+							stringBuffer.append(genOperation.getOperationAccessorName());
+							stringBuffer.append(TEXT_159);
+							if (!genPackage.isLoadedInitialization()) {
+								stringBuffer.append(TEXT_164);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_185);
+								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
+								stringBuffer.append(TEXT_175);
+							} else {
+								stringBuffer.append(TEXT_186);
+								stringBuffer.append(genClassifier.getClassifierAccessorName());
+								stringBuffer.append(TEXT_187);
+								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
+								stringBuffer.append(TEXT_175);
+							}
+							stringBuffer.append(TEXT_139);
+						} else {
+							stringBuffer.append(TEXT_51);
+							stringBuffer.append(genOperation.getImportedMetaType());
+							stringBuffer.append(TEXT_158);
+							stringBuffer.append(genOperation.getOperationAccessorName());
+							stringBuffer.append(TEXT_179);
+						}
+						stringBuffer.append(TEXT_4);
+					}
+				}
+			}
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_188);
+		} else {
+			stringBuffer.append(TEXT_189);
+		}
+		if (isImplementation) {
+			if (useInterfaceOverrideAnnotation) {
+				stringBuffer.append(TEXT_156);
+			}
+			stringBuffer.append(TEXT_157);
+			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
+			stringBuffer.append(TEXT_158);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_190);
+			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
+			stringBuffer.append(TEXT_191);
+		} else {
+			stringBuffer.append(TEXT_51);
+			stringBuffer.append(genPackage.getFactoryInterfaceName());
+			stringBuffer.append(TEXT_158);
+			stringBuffer.append(genPackage.getFactoryName());
+			stringBuffer.append(TEXT_179);
+		}
+		stringBuffer.append(TEXT_4);
+		if (isImplementation) {
+			if (!genPackage.isLoadedInitialization()) {
+				stringBuffer.append(TEXT_192);
+				{
+					boolean needsSuppressDeprecation = false;
+					if (!packageNeedsSuppressDeprecation && isJDK50 && !genModel.isSuppressEMFMetaData()) {
+						LOOP: for (GenClass genClass : genPackage.getGenClasses()) {
+							for (GenFeature genFeature : genClass.getGenFeatures()) {
+								if (genFeature.hasAPIDeprecatedTag()) {
+									needsSuppressDeprecation = true;
+									break LOOP;
+								}
+							}
+							for (GenOperation genOperation : genClass.getGenOperations()) {
+								if (genOperation.hasAPIDeprecatedTag()) {
+									needsSuppressDeprecation = true;
+									break LOOP;
+								}
+							}
+						}
+						if (needsSuppressDeprecation) {
+							stringBuffer.append(TEXT_193);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_194);
+				if (!genPackage.getGenClasses().isEmpty()) {
+					stringBuffer.append(TEXT_195);
+					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
+						GenClass genClass = c.next();
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genClass.getClassifierInstanceName());
+						stringBuffer.append(TEXT_196);
+						stringBuffer.append(genClass.getMetaType());
+						stringBuffer.append(TEXT_181);
+						stringBuffer.append(genClass.getClassifierID());
+						stringBuffer.append(TEXT_175);
+						for (GenFeature genFeature : genClass.getGenFeatures()) {
+							stringBuffer.append(TEXT_197);
+							stringBuffer.append(genFeature.getMetaType());
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(genClass.getClassifierInstanceName());
+							stringBuffer.append(TEXT_198);
+							stringBuffer.append(genClass.getFeatureID(genFeature));
+							stringBuffer.append(TEXT_175);
+						}
+						if (genModel.isOperationReflection()) {
+							for (GenOperation genOperation : genClass.getGenOperations()) {
+								stringBuffer.append(TEXT_199);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genClass.getOperationID(genOperation, false));
+								stringBuffer.append(TEXT_175);
+							}
+						}
+						if (c.hasNext()) {
+							stringBuffer.append(TEXT_4);
+						}
+					}
+				}
+				if (!genPackage.getGenEnums().isEmpty()) {
+					stringBuffer.append(TEXT_200);
+					for (GenEnum genEnum : genPackage.getGenEnums()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genEnum.getClassifierInstanceName());
+						stringBuffer.append(TEXT_201);
+						stringBuffer.append(genEnum.getClassifierID());
+						stringBuffer.append(TEXT_175);
+					}
+				}
+				if (!genPackage.getGenDataTypes().isEmpty()) {
+					stringBuffer.append(TEXT_202);
+					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(genDataType.getClassifierInstanceName());
+						stringBuffer.append(TEXT_203);
+						stringBuffer.append(genDataType.getClassifierID());
+						stringBuffer.append(TEXT_175);
+					}
+				}
+				stringBuffer.append(TEXT_204);
+
+				///////////////////////
+				class Information {
+					@SuppressWarnings("unused")
+					EGenericType eGenericType;
+					int depth;
+					String type;
+					String accessor;
+				}
+
+				class InformationIterator {
+					Iterator<Object> iterator;
+
+					InformationIterator(EGenericType eGenericType) {
+						iterator = EcoreUtil.getAllContents(Collections.singleton(eGenericType));
+					}
+
+					boolean hasNext() {
+						return iterator.hasNext();
+					}
+
+					Information next() {
+						Information information = new Information();
+						EGenericType eGenericType = information.eGenericType = (EGenericType) iterator.next();
+						for (EObject container = eGenericType
+								.eContainer(); container instanceof EGenericType; container = container.eContainer()) {
+							++information.depth;
+						}
+						if (eGenericType.getEClassifier() != null) {
+							GenClassifier genClassifier = genModel.findGenClassifier(eGenericType.getEClassifier());
+							information.type = genPackage.getPackageInstanceVariable(genClassifier.getGenPackage())
+									+ ".get" + genClassifier.getClassifierAccessorName() + "()";
+						} else if (eGenericType.getETypeParameter() != null) {
+							ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
+							if (eTypeParameter.eContainer() instanceof EClass) {
+								information.type = genModel.findGenClassifier((EClass) eTypeParameter.eContainer())
+										.getClassifierInstanceName() + "_" + eGenericType.getETypeParameter().getName();
+							} else {
+								information.type = "t" + (((EOperation) eTypeParameter.eContainer())
+										.getETypeParameters().indexOf(eTypeParameter) + 1);
+							}
+						} else {
+							information.type = "";
+						}
+						if (information.depth > 0) {
+							if (eGenericType.eContainmentFeature().isMany()) {
+								information.accessor = "getE"
+										+ eGenericType.eContainmentFeature().getName().substring(1) + "().add";
+							} else {
+								information.accessor = "setE"
+										+ eGenericType.eContainmentFeature().getName().substring(1);
+							}
+						}
+						return information;
+					}
+				}
+				///////////////////////
+				int maxGenericTypeAssignment = 0;
+
+				stringBuffer.append(TEXT_205);
+				{
+					boolean needsSuppressDeprecation = false;
+					if (!packageNeedsSuppressDeprecation && isJDK50) {
+						LOOP: for (GenEnum genEnum : genPackage.getGenEnums()) {
+							for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+								if (genEnumLiteral.hasAPIDeprecatedTag()) {
+									needsSuppressDeprecation = true;
+									break LOOP;
+								}
+							}
+						}
+						if (needsSuppressDeprecation) {
+							stringBuffer.append(TEXT_193);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_206);
+				if (!genPackage.getPackageInitializationDependencies().isEmpty()) {
+					stringBuffer.append(TEXT_207);
+					for (GenPackage dep : genPackage.getPackageInitializationDependencies()) {
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(dep.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_67);
+						stringBuffer.append(genPackage.getPackageInstanceVariable(dep));
+						stringBuffer.append(TEXT_97);
+						stringBuffer.append(dep.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(dep.getImportedPackageInterfaceName());
+						stringBuffer.append(TEXT_208);
+					}
+				}
+				if (!genPackage.getSubGenPackages().isEmpty()) {
+					stringBuffer.append(TEXT_209);
+					for (GenPackage sub : genPackage.getSubGenPackages()) {
+						stringBuffer.append(TEXT_210);
+						stringBuffer.append(genPackage.getPackageInstanceVariable(sub));
+						stringBuffer.append(TEXT_175);
+					}
+				}
+				if (!genPackage.getGenClasses().isEmpty()) {
+					boolean firstOperationAssignment = true;
+					int maxTypeParameterAssignment = 0;
+					if (genModel.useGenerics()) {
+						stringBuffer.append(TEXT_211);
+						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
+								if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
+										|| genTypeParameter.isUsed()) {
+									stringBuffer.append(TEXT_91);
+									stringBuffer
+											.append(genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter"));
+									stringBuffer.append(TEXT_67);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_212);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_213);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_215);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_216);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_215);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							}
+						}
+					}
+					if (genModel.useGenerics()) {
+						stringBuffer.append(TEXT_217);
+						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
+								for (EGenericType bound : genTypeParameter.getEcoreTypeParameter().getEBounds()) {
+									for (InformationIterator i = new InformationIterator(bound); i.hasNext();) {
+										Information info = i.next();
+										String prefix = "";
+										if (maxGenericTypeAssignment <= info.depth) {
+											++maxGenericTypeAssignment;
+											prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+													+ " ";
+										}
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(prefix);
+										stringBuffer.append(TEXT_218);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_219);
+										stringBuffer.append(info.type);
+										stringBuffer.append(TEXT_175);
+										if (info.depth > 0) {
+											stringBuffer.append(TEXT_220);
+											stringBuffer.append(info.depth);
+											stringBuffer.append(TEXT_221);
+											stringBuffer.append(info.accessor);
+											stringBuffer.append(TEXT_222);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_175);
+										}
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(genClassifier.getClassifierInstanceName());
+									stringBuffer.append(TEXT_212);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_223);
+								}
+							}
+						}
+					}
+					stringBuffer.append(TEXT_224);
+					for (GenClass genClass : genPackage.getGenClasses()) {
+						if (!genClass.hasGenericSuperTypes()) {
+							for (GenClass baseGenClass : genClass.getBaseGenClasses()) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_225);
+								stringBuffer
+										.append(genPackage.getPackageInstanceVariable(baseGenClass.getGenPackage()));
+								stringBuffer.append(TEXT_226);
+								stringBuffer.append(baseGenClass.getClassifierAccessorName());
+								stringBuffer.append(TEXT_227);
+							}
+						} else {
+							for (EGenericType superType : genClass.getEcoreClass().getEGenericSuperTypes()) {
+								for (InformationIterator i = new InformationIterator(superType); i.hasNext();) {
+									Information info = i.next();
+									String prefix = "";
+									if (maxGenericTypeAssignment <= info.depth) {
+										++maxGenericTypeAssignment;
+										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									stringBuffer.append(TEXT_218);
+									stringBuffer.append(info.depth + 1);
+									stringBuffer.append(TEXT_219);
+									stringBuffer.append(info.type);
+									stringBuffer.append(TEXT_175);
+									if (info.depth > 0) {
+										stringBuffer.append(TEXT_220);
+										stringBuffer.append(info.depth);
+										stringBuffer.append(TEXT_221);
+										stringBuffer.append(info.accessor);
+										stringBuffer.append(TEXT_222);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(genClass.getClassifierInstanceName());
+								stringBuffer.append(TEXT_228);
+							}
+						}
+					}
+					stringBuffer.append(TEXT_229);
+					if (genModel.isOperationReflection()) {
+						stringBuffer.append(TEXT_230);
+					} else {
+						stringBuffer.append(TEXT_231);
+					}
+					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
+						GenClass genClass = c.next();
+						boolean hasInstanceTypeName = genModel.useGenerics()
+								&& genClass.getEcoreClass().getInstanceTypeName() != null
+								&& genClass.getEcoreClass().getInstanceTypeName().contains("<");
+						stringBuffer.append(TEXT_232);
+						stringBuffer.append(genClass.getClassifierInstanceName());
+						stringBuffer.append(TEXT_198);
+						if (genClass.isDynamic()) {
+							stringBuffer.append(TEXT_233);
+						} else {
+							stringBuffer.append(genClass.getRawImportedInterfaceName());
+							stringBuffer.append(TEXT_234);
+						}
+						stringBuffer.append(TEXT_214);
+						stringBuffer.append(genClass.getName());
+						stringBuffer.append(TEXT_235);
+						stringBuffer.append(genClass.getAbstractFlag());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genClass.getInterfaceFlag());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genClass.getGeneratedInstanceClassFlag());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genClass.getEcoreClass().getInstanceTypeName());
+							stringBuffer.append(TEXT_236);
+						}
+						stringBuffer.append(TEXT_175);
+						stringBuffer.append(genModel.getNonNLS());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(genModel.getNonNLS(2));
+						}
+						for (GenFeature genFeature : genClass.getGenFeatures()) {
+							if (genFeature.hasGenericType()) {
+								for (InformationIterator i = new InformationIterator(
+										genFeature.getEcoreFeature().getEGenericType()); i.hasNext();) {
+									Information info = i.next();
+									String prefix = "";
+									if (maxGenericTypeAssignment <= info.depth) {
+										++maxGenericTypeAssignment;
+										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									stringBuffer.append(TEXT_218);
+									stringBuffer.append(info.depth + 1);
+									stringBuffer.append(TEXT_219);
+									stringBuffer.append(info.type);
+									stringBuffer.append(TEXT_175);
+									if (info.depth > 0) {
+										stringBuffer.append(TEXT_220);
+										stringBuffer.append(info.depth);
+										stringBuffer.append(TEXT_221);
+										stringBuffer.append(info.accessor);
+										stringBuffer.append(TEXT_222);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+							}
+							if (genFeature.isReferenceType()) {
+								GenFeature reverseGenFeature = genFeature.getReverse();
+								String reverse = reverseGenFeature == null ? "null"
+										: genPackage.getPackageInstanceVariable(reverseGenFeature.getGenPackage())
+												+ ".get" + reverseGenFeature.getFeatureAccessorName() + "()";
+								stringBuffer.append(TEXT_237);
+								stringBuffer.append(genFeature.getFeatureAccessorName());
+								stringBuffer.append(TEXT_238);
+								if (genFeature.hasGenericType()) {
+									stringBuffer.append(TEXT_239);
+								} else {
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_47);
+								}
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(reverse);
+								stringBuffer.append(TEXT_214);
+								stringBuffer.append(genFeature.getName());
+								stringBuffer.append(TEXT_235);
+								stringBuffer.append(genFeature.getDefaultValue());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getLowerBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUpperBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getContainerClass());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getTransientFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getVolatileFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getChangeableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getContainmentFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getResolveProxiesFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUnsettableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUniqueFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getDerivedFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getOrderedFlag());
+								stringBuffer.append(TEXT_175);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
+								for (GenFeature keyFeature : genFeature.getKeys()) {
+									stringBuffer.append(TEXT_240);
+									stringBuffer.append(genFeature.getFeatureAccessorName());
+									stringBuffer.append(TEXT_241);
+									stringBuffer
+											.append(genPackage.getPackageInstanceVariable(keyFeature.getGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(keyFeature.getFeatureAccessorName());
+									stringBuffer.append(TEXT_227);
+								}
+							} else {
+								stringBuffer.append(TEXT_242);
+								stringBuffer.append(genFeature.getFeatureAccessorName());
+								stringBuffer.append(TEXT_238);
+								if (genFeature.hasGenericType()) {
+									stringBuffer.append(TEXT_239);
+								} else {
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_47);
+								}
+								stringBuffer.append(TEXT_214);
+								stringBuffer.append(genFeature.getName());
+								stringBuffer.append(TEXT_235);
+								stringBuffer.append(genFeature.getDefaultValue());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getLowerBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUpperBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getContainerClass());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getTransientFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getVolatileFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getChangeableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUnsettableFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getIDFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getUniqueFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getDerivedFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genFeature.getOrderedFlag());
+								stringBuffer.append(TEXT_175);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
+							}
+						}
+						for (GenOperation genOperation : genClass.getGenOperations()) {
+							String prefix = "";
+							if (genOperation.hasGenericType() || !genOperation.getGenParameters().isEmpty()
+									|| !genOperation.getGenExceptions().isEmpty()
+									|| !genOperation.getGenTypeParameters().isEmpty()) {
+								if (firstOperationAssignment) {
+									firstOperationAssignment = false;
+									prefix = genModel.getImportedName("org.eclipse.emf.ecore.EOperation") + " op = ";
+								} else {
+									prefix = "op = ";
+								}
+							}
+							stringBuffer.append(TEXT_4);
+							if (genModel.useGenerics()) {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(prefix);
+								if (genModel.isOperationReflection()) {
+									stringBuffer.append(TEXT_243);
+									stringBuffer.append(genOperation.getOperationAccessorName());
+									stringBuffer.append(TEXT_47);
+								} else {
+									stringBuffer.append(TEXT_244);
+									stringBuffer.append(genClass.getClassifierInstanceName());
+								}
+								stringBuffer.append(TEXT_198);
+								if (genOperation.isVoid() || genOperation.hasGenericType()) {
+									stringBuffer.append(TEXT_233);
+								} else {
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_47);
+								}
+								stringBuffer.append(TEXT_214);
+								stringBuffer.append(genOperation.getName());
+								stringBuffer.append(TEXT_235);
+								stringBuffer.append(genOperation.getLowerBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genOperation.getUpperBound());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genOperation.getUniqueFlag());
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genOperation.getOrderedFlag());
+								stringBuffer.append(TEXT_175);
+								stringBuffer.append(genModel.getNonNLS());
+							} else if (!genOperation.isVoid()) {
+								if (!genOperation.getEcoreOperation().isOrdered()
+										|| !genOperation.getEcoreOperation().isUnique()) {
+									needsAddEOperation = true;
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									if (genModel.isOperationReflection()) {
+										stringBuffer.append(TEXT_243);
+										stringBuffer.append(genOperation.getOperationAccessorName());
+										stringBuffer.append(TEXT_47);
+									} else {
+										stringBuffer.append(TEXT_244);
+										stringBuffer.append(genClass.getClassifierInstanceName());
+									}
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_245);
+									stringBuffer.append(genOperation.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genOperation.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getUpperBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getUniqueFlag());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getOrderedFlag());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(prefix);
+									if (genModel.isOperationReflection()) {
+										stringBuffer.append(TEXT_243);
+										stringBuffer.append(genOperation.getOperationAccessorName());
+										stringBuffer.append(TEXT_47);
+									} else {
+										stringBuffer.append(TEXT_244);
+										stringBuffer.append(genClass.getClassifierInstanceName());
+									}
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
+									stringBuffer.append(TEXT_245);
+									stringBuffer.append(genOperation.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genOperation.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genOperation.getUpperBound());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							} else {
+								stringBuffer.append(TEXT_91);
+								stringBuffer.append(prefix);
+								if (genModel.isOperationReflection()) {
+									stringBuffer.append(TEXT_243);
+									stringBuffer.append(genOperation.getOperationAccessorName());
+									stringBuffer.append(TEXT_47);
+								} else {
+									stringBuffer.append(TEXT_244);
+									stringBuffer.append(genClass.getClassifierInstanceName());
+								}
+								stringBuffer.append(TEXT_246);
+								stringBuffer.append(genOperation.getName());
+								stringBuffer.append(TEXT_215);
+								stringBuffer.append(genModel.getNonNLS());
+							}
+							if (genModel.useGenerics()) {
+								for (ListIterator<GenTypeParameter> t = genOperation.getGenTypeParameters()
+										.listIterator(); t.hasNext();) {
+									GenTypeParameter genTypeParameter = t.next();
+									String typeParameterVariable = "";
+									if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
+											|| genTypeParameter.isUsed()) {
+										if (maxTypeParameterAssignment <= t.previousIndex()) {
+											++maxTypeParameterAssignment;
+											typeParameterVariable = genModel
+													.getImportedName("org.eclipse.emf.ecore.ETypeParameter") + " t"
+													+ t.nextIndex() + " = ";
+										} else {
+											typeParameterVariable = "t" + t.nextIndex() + " = ";
+										}
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(typeParameterVariable);
+									stringBuffer.append(TEXT_247);
+									stringBuffer.append(genTypeParameter.getName());
+									stringBuffer.append(TEXT_215);
+									stringBuffer.append(genModel.getNonNLS());
+									for (EGenericType typeParameter : genTypeParameter.getEcoreTypeParameter()
+											.getEBounds()) {
+										for (InformationIterator i = new InformationIterator(typeParameter); i
+												.hasNext();) {
+											Information info = i.next();
+											String typePrefix = "";
+											if (maxGenericTypeAssignment <= info.depth) {
+												++maxGenericTypeAssignment;
+												typePrefix = genModel
+														.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
+											}
+											stringBuffer.append(TEXT_91);
+											stringBuffer.append(typePrefix);
+											stringBuffer.append(TEXT_218);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_219);
+											stringBuffer.append(info.type);
+											stringBuffer.append(TEXT_175);
+											if (info.depth > 0) {
+												stringBuffer.append(TEXT_220);
+												stringBuffer.append(info.depth);
+												stringBuffer.append(TEXT_221);
+												stringBuffer.append(info.accessor);
+												stringBuffer.append(TEXT_222);
+												stringBuffer.append(info.depth + 1);
+												stringBuffer.append(TEXT_175);
+											}
+										}
+										stringBuffer.append(TEXT_248);
+										stringBuffer.append(t.nextIndex());
+										stringBuffer.append(TEXT_223);
+									}
+								}
+							}
+							for (GenParameter genParameter : genOperation.getGenParameters()) {
+								if (genParameter.hasGenericType()) {
+									for (InformationIterator i = new InformationIterator(
+											genParameter.getEcoreParameter().getEGenericType()); i.hasNext();) {
+										Information info = i.next();
+										String typePrefix = "";
+										if (maxGenericTypeAssignment <= info.depth) {
+											++maxGenericTypeAssignment;
+											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+													+ " ";
+										}
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(typePrefix);
+										stringBuffer.append(TEXT_218);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_219);
+										stringBuffer.append(info.type);
+										stringBuffer.append(TEXT_175);
+										if (info.depth > 0) {
+											stringBuffer.append(TEXT_220);
+											stringBuffer.append(info.depth);
+											stringBuffer.append(TEXT_221);
+											stringBuffer.append(info.accessor);
+											stringBuffer.append(TEXT_222);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_175);
+										}
+									}
+								}
+								if (genModel.useGenerics()) {
+									stringBuffer.append(TEXT_249);
+									if (genParameter.hasGenericType()) {
+										stringBuffer.append(TEXT_239);
+									} else {
+										stringBuffer.append(genPackage
+												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
+										stringBuffer.append(TEXT_226);
+										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
+										stringBuffer.append(TEXT_47);
+									}
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genParameter.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genParameter.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUpperBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUniqueFlag());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getOrderedFlag());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								} else if (!genParameter.getEcoreParameter().isOrdered()
+										|| !genParameter.getEcoreParameter().isUnique()) {
+									needsAddEParameter = true;
+									stringBuffer.append(TEXT_249);
+									if (genParameter.hasGenericType()) {
+										stringBuffer.append(TEXT_239);
+									} else {
+										stringBuffer.append(genPackage
+												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
+										stringBuffer.append(TEXT_226);
+										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
+										stringBuffer.append(TEXT_47);
+									}
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genParameter.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genParameter.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUpperBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUniqueFlag());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getOrderedFlag());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								} else {
+									stringBuffer.append(TEXT_249);
+									if (genParameter.hasGenericType()) {
+										stringBuffer.append(TEXT_239);
+									} else {
+										stringBuffer.append(genPackage
+												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
+										stringBuffer.append(TEXT_226);
+										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
+										stringBuffer.append(TEXT_47);
+									}
+									stringBuffer.append(TEXT_214);
+									stringBuffer.append(genParameter.getName());
+									stringBuffer.append(TEXT_235);
+									stringBuffer.append(genParameter.getLowerBound());
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(genParameter.getUpperBound());
+									stringBuffer.append(TEXT_175);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+							}
+							if (genOperation.hasGenericExceptions()) {
+								for (EGenericType genericExceptions : genOperation.getEcoreOperation()
+										.getEGenericExceptions()) {
+									for (InformationIterator i = new InformationIterator(genericExceptions); i
+											.hasNext();) {
+										Information info = i.next();
+										String typePrefix = "";
+										if (maxGenericTypeAssignment <= info.depth) {
+											++maxGenericTypeAssignment;
+											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+													+ " ";
+										}
+										stringBuffer.append(TEXT_91);
+										stringBuffer.append(typePrefix);
+										stringBuffer.append(TEXT_218);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_219);
+										stringBuffer.append(info.type);
+										stringBuffer.append(TEXT_175);
+										if (info.depth > 0) {
+											stringBuffer.append(TEXT_220);
+											stringBuffer.append(info.depth);
+											stringBuffer.append(TEXT_221);
+											stringBuffer.append(info.accessor);
+											stringBuffer.append(TEXT_222);
+											stringBuffer.append(info.depth + 1);
+											stringBuffer.append(TEXT_175);
+										}
+										stringBuffer.append(TEXT_250);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+							} else {
+								for (GenClassifier genException : genOperation.getGenExceptions()) {
+									stringBuffer.append(TEXT_251);
+									stringBuffer.append(
+											genPackage.getPackageInstanceVariable(genException.getGenPackage()));
+									stringBuffer.append(TEXT_226);
+									stringBuffer.append(genException.getClassifierAccessorName());
+									stringBuffer.append(TEXT_227);
+								}
+							}
+							if (!genOperation.isVoid() && genOperation.hasGenericType()) {
+								for (InformationIterator i = new InformationIterator(
+										genOperation.getEcoreOperation().getEGenericType()); i.hasNext();) {
+									Information info = i.next();
+									String typePrefix = "";
+									if (maxGenericTypeAssignment <= info.depth) {
+										++maxGenericTypeAssignment;
+										typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
+												+ " ";
+									}
+									stringBuffer.append(TEXT_91);
+									stringBuffer.append(typePrefix);
+									stringBuffer.append(TEXT_218);
+									stringBuffer.append(info.depth + 1);
+									stringBuffer.append(TEXT_219);
+									stringBuffer.append(info.type);
+									stringBuffer.append(TEXT_175);
+									if (info.depth > 0) {
+										stringBuffer.append(TEXT_220);
+										stringBuffer.append(info.depth);
+										stringBuffer.append(TEXT_221);
+										stringBuffer.append(info.accessor);
+										stringBuffer.append(TEXT_222);
+										stringBuffer.append(info.depth + 1);
+										stringBuffer.append(TEXT_175);
+									}
+								}
+								stringBuffer.append(TEXT_252);
+							}
+						}
+						if (c.hasNext()) {
+							stringBuffer.append(TEXT_4);
+						}
+					}
+				}
+				if (!genPackage.getGenEnums().isEmpty()) {
+					stringBuffer.append(TEXT_253);
+					for (Iterator<GenEnum> e = genPackage.getGenEnums().iterator(); e.hasNext();) {
+						GenEnum genEnum = e.next();
+						stringBuffer.append(TEXT_254);
+						stringBuffer.append(genEnum.getClassifierInstanceName());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genEnum.getImportedName());
+						stringBuffer.append(TEXT_255);
+						stringBuffer.append(genEnum.getName());
+						stringBuffer.append(TEXT_215);
+						stringBuffer.append(genModel.getNonNLS());
+						for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
+							stringBuffer.append(TEXT_256);
+							stringBuffer.append(genEnum.getClassifierInstanceName());
+							stringBuffer.append(TEXT_198);
+							stringBuffer.append(genEnum.getImportedName().equals(genEnum.getClassifierID())
+									? genEnum.getQualifiedName()
+									: genEnum.getImportedName());
+							stringBuffer.append(TEXT_221);
+							stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
+							stringBuffer.append(TEXT_175);
+						}
+						if (e.hasNext()) {
+							stringBuffer.append(TEXT_4);
+						}
+					}
+				}
+				if (!genPackage.getGenDataTypes().isEmpty()) {
+					stringBuffer.append(TEXT_257);
+					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
+						boolean hasInstanceTypeName = genModel.useGenerics()
+								&& genDataType.getEcoreDataType().getInstanceTypeName() != null
+								&& genDataType.getEcoreDataType().getInstanceTypeName().contains("<");
+						stringBuffer.append(TEXT_258);
+						stringBuffer.append(genDataType.getClassifierInstanceName());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genDataType.getRawImportedInstanceClassName());
+						stringBuffer.append(TEXT_255);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_235);
+						stringBuffer.append(genDataType.getSerializableFlag());
+						stringBuffer.append(TEXT_198);
+						stringBuffer.append(genDataType.getGeneratedInstanceClassFlag());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genDataType.getEcoreDataType().getInstanceTypeName());
+							stringBuffer.append(TEXT_236);
+						}
+						stringBuffer.append(TEXT_175);
+						stringBuffer.append(genModel.getNonNLS());
+						if (hasInstanceTypeName) {
+							stringBuffer.append(genModel.getNonNLS(2));
+						}
+					}
+				}
+				if (genPackage.getSuperGenPackage() == null) {
+					stringBuffer.append(TEXT_259);
+					stringBuffer.append(genPackage.getSchemaLocation());
+					stringBuffer.append(TEXT_175);
+				}
+				if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {
+					stringBuffer.append(TEXT_260);
+					for (String annotationSource : genPackage.getAnnotationSources()) {
+						stringBuffer.append(TEXT_261);
+						stringBuffer.append(annotationSource);
+						stringBuffer.append(TEXT_197);
+						stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
+						stringBuffer.append(TEXT_262);
+					}
+				}
+				stringBuffer.append(TEXT_263);
+				for (String annotationSource : genPackage.getAnnotationSources()) {
+					stringBuffer.append(TEXT_264);
+					stringBuffer.append(annotationSource);
+					stringBuffer.append(TEXT_265);
+					stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
+					stringBuffer.append(TEXT_266);
+					if (annotationSource == null) {
+						stringBuffer.append(TEXT_267);
+					} else {
+						stringBuffer.append(TEXT_236);
+						stringBuffer.append(annotationSource);
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genModel.getNonNLS());
+					}
+					for (EAnnotation eAnnotation : genPackage.getAllAnnotations()) {
+						List<GenPackage.AnnotationReferenceData> annotationReferenceDataList = genPackage
+								.getReferenceData(eAnnotation);
+						if (annotationSource == null ? eAnnotation.getSource() == null
+								: annotationSource.equals(eAnnotation.getSource())) {
+							stringBuffer.append(TEXT_268);
+							stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
+							stringBuffer.append(TEXT_269);
+							for (Iterator<Map.Entry<String, String>> k = eAnnotation.getDetails().iterator(); k
+									.hasNext();) {
+								Map.Entry<String, String> detail = k.next();
+								String key = Literals.toStringLiteral(detail.getKey(), genModel);
+								String value = Literals.toStringLiteral(detail.getValue(), genModel);
+								stringBuffer.append(TEXT_270);
+								stringBuffer.append(key);
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(value);
+								stringBuffer.append(k.hasNext() ? "," : "");
+								stringBuffer.append(genModel.getNonNLS(key + value));
+							}
+							stringBuffer.append(TEXT_271);
+							if (annotationReferenceDataList.isEmpty()) {
+								stringBuffer.append(TEXT_175);
+							} else {
+								stringBuffer.append(TEXT_272);
+							}
+							if (!annotationReferenceDataList.isEmpty()) {
+								stringBuffer.append(TEXT_273);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+								stringBuffer.append(TEXT_274);
+								for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList
+										.iterator(); k.hasNext();) {
+									GenPackage.AnnotationReferenceData annotationReferenceData = k.next();
+									stringBuffer.append(TEXT_275);
+									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+									stringBuffer.append(TEXT_276);
+									if (annotationReferenceData.containingGenPackage != genPackage) {
+										stringBuffer.append(annotationReferenceData.containingGenPackage
+												.getImportedPackageInterfaceName());
+										stringBuffer.append(TEXT_221);
+									}
+									stringBuffer.append(TEXT_277);
+									stringBuffer.append(annotationReferenceData.uriFragment);
+									stringBuffer.append(TEXT_278);
+									if (k.hasNext()) {
+										stringBuffer.append(TEXT_272);
+									}
+									stringBuffer.append(genModel.getNonNLS());
+								}
+								stringBuffer.append(TEXT_279);
+							}
+							for (EAnnotation nestedEAnnotation : genPackage.getAllNestedAnnotations(eAnnotation)) {
+								String nestedAnnotationSource = nestedEAnnotation.getSource();
+								int depth = 0;
+								boolean nonContentAnnotation = false;
+								StringBuilder path = new StringBuilder();
+								for (EObject eContainer = nestedEAnnotation
+										.eContainer(), child = nestedEAnnotation; child != eAnnotation; child = eContainer, eContainer = eContainer
+												.eContainer()) {
+									boolean nonContentChild = child
+											.eContainmentFeature() != EcorePackage.Literals.EANNOTATION__CONTENTS;
+									if (path.length() != 0) {
+										path.insert(0, ", ");
+									}
+									path.insert(0, nonContentChild);
+									if (nonContentChild) {
+										nonContentAnnotation = true;
+									}
+									++depth;
+								}
+								List<GenPackage.AnnotationReferenceData> nestedAnnotationReferenceDataList = genPackage
+										.getReferenceData(nestedEAnnotation);
+								stringBuffer.append(TEXT_268);
+								stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
+								stringBuffer.append(TEXT_280);
+								if (nonContentAnnotation
+										&& genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {
+									stringBuffer.append(TEXT_281);
+									stringBuffer.append(path.toString());
+									stringBuffer.append(TEXT_282);
+								} else {
+									stringBuffer.append(depth);
+								}
+								stringBuffer.append(TEXT_280);
+								if (nestedAnnotationSource == null) {
+									stringBuffer.append(TEXT_283);
+								} else {
+									stringBuffer.append(TEXT_236);
+									stringBuffer.append(nestedAnnotationSource);
+									stringBuffer.append(TEXT_284);
+									stringBuffer.append(genModel.getNonNLS());
+								}
+								stringBuffer.append(TEXT_285);
+								for (Iterator<Map.Entry<String, String>> l = nestedEAnnotation.getDetails()
+										.iterator(); l.hasNext();) {
+									Map.Entry<String, String> detail = l.next();
+									String key = Literals.toStringLiteral(detail.getKey(), genModel);
+									String value = Literals.toStringLiteral(detail.getValue(), genModel);
+									stringBuffer.append(TEXT_270);
+									stringBuffer.append(key);
+									stringBuffer.append(TEXT_198);
+									stringBuffer.append(value);
+									stringBuffer.append(l.hasNext() ? "," : "");
+									stringBuffer.append(genModel.getNonNLS(key + value));
+								}
+								stringBuffer.append(TEXT_271);
+								if (nestedAnnotationReferenceDataList.isEmpty()) {
+									stringBuffer.append(TEXT_175);
+								} else {
+									stringBuffer.append(TEXT_272);
+								}
+								if (!nestedAnnotationReferenceDataList.isEmpty()) {
+									stringBuffer.append(TEXT_273);
+									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+									stringBuffer.append(TEXT_274);
+									for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList
+											.iterator(); l.hasNext();) {
+										GenPackage.AnnotationReferenceData annotationReferenceData = l.next();
+										stringBuffer.append(TEXT_275);
+										stringBuffer
+												.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+										stringBuffer.append(TEXT_276);
+										if (annotationReferenceData.containingGenPackage != genPackage) {
+											stringBuffer.append(annotationReferenceData.containingGenPackage
+													.getImportedPackageInterfaceName());
+											stringBuffer.append(TEXT_221);
+										}
+										stringBuffer.append(TEXT_277);
+										stringBuffer.append(annotationReferenceData.uriFragment);
+										stringBuffer.append(TEXT_278);
+										if (l.hasNext()) {
+											stringBuffer.append(TEXT_272);
+										}
+										stringBuffer.append(genModel.getNonNLS());
+									}
+									stringBuffer.append(TEXT_279);
+								}
+							}
+						}
+					}
+					stringBuffer.append(TEXT_263);
+				}
+			} else {
+				if (genPackage.isLoadingInitialization()) {
+					stringBuffer.append(TEXT_286);
+					stringBuffer.append(genModel.getImportedName("java.net.URL"));
+					stringBuffer.append(TEXT_287);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_288);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+					stringBuffer.append(TEXT_289);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+					stringBuffer.append(TEXT_290);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
+					stringBuffer.append(TEXT_291);
+					stringBuffer.append(
+							genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl"));
+					stringBuffer.append(TEXT_292);
+					stringBuffer.append(genModel.getImportedName("java.io.IOException"));
+					stringBuffer.append(TEXT_293);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
+					stringBuffer.append(TEXT_294);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+					stringBuffer.append(TEXT_295);
+				}
+				stringBuffer.append(TEXT_296);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_156);
+				}
+				stringBuffer.append(TEXT_297);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+				stringBuffer.append(TEXT_298);
+				ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>();
+				for (GenClass genClass : genPackage.getGenClasses()) {
+					if (genClass.isDynamic()) {
+						dynamicGenClasses.add(genClass);
+					}
+				}
+				if (dynamicGenClasses.isEmpty()) {
+					stringBuffer.append(TEXT_299);
+					stringBuffer.append(genPackage.getInterfacePackageName());
+					stringBuffer.append(TEXT_300);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_301);
+				} else {
+					stringBuffer.append(TEXT_302);
+					for (GenClass genClass : dynamicGenClasses) {
+						if (genClass.isDynamic()) {
+							stringBuffer.append(TEXT_303);
+							stringBuffer.append(genPackage.getClassifierID(genClass));
+							stringBuffer.append(TEXT_304);
+						}
+					}
+					stringBuffer.append(TEXT_305);
+					stringBuffer.append(genPackage.getInterfacePackageName());
+					stringBuffer.append(TEXT_300);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_306);
+				}
+				stringBuffer.append(TEXT_307);
+			}
+			if (needsAddEOperation) {
+				stringBuffer.append(TEXT_308);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_309);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+				stringBuffer.append(TEXT_310);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+				stringBuffer.append(TEXT_311);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_312);
+			}
+			if (needsAddEParameter) {
+				stringBuffer.append(TEXT_308);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
+				stringBuffer.append(TEXT_313);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_310);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+				stringBuffer.append(TEXT_311);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
+				stringBuffer.append(TEXT_314);
+			}
+		}
+		if (isInterface && genPackage.isLiteralsInterface()) {
+			stringBuffer.append(TEXT_315);
+			if (genModel.isOperationReflection()) {
+				stringBuffer.append(TEXT_316);
+			}
+			stringBuffer.append(TEXT_317);
+			if (isImplementation) {
+				stringBuffer.append(TEXT_318);
+			}
+			stringBuffer.append(TEXT_319);
+			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+				stringBuffer.append(TEXT_320);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					if (!genClass.isInterface()) {
+						stringBuffer.append(TEXT_321);
+						stringBuffer.append(genClass.getQualifiedClassName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_322);
+						stringBuffer.append(genClass.getQualifiedClassName());
+					} else {
+						stringBuffer.append(TEXT_321);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getFormattedName());
+						stringBuffer.append(TEXT_322);
+						stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					}
+				} else if (genClassifier instanceof GenEnum) {
+					GenEnum genEnum = (GenEnum) genClassifier;
+					stringBuffer.append(TEXT_321);
+					stringBuffer.append(genEnum.getQualifiedName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genEnum.getFormattedName());
+					stringBuffer.append(TEXT_323);
+					stringBuffer.append(genEnum.getQualifiedName());
+				} else if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					stringBuffer.append(TEXT_324);
+					stringBuffer.append(genDataType.getFormattedName());
+					stringBuffer.append(TEXT_325);
+					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+						stringBuffer.append(TEXT_326);
+						stringBuffer.append(genDataType.getRawInstanceClassName());
+					}
+				}
+				stringBuffer.append(TEXT_326);
+				stringBuffer.append(genPackage.getQualifiedPackageClassName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_47);
+				if (genClassifier.hasAPITags()) {
+					stringBuffer.append(TEXT_327);
+					stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_328);
+				if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_329);
+				}
+				stringBuffer.append(TEXT_91);
+				stringBuffer.append(publicStaticFinalFlag);
+				stringBuffer.append(genClassifier.getImportedMetaType());
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(genPackage.getClassifierID(genClassifier));
+				stringBuffer.append(TEXT_330);
+				stringBuffer.append(genClassifier.getClassifierAccessorName());
+				stringBuffer.append(TEXT_166);
+				if (genClassifier instanceof GenClass) {
+					GenClass genClass = (GenClass) genClassifier;
+					for (GenFeature genFeature : genClass.getGenFeatures()) {
+						stringBuffer.append(TEXT_331);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_56);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_332);
+						if (genFeature.hasImplicitAPITags()) {
+							stringBuffer.append(TEXT_327);
+							stringBuffer.append(genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_328);
+						if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_329);
+						}
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(publicStaticFinalFlag);
+						stringBuffer.append(genFeature.getImportedMetaType());
+						stringBuffer.append(TEXT_67);
+						stringBuffer.append(genClass.getFeatureID(genFeature));
+						stringBuffer.append(TEXT_330);
+						stringBuffer.append(genFeature.getFeatureAccessorName());
+						stringBuffer.append(TEXT_166);
+					}
+					if (genModel.isOperationReflection()) {
+						for (GenOperation genOperation : genClass.getGenOperations()) {
+							stringBuffer.append(TEXT_331);
+							stringBuffer.append(genOperation.getFormattedName());
+							stringBuffer.append(TEXT_333);
+							if (genOperation.hasImplicitAPITags()) {
+								stringBuffer.append(TEXT_327);
+								stringBuffer
+										.append(genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+							}
+							stringBuffer.append(TEXT_328);
+							if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {
+								stringBuffer.append(TEXT_329);
+							}
+							stringBuffer.append(TEXT_91);
+							stringBuffer.append(publicStaticFinalFlag);
+							stringBuffer.append(genOperation.getImportedMetaType());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genClass.getOperationID(genOperation, false));
+							stringBuffer.append(TEXT_330);
+							stringBuffer.append(genOperation.getOperationAccessorName());
+							stringBuffer.append(TEXT_166);
+						}
+					}
+				}
+			}
+			stringBuffer.append(TEXT_263);
+		}
+		stringBuffer.append(TEXT_334);
+		stringBuffer.append(isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers() && !genModel.isSuppressEMFMetaData()
+				&& !genModel.isSuppressInterfaces());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Plugin.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Plugin.java
new file mode 100644
index 0000000..b491e23
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/Plugin.java
@@ -0,0 +1,320 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Plugin extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized Plugin create(String lineSeparator) {
+		nl = lineSeparator;
+		Plugin result = new Plugin();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * This is the central singleton for the ";
+	protected final String TEXT_5 = " model plugin." + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "public final class ";
+	protected final String TEXT_10 = " extends EMFPlugin" + NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * Keep track of the singleton." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final ";
+	protected final String TEXT_16 = " INSTANCE = new ";
+	protected final String TEXT_17 = "();" + NL;
+	protected final String TEXT_18 = NL + "\t/**" + NL + "\t * Keep track of the singleton." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprivate static Implementation plugin;" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * Create the instance." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_20 = "()" + NL + "\t{" + NL + "\t\tsuper(new ResourceLocator [] {});" + NL + "\t}" + NL
+			+ "" + NL + "\t/**" + NL + "\t * Returns the singleton instance of the Eclipse plugin." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the singleton instance." + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_21 = NL + "\t@Override";
+	protected final String TEXT_22 = NL + "\tpublic ResourceLocator getPluginResourceLocator()" + NL + "\t{";
+	protected final String TEXT_23 = NL + "\t\treturn null;";
+	protected final String TEXT_24 = NL + "\t\treturn plugin;";
+	protected final String TEXT_25 = NL + "\t}" + NL;
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * Returns the singleton instance of the Eclipse plugin."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the singleton instance." + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static Implementation getPlugin()" + NL + "\t{" + NL + "\t\treturn plugin;" + NL + "\t}" + NL
+			+ "" + NL + "\t/**" + NL + "\t * The actual implementation of the Eclipse <b>Plugin</b>." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static class Implementation extends EclipsePlugin" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * Creates an instance." + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->";
+	protected final String TEXT_27 = NL + "\t\t * @param descriptor the description of the plugin.";
+	protected final String TEXT_28 = NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic Implementation(";
+	protected final String TEXT_29 = " descriptor";
+	protected final String TEXT_30 = ")" + NL + "\t\t{" + NL + "\t\t\tsuper(";
+	protected final String TEXT_31 = "descriptor";
+	protected final String TEXT_32 = ");" + NL + "" + NL + "\t\t\t// Remember the static instance." + NL + "\t\t\t//"
+			+ NL + "\t\t\tplugin = this;" + NL + "\t\t}";
+	protected final String TEXT_33 = NL + "\t" + NL + "\t\t/**" + NL
+			+ "\t\t * The actual implementation of the purely OSGi-compatible <b>Bundle Activator</b>." + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic static final class Activator extends ";
+	protected final String TEXT_34 = ".OSGiDelegatingBundleActivator" + NL + "\t\t{";
+	protected final String TEXT_35 = NL + "\t\t\t@Override";
+	protected final String TEXT_36 = NL + "\t\t\tprotected ";
+	protected final String TEXT_37 = " createBundle()" + NL + "\t\t\t{" + NL + "\t\t\t\treturn new Implementation();"
+			+ NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_38 = NL + "}";
+	protected final String TEXT_39 = NL;
+
+	public Plugin() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_39);
+		stringBuffer.append(TEXT_39);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getModelDirectory();
+		packageName = genModel.getModelPluginPackageName();
+		className = genModel.getModelPluginClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2004 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getModelPluginPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("org.eclipse.emf.common.EMFPlugin");
+		genModel.addImport("org.eclipse.emf.common.util.ResourceLocator");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_5);
+		if (genModel.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genModel.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genModel.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genModel.getModelPluginClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genModel.getModelPluginClassName());
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genModel.getModelPluginClassName());
+		stringBuffer.append(TEXT_17);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_18);
+		}
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genModel.getModelPluginClassName());
+		stringBuffer.append(TEXT_20);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_21);
+		}
+		stringBuffer.append(TEXT_22);
+		if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_23);
+		} else {
+			stringBuffer.append(TEXT_24);
+		}
+		stringBuffer.append(TEXT_25);
+		if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {
+			stringBuffer.append(TEXT_26);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(TEXT_27);
+			}
+			stringBuffer.append(TEXT_28);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.IPluginDescriptor"));
+				stringBuffer.append(TEXT_29);
+			}
+			stringBuffer.append(TEXT_30);
+			if (genModel.needsRuntimeCompatibility()) {
+				stringBuffer.append(TEXT_31);
+			}
+			stringBuffer.append(TEXT_32);
+			if (genModel.isOSGiCompatible()) {
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.EMFPlugin"));
+				stringBuffer.append(TEXT_34);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_35);
+				}
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genModel.getImportedName("org.osgi.framework.BundleActivator"));
+				stringBuffer.append(TEXT_37);
+			}
+			stringBuffer.append(TEXT_25);
+		}
+		stringBuffer.append(TEXT_38);
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genModel.hasModelPluginClass());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PluginProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PluginProperties.java
new file mode 100644
index 0000000..e5ca0d2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PluginProperties.java
@@ -0,0 +1,201 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginProperties extends org.eclipse.egf.emf.pattern.base.GenModelProperties {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "pluginName = ";
+	protected final String TEXT_3 = NL + "providerName = ";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "_UI_";
+	protected final String TEXT_6 = "_content_type = ";
+	protected final String TEXT_7 = " File";
+	protected final String TEXT_8 = NL;
+
+	public PluginProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(TEXT_8);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getModelProjectDirectory() + "/" + genModel.getModelBundleLocalization()
+				+ ".properties";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2004 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getModelBundleName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getModelBundleVendorName());
+		boolean first = true;
+		for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+			if (genPackage.isContentType()) {
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_4);
+				}
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genPackage.getPrefix());
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genPackage.getPrefix());
+				stringBuffer.append(TEXT_7);
+			}
+		}
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genModel.hasPluginSupport());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PluginXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PluginXML.java
new file mode 100644
index 0000000..85b5f11
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/PluginXML.java
@@ -0,0 +1,338 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized PluginXML create(String lineSeparator) {
+		nl = lineSeparator;
+		PluginXML result = new PluginXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL + "<?eclipse version=\"3.0\"?>"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "<plugin>";
+	protected final String TEXT_4 = NL + "<plugin" + NL + "      name=\"%pluginName\"" + NL + "      id=\"";
+	protected final String TEXT_5 = "\"" + NL + "      version=\"1.0.0\"";
+	protected final String TEXT_6 = NL + "      provider-name=\"%providerName\"" + NL + "      class=\"";
+	protected final String TEXT_7 = "$Implementation\">";
+	protected final String TEXT_8 = NL + "      provider-name=\"%providerName\">";
+	protected final String TEXT_9 = NL + NL + "   <requires>";
+	protected final String TEXT_10 = NL + "      <import plugin=\"";
+	protected final String TEXT_11 = "\"";
+	protected final String TEXT_12 = " export=\"true\"";
+	protected final String TEXT_13 = "/>";
+	protected final String TEXT_14 = NL + "   </requires>" + NL + "" + NL + "   <runtime>";
+	protected final String TEXT_15 = NL + "      <library name=\"";
+	protected final String TEXT_16 = ".jar\">";
+	protected final String TEXT_17 = NL + "      <library name=\".\">";
+	protected final String TEXT_18 = NL + "         <export name=\"*\"/>" + NL + "      </library>" + NL
+			+ "   </runtime>";
+	protected final String TEXT_19 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.generated_package\">";
+	protected final String TEXT_20 = NL + "      <!-- @generated ";
+	protected final String TEXT_21 = " -->";
+	protected final String TEXT_22 = NL + "      <package" + NL + "            uri=\"";
+	protected final String TEXT_23 = NL + "            class=\"";
+	protected final String TEXT_24 = "\"" + NL + "            genModel=\"";
+	protected final String TEXT_25 = "\"/>";
+	protected final String TEXT_26 = NL + "   </extension>";
+	protected final String TEXT_27 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.content_parser\">";
+	protected final String TEXT_28 = NL + "      <parser" + NL + "            contentTypeIdentifier=\"";
+	protected final String TEXT_29 = "\"" + NL + "            class=\"";
+	protected final String TEXT_30 = "\"/>" + NL + "   </extension>" + NL + "" + NL
+			+ "   <extension point=\"org.eclipse.core.contenttype.contentTypes\">";
+	protected final String TEXT_31 = NL + "      <content-type" + NL + "            base-type=\"";
+	protected final String TEXT_32 = "\"" + NL + "            file-extensions=\"";
+	protected final String TEXT_33 = "\"" + NL + "            id=\"";
+	protected final String TEXT_34 = "\"" + NL + "            name=\"%_UI_";
+	protected final String TEXT_35 = "_content_type\"" + NL + "            priority=\"normal\">" + NL
+			+ "         <describer class=\"org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer\">";
+	protected final String TEXT_36 = NL + "            <parameter name=\"namespace\" value=\"";
+	protected final String TEXT_37 = NL + "            <parameter name=\"kind\" value=\"xmi\"/>";
+	protected final String TEXT_38 = NL + "         </describer>" + NL + "      </content-type>" + NL
+			+ "   </extension>";
+	protected final String TEXT_39 = NL + NL + "   <extension point=\"org.eclipse.emf.ecore.extension_parser\">";
+	protected final String TEXT_40 = NL + "      <parser" + NL + "            type=\"";
+	protected final String TEXT_41 = NL + NL + "</plugin>" + NL;
+	protected final String TEXT_42 = NL;
+
+	public PluginXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_42);
+		stringBuffer.append(TEXT_42);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getModelProjectDirectory() + "/plugin.xml";
+		overwrite = true;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String key = genModel.getPluginKey();
+		boolean hasKey = key != null && !key.equals("");
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getModelPluginID());
+			stringBuffer.append(TEXT_5);
+			if (genModel.hasModelPluginClass()) {
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genModel.getQualifiedModelPluginClassName());
+				stringBuffer.append(TEXT_7);
+			} else {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			for (String pluginID : genModel.getModelRequiredPlugins()) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(pluginID);
+				stringBuffer.append(TEXT_11);
+				if (!pluginID.startsWith("org.eclipse.core.runtime")) {
+					stringBuffer.append(TEXT_12);
+				}
+				stringBuffer.append(TEXT_13);
+			}
+			stringBuffer.append(TEXT_14);
+			if (genModel.isRuntimeJar()) {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genModel.getModelPluginID());
+				stringBuffer.append(TEXT_16);
+			} else {
+				stringBuffer.append(TEXT_17);
+			}
+			stringBuffer.append(TEXT_18);
+		}
+		for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+			stringBuffer.append(TEXT_19);
+			if (hasKey) {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(key);
+				stringBuffer.append(TEXT_21);
+			}
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getNSURI());
+			stringBuffer.append(TEXT_11);
+			if (genModel.hasLocalGenModel()) {
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(genModel.getRelativeGenModelLocation());
+				stringBuffer.append(TEXT_25);
+			} else {
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+				stringBuffer.append(TEXT_25);
+			}
+			stringBuffer.append(TEXT_26);
+			if (genPackage.isContentType()) {
+				stringBuffer.append(TEXT_27);
+				if (hasKey) {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_21);
+				}
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genPackage.getContentTypeIdentifier());
+				stringBuffer.append(TEXT_29);
+				stringBuffer.append(genPackage.getQualifiedEffectiveResourceFactoryClassName());
+				stringBuffer.append(TEXT_30);
+				if (hasKey) {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_21);
+				}
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(
+						genPackage.isXMIResource() ? "org.eclipse.emf.ecore.xmi" : "org.eclipse.core.runtime.xml");
+				stringBuffer.append(TEXT_32);
+				stringBuffer.append(genPackage.getFileExtensions());
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genPackage.getContentTypeIdentifier());
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genPackage.getPrefix());
+				stringBuffer.append(TEXT_35);
+				if (genPackage.hasTargetNamespace()) {
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genPackage.getNSURI());
+					stringBuffer.append(TEXT_25);
+				}
+				if (genPackage.isXMIResource()) {
+					stringBuffer.append(TEXT_37);
+				}
+				stringBuffer.append(TEXT_38);
+			} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {
+				stringBuffer.append(TEXT_39);
+				if (hasKey) {
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(key);
+					stringBuffer.append(TEXT_21);
+				}
+				for (String fileExtension : genPackage.getFileExtensionList()) {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(fileExtension);
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
+					stringBuffer.append(TEXT_25);
+				}
+				stringBuffer.append(TEXT_26);
+			}
+		}
+		stringBuffer.append(TEXT_41);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT)
+				&& (genModel.hasPluginSupport() && !genModel.sameModelEditProject()
+						&& !genModel.sameModelEditorProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ResourceClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ResourceClass.java
new file mode 100644
index 0000000..342b6e7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ResourceClass.java
@@ -0,0 +1,852 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ResourceClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized ResourceClass create(String lineSeparator) {
+		nl = lineSeparator;
+		ResourceClass result = new ResourceClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Resource </b> associated with the package." + NL + " * <!-- end-user-doc -->" + NL
+			+ " * @see ";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "public class ";
+	protected final String TEXT_9 = " extends ";
+	protected final String TEXT_10 = NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * Creates an instance of the resource." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param uri the URI of the new resource." + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_16 = "(URI uri)" + NL + "\t{" + NL + "\t\tsuper(uri);";
+	protected final String TEXT_17 = NL + "\t}" + NL;
+	protected final String TEXT_18 = NL + "\t/**" + NL
+			+ "\t * A load option that turns of the use of the generate data converters." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final String OPTION_USE_DATA_CONVERTER = \"USE_DATA_CONVERTER\";" + NL + "" + NL
+			+ "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated"
+			+ NL + "\t */";
+	protected final String TEXT_19 = NL + "\t@Override";
+	protected final String TEXT_20 = NL + "\tpublic void doLoad(InputStream inputStream, ";
+	protected final String TEXT_21 = " options) throws IOException" + NL + "\t{" + NL
+			+ "\t\tif (options != null && Boolean.TRUE.equals(options.get(OPTION_USE_DATA_CONVERTER)))" + NL + "\t\t{"
+			+ NL + "\t\t  getContents().add" + NL + "\t\t\t (load" + NL + "\t\t\t\t (new InputSource(inputStream), "
+			+ NL + "\t\t\t\t  (";
+	protected final String TEXT_22 = ")options.get(XMLResource.OPTION_PARSER_FEATURES), " + NL + "\t\t\t\t  (";
+	protected final String TEXT_23 = ")options.get(XMLResource.OPTION_PARSER_PROPERTIES), " + NL
+			+ "\t\t\t\t  Boolean.TRUE.equals(options.get(XMLResource.OPTION_USE_LEXICAL_HANDLER))).eContainer());" + NL
+			+ "\t\t}" + NL + "\t\telse" + NL + "\t\t{  " + NL + "\t\t\tsuper.doLoad(inputStream, options);" + NL
+			+ "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_24 = NL + "\tpublic void doLoad(InputSource inputSource, ";
+	protected final String TEXT_25 = " options) throws IOException" + NL + "\t{" + NL
+			+ "\t\tif (options != null && Boolean.TRUE.equals(options.get(OPTION_USE_DATA_CONVERTER)))" + NL + "\t\t{"
+			+ NL + "\t\t  getContents().add" + NL + "\t\t\t (load" + NL + "\t\t\t\t (inputSource," + NL + "\t\t\t\t  (";
+	protected final String TEXT_26 = ")options.get(XMLResource.OPTION_PARSER_PROPERTIES), " + NL
+			+ "\t\t\t\t  Boolean.TRUE.equals(options.get(XMLResource.OPTION_USE_LEXICAL_HANDLER))).eContainer());" + NL
+			+ "\t\t}" + NL + "\t\telse" + NL + "\t\t{  " + NL + "\t\t\tsuper.doLoad(inputSource, options);" + NL
+			+ "\t\t}" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected static final XMLParserPool parserPool = new XMLParserPoolImpl();" + NL + "" + NL + "\t/**"
+			+ NL + "\t * Loads an instance from the input." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @param inputSource the input from which to load." + NL
+			+ "\t * @param features a map of the parser features and their values." + NL
+			+ "\t * @param properties a map of a parser properties and their values." + NL
+			+ "\t * @param useLexicalHandler whether a lexical handler should be used during loading." + NL
+			+ "\t * @return the root object; for the case of a document root, the child of that document root is return."
+			+ NL + "\t * @throws ParserConfigurationException" + NL + "\t * @throws SAXException" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tpublic static EObject load(InputSource inputSource, ";
+	protected final String TEXT_27 = " features, ";
+	protected final String TEXT_28 = " properties, boolean useLexicalHandler) throws IOException" + NL + "\t{" + NL
+			+ "\t\t";
+	protected final String TEXT_29 = " requiredFeatures = new ";
+	protected final String TEXT_30 = "();" + NL
+			+ "\t\trequiredFeatures.put(\"http://xml.org/sax/features/namespaces\", Boolean.TRUE); " + NL
+			+ "\t\tif (features != null)" + NL + "\t\t{" + NL + "\t\t\trequiredFeatures.putAll(features);" + NL
+			+ "\t\t}" + NL + "\t\t" + NL + "\t\tif (properties == null)" + NL + "\t\t{" + NL
+			+ "\t\t\tproperties = Collections.";
+	protected final String TEXT_31 = "emptyMap()";
+	protected final String TEXT_32 = "EMPTY_MAP";
+	protected final String TEXT_33 = ";" + NL + "\t\t}" + NL + "\t\t" + NL + "\t\tSAXParser saxParser = null;" + NL
+			+ "\t\ttry" + NL + "\t\t{" + NL
+			+ "\t\t\tsaxParser = parserPool.get(requiredFeatures, properties, useLexicalHandler);" + NL
+			+ "\t\t\tfinal FrameFactory.DocumentRootStackFrame documentRoot = FrameFactory.INSTANCE.pushDocumentRoot(null, null);"
+			+ NL + "\t\t\tXMLTypeResourceImpl.Handler handler = new XMLTypeResourceImpl.Handler(documentRoot);" + NL
+			+ "\t\t\tsaxParser.parse(inputSource, handler);";
+	protected final String TEXT_34 = NL
+			+ "\t\t\treturn (EObject)((EObject)FrameFactory.INSTANCE.popDocumentRoot(documentRoot)).eContents().get(0);";
+	protected final String TEXT_35 = NL
+			+ "\t\t\treturn FrameFactory.INSTANCE.popDocumentRoot(documentRoot).eContents().get(0);";
+	protected final String TEXT_36 = NL + "\t\t}" + NL + "\t\tcatch (Exception exception)" + NL + "\t\t{" + NL
+			+ "\t\t\tthrow new IOWrappedException(exception);" + NL + "\t\t}" + NL + "\t\tfinally" + NL + "\t\t{" + NL
+			+ "\t\t\tparserPool.release(saxParser, requiredFeatures, properties, useLexicalHandler);" + NL + "\t\t}"
+			+ NL + "\t}" + NL;
+	protected final String TEXT_37 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic final static class FrameFactory" + NL + "\t{" + NL + "\t\t/**" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic static final FrameFactory INSTANCE = new FrameFactory();" + NL + "\t";
+	protected final String TEXT_38 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
+	protected final String TEXT_39 = "StackFrame ";
+	protected final String TEXT_40 = " ";
+	protected final String TEXT_41 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
+	protected final String TEXT_42 = "StackFrame push";
+	protected final String TEXT_43 = "(";
+	protected final String TEXT_44 = " previous, Attributes attributes)" + NL + "\t\t{" + NL + "\t\t\t ";
+	protected final String TEXT_45 = "StackFrame result";
+	protected final String TEXT_46 = " = ";
+	protected final String TEXT_47 = " == null ? new ";
+	protected final String TEXT_48 = "StackFrame() : ";
+	protected final String TEXT_49 = ";" + NL + "\t\t\t ";
+	protected final String TEXT_50 = " = null;" + NL + "\t\t\t result";
+	protected final String TEXT_51 = ".pushOnto(previous);" + NL + "\t\t\t result";
+	protected final String TEXT_52 = ".handleAttributes(attributes);" + NL + "\t\t\t return result";
+	protected final String TEXT_53 = ";" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic ";
+	protected final String TEXT_54 = " pop";
+	protected final String TEXT_55 = ")" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_56 = " result";
+	protected final String TEXT_57 = "Value = ";
+	protected final String TEXT_58 = ".pop";
+	protected final String TEXT_59 = "();" + NL + "\t\t\tthis.";
+	protected final String TEXT_60 = ";" + NL + "\t\t\treturn result";
+	protected final String TEXT_61 = "Value;" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
+			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
+			+ "\t\t */" + NL + "\t\tpublic static class ";
+	protected final String TEXT_62 = "StackFrame extends ";
+	protected final String TEXT_63 = NL + "\t\t{" + NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
+			+ "\t\t\tprotected ";
+	protected final String TEXT_64 = " the";
+	protected final String TEXT_65 = ";" + NL + "\t\t";
+	protected final String TEXT_66 = NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
+			+ "\t\t\tprotected ";
+	protected final String TEXT_67 = ".FrameFactory.";
+	protected final String TEXT_68 = NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
+			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */";
+	protected final String TEXT_69 = NL + "\t\t\t@Override";
+	protected final String TEXT_70 = NL + "\t\t\tpublic void handleAttributes(Attributes attributes)" + NL + "\t\t\t{";
+	protected final String TEXT_71 = NL + "\t\t\t\tString theValue = attributes.getValue(";
+	protected final String TEXT_72 = ", \"";
+	protected final String TEXT_73 = "\");";
+	protected final String TEXT_74 = NL + "\t\t\t\ttheValue = attributes.getValue(";
+	protected final String TEXT_75 = NL + "\t\t\t\tif (theValue != null)" + NL + "\t\t\t\t{";
+	protected final String TEXT_76 = NL + "\t\t\t\t\tthe";
+	protected final String TEXT_77 = ".set";
+	protected final String TEXT_78 = ".create";
+	protected final String TEXT_79 = "(theValue));";
+	protected final String TEXT_80 = "((";
+	protected final String TEXT_81 = ")";
+	protected final String TEXT_82 = ".createFromString(";
+	protected final String TEXT_83 = ", theValue));";
+	protected final String TEXT_84 = NL + "\t\t\t\t}";
+	protected final String TEXT_85 = NL + "\t\t\t\t// There are attributes to handle.";
+	protected final String TEXT_86 = NL + "\t\t\t}" + NL + "\t\t" + NL + "\t\t\t/**" + NL
+			+ "\t\t\t * <!-- begin-user-doc -->" + NL + "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated"
+			+ NL + "\t\t\t */";
+	protected final String TEXT_87 = NL + "\t\t\tpublic ";
+	protected final String TEXT_88 = " startElement(String namespace, String localName, String qName, Attributes attributes) throws SAXException"
+			+ NL + "\t\t\t{";
+	protected final String TEXT_89 = NL + "\t\t\t\t";
+	protected final String TEXT_90 = "else ";
+	protected final String TEXT_91 = "if (\"";
+	protected final String TEXT_92 = "\".equals(localName) && ";
+	protected final String TEXT_93 = ".equals(namespace))" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\treturn ";
+	protected final String TEXT_94 = ".FrameFactory.INSTANCE.push";
+	protected final String TEXT_95 = "(this, attributes);" + NL + "\t\t\t\t}";
+	protected final String TEXT_96 = NL + "\t\t\t\treturn super.startElement(namespace, localName, qName, attributes);";
+	protected final String TEXT_97 = NL + "\t\t\t\telse" + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\treturn super.startElement(namespace, localName, qName, attributes);" + NL + "\t\t\t\t}";
+	protected final String TEXT_98 = NL + "\t\t\t}" + NL + "" + NL + "\t\t\t/**" + NL
+			+ "\t\t\t * <!-- begin-user-doc -->" + NL + "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated"
+			+ NL + "\t\t\t */";
+	protected final String TEXT_99 = NL + "\t\t\tpublic void endElement(";
+	protected final String TEXT_100 = " child) throws SAXException" + NL + "\t\t\t{";
+	protected final String TEXT_101 = "if (child == ";
+	protected final String TEXT_102 = ")" + NL + "\t\t\t\t{";
+	protected final String TEXT_103 = ".";
+	protected final String TEXT_104 = "().add(";
+	protected final String TEXT_105 = ".FrameFactory.INSTANCE.pop";
+	protected final String TEXT_106 = "));";
+	protected final String TEXT_107 = NL + "\t\t\t\t\t";
+	protected final String TEXT_108 = " = null;" + NL + "\t\t\t\t}";
+	protected final String TEXT_109 = NL + "\t\t\t\tsuper.endElement(child);";
+	protected final String TEXT_110 = NL + "\t\t\t\telse" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tsuper.endElement(child);"
+			+ NL + "\t\t\t\t}";
+	protected final String TEXT_111 = NL + "\t\t\tpublic void create()" + NL + "\t\t\t{" + NL + "\t\t\t\tthe";
+	protected final String TEXT_112 = "();" + NL + "\t\t\t}" + NL + "\t\t" + NL + "\t\t\t/**" + NL
+			+ "\t\t\t * <!-- begin-user-doc -->" + NL + "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated"
+			+ NL + "\t\t\t */" + NL + "\t\t\tprotected ";
+	protected final String TEXT_113 = "()" + NL + "\t\t\t{" + NL + "\t\t\t\tpop();" + NL + "\t\t\t\t";
+	protected final String TEXT_114 = "Value = the";
+	protected final String TEXT_115 = ";" + NL + "\t\t\t\tthe";
+	protected final String TEXT_116 = " = null;" + NL + "\t\t\t\treturn result";
+	protected final String TEXT_117 = "Value;" + NL + "\t\t\t}" + NL + "\t\t" + NL + "\t\t}" + NL;
+	protected final String TEXT_118 = " push";
+	protected final String TEXT_119 = "() : ";
+	protected final String TEXT_120 = ")" + NL + "\t\t{";
+	protected final String TEXT_121 = NL + "\t\t\t";
+	protected final String TEXT_122 = ".popValue());";
+	protected final String TEXT_123 = "Value = ((";
+	protected final String TEXT_124 = ", ";
+	protected final String TEXT_125 = ".popValue())).";
+	protected final String TEXT_126 = "();";
+	protected final String TEXT_127 = "Value = (";
+	protected final String TEXT_128 = NL + "\t\t\tthis.";
+	protected final String TEXT_129 = "Value;" + NL + "\t\t}" + NL;
+	protected final String TEXT_130 = NL + "} //";
+	protected final String TEXT_131 = NL;
+
+	public ResourceClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_131);
+		stringBuffer.append(TEXT_131);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getUtilitiesPackageName();
+		className = genPackage.getResourceClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2006 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		ExtendedMetaData extendedMetaData = genModel.getExtendedMetaData();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getUtilitiesPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.getImportedName("org.eclipse.emf.common.util.URI");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genPackage.getResourceClassName());
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getImportedResourceBaseClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genPackage.getResourceClassName());
+		stringBuffer.append(TEXT_16);
+		if (genPackage.getResource() == GenResourceKind.XML_LITERAL) { // Do nothing
+		}
+		stringBuffer.append(TEXT_17);
+		if (genPackage.isDataTypeConverters() && (genPackage.hasDocumentRoot()
+				|| org.eclipse.emf.ecore.xml.type.XMLTypePackage.eNS_URI.equals(genPackage.getNSURI()))) {
+			boolean isXMLTypePackage = org.eclipse.emf.ecore.xml.type.XMLTypePackage.eNS_URI
+					.equals(genPackage.getNSURI());
+			final String _Map = genModel.useGenerics() ? "Map<?, ?>" : "Map";
+			final String _MapStringBoolean = genModel.useGenerics() ? "Map<String, Boolean>" : "Map";
+			final String _MapStringWildcard = genModel.useGenerics() ? "Map<String, ?>" : "Map";
+			if (!isXMLTypePackage) {
+				genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource");
+				genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLParserPool");
+				genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl");
+				genModel.getImportedName("java.io.InputStream");
+				genModel.getImportedName("java.io.IOException");
+				genModel.getImportedName("org.eclipse.emf.ecore.EObject");
+				genModel.getImportedName("java.util.Collections");
+				genModel.getImportedName("java.util.HashMap");
+				genModel.getImportedName("java.util.Map");
+				genModel.getImportedName("org.xml.sax.InputSource");
+				genModel.getImportedName("javax.xml.parsers.SAXParser");
+			}
+			genModel.getImportedName("org.xml.sax.Attributes");
+			genModel.getImportedName("org.xml.sax.SAXException");
+			String _StackFrame = genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeResourceImpl")
+					+ ".StackFrame";
+			String _DataFrame = genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeResourceImpl")
+					+ ".DataFrame";
+			if (!isXMLTypePackage) {
+				stringBuffer.append(TEXT_18);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_19);
+				}
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(_Map);
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(_MapStringBoolean);
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(_MapStringWildcard);
+				stringBuffer.append(TEXT_23);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_19);
+				}
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(_Map);
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(_MapStringBoolean);
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(_MapStringWildcard);
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(_MapStringBoolean);
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(_MapStringWildcard);
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(_MapStringBoolean);
+				stringBuffer.append(TEXT_29);
+				stringBuffer.append(_MapStringBoolean.replaceAll("Map", "HashMap"));
+				stringBuffer.append(TEXT_30);
+				if (genModel.useGenerics()) {
+					stringBuffer.append(TEXT_31);
+				} else {
+					stringBuffer.append(TEXT_32);
+				}
+				stringBuffer.append(TEXT_33);
+				if (genModel.isSuppressEMFTypes()) {
+					stringBuffer.append(TEXT_34);
+				} else {
+					stringBuffer.append(TEXT_35);
+				}
+				stringBuffer.append(TEXT_36);
+			}
+			stringBuffer.append(TEXT_37);
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				stringBuffer.append(TEXT_38);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_3);
+			}
+			for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+				stringBuffer.append(TEXT_38);
+				stringBuffer.append(_DataFrame);
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_3);
+			}
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				List<EStructuralFeature> attributes = extendedMetaData.getAllAttributes(genClass.getEcoreClass());
+				List<EStructuralFeature> elements = extendedMetaData.getAllElements(genClass.getEcoreClass());
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(_StackFrame);
+				stringBuffer.append(TEXT_44);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_48);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_50);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_55);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(TEXT_56);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_57);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_58);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_59);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_60);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_61);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(_StackFrame);
+				stringBuffer.append(TEXT_63);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_65);
+				for (GenFeature genFeature : genClass.getAllGenFeatures()) {
+					String name = extendedMetaData.getName(genFeature.getEcoreFeature());
+					if ((elements.contains(genFeature.getEcoreFeature())
+							|| attributes.contains(genFeature.getEcoreFeature())) && name.indexOf(":") == -1) {
+						if (genFeature.isReferenceType()) {
+							stringBuffer.append(TEXT_66);
+							stringBuffer.append(
+									genFeature.getTypeGenClass().getGenPackage().getImportedResourceClassName());
+							stringBuffer.append(TEXT_67);
+							stringBuffer.append(genFeature.getTypeGenClass().getName());
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_3);
+						} else {
+							stringBuffer.append(TEXT_66);
+							stringBuffer.append(_DataFrame);
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_65);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_68);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_69);
+				}
+				stringBuffer.append(TEXT_70);
+				int count = 0;
+				for (GenFeature genFeature : genClass.getAllGenFeatures()) {
+					String name = extendedMetaData.getName(genFeature.getEcoreFeature());
+					if (attributes.contains(genFeature.getEcoreFeature()) && !genFeature.isDerived()
+							&& name.indexOf(":") == -1) {
+						String namespace = Literals
+								.toStringLiteral(extendedMetaData.getNamespace(genFeature.getEcoreFeature()), genModel);
+						if ("null".equals(namespace))
+							namespace = "\"\"";
+						if (!genFeature.isReferenceType()) {
+							GenClassifier genClassifier = genFeature.getTypeGenClassifier();
+							if (count++ == 0) {
+								stringBuffer.append(TEXT_71);
+								stringBuffer.append(namespace);
+								stringBuffer.append(TEXT_72);
+								stringBuffer.append(name);
+								stringBuffer.append(TEXT_73);
+							} else {
+								stringBuffer.append(TEXT_74);
+								stringBuffer.append(namespace);
+								stringBuffer.append(TEXT_72);
+								stringBuffer.append(name);
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_75);
+							if (genClassifier.getGenPackage().isDataTypeConverters()) {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genClass.getName());
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(genFeature.getAccessorName());
+								stringBuffer.append(TEXT_43);
+								stringBuffer
+										.append(genClassifier.getGenPackage().getQualifiedFactoryInstanceAccessor());
+								stringBuffer.append(TEXT_78);
+								stringBuffer.append(genClassifier.getName());
+								stringBuffer.append(TEXT_79);
+							} else {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genClass.getName());
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(genFeature.getAccessorName());
+								stringBuffer.append(TEXT_80);
+								stringBuffer.append(genFeature.getImportedType(null));
+								stringBuffer.append(TEXT_81);
+								stringBuffer
+										.append(genClassifier.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+								stringBuffer.append(TEXT_82);
+								stringBuffer.append(genClassifier.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_83);
+							}
+							stringBuffer.append(TEXT_84);
+						}
+					}
+				}
+				if (count == 0) {
+					stringBuffer.append(TEXT_85);
+				}
+				stringBuffer.append(TEXT_86);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_69);
+				}
+				stringBuffer.append(TEXT_87);
+				stringBuffer.append(_StackFrame);
+				stringBuffer.append(TEXT_88);
+				count = 0;
+				for (GenFeature genFeature : genClass.getAllGenFeatures()) {
+					String name = extendedMetaData.getName(genFeature.getEcoreFeature());
+					if (elements.contains(genFeature.getEcoreFeature()) && name.indexOf(":") == -1) {
+						String namespace = Literals
+								.toStringLiteral(extendedMetaData.getNamespace(genFeature.getEcoreFeature()), genModel);
+						if ("null".equals(namespace))
+							namespace = "\"\"";
+						stringBuffer.append(TEXT_89);
+						if (count++ != 0) {
+							stringBuffer.append(TEXT_90);
+						}
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(name);
+						stringBuffer.append(TEXT_92);
+						stringBuffer.append(namespace);
+						stringBuffer.append(TEXT_93);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(
+								genFeature.getTypeGenClassifier().getGenPackage().getImportedResourceClassName());
+						stringBuffer.append(TEXT_94);
+						stringBuffer.append(genFeature.getTypeGenClassifier().getName());
+						stringBuffer.append(TEXT_95);
+					}
+				}
+				if (count == 0) {
+					stringBuffer.append(TEXT_96);
+				} else {
+					stringBuffer.append(TEXT_97);
+				}
+				stringBuffer.append(TEXT_98);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_69);
+				}
+				stringBuffer.append(TEXT_99);
+				stringBuffer.append(_StackFrame);
+				stringBuffer.append(TEXT_100);
+				count = 0;
+				for (GenFeature genFeature : genClass.getAllGenFeatures()) {
+					String name = extendedMetaData.getName(genFeature.getEcoreFeature());
+					if (elements.contains(genFeature.getEcoreFeature()) && name.indexOf(":") == -1) {
+						stringBuffer.append(TEXT_89);
+						if (count++ != 0) {
+							stringBuffer.append(TEXT_90);
+						}
+						stringBuffer.append(TEXT_101);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_102);
+						if (genFeature.isListType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genClass.getName());
+							stringBuffer.append(TEXT_103);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_104);
+							stringBuffer.append(
+									genFeature.getTypeGenClassifier().getGenPackage().getImportedResourceClassName());
+							stringBuffer.append(TEXT_105);
+							stringBuffer.append(genFeature.getTypeGenClassifier().getName());
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_106);
+						} else {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genClass.getName());
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genFeature.getAccessorName());
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(
+									genFeature.getTypeGenClassifier().getGenPackage().getImportedResourceClassName());
+							stringBuffer.append(TEXT_105);
+							stringBuffer.append(genFeature.getTypeGenClassifier().getName());
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_106);
+						}
+						stringBuffer.append(TEXT_107);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_108);
+					}
+				}
+				if (count == 0) {
+					stringBuffer.append(TEXT_109);
+				} else {
+					stringBuffer.append(TEXT_110);
+				}
+				stringBuffer.append(TEXT_98);
+				if (genModel.useClassOverrideAnnotation()) {
+					stringBuffer.append(TEXT_69);
+				}
+				stringBuffer.append(TEXT_111);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genPackage.getQualifiedFactoryInstanceAccessor());
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_112);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_113);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(TEXT_56);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_114);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_115);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_116);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_117);
+			}
+			for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(_DataFrame);
+				stringBuffer.append(TEXT_118);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(_StackFrame);
+				stringBuffer.append(TEXT_44);
+				stringBuffer.append(_DataFrame);
+				stringBuffer.append(TEXT_56);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(_DataFrame);
+				stringBuffer.append(TEXT_119);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_50);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(_DataFrame);
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_120);
+				if (genDataType.getGenPackage().isDataTypeConverters()) {
+					stringBuffer.append(TEXT_121);
+					stringBuffer.append(genDataType.getImportedParameterizedInstanceClassName());
+					stringBuffer.append(TEXT_56);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genDataType.getGenPackage().getQualifiedFactoryInstanceAccessor());
+					stringBuffer.append(TEXT_78);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genDataType.getSafeUncapName());
+					stringBuffer.append(TEXT_122);
+				} else if (genDataType.isPrimitiveType()
+						&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+					stringBuffer.append(TEXT_121);
+					stringBuffer.append(genDataType.getImportedInstanceClassName());
+					stringBuffer.append(TEXT_56);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_123);
+					stringBuffer.append(genDataType.getObjectInstanceClassName());
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+					stringBuffer.append(TEXT_82);
+					stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+					stringBuffer.append(TEXT_124);
+					stringBuffer.append(genDataType.getSafeUncapName());
+					stringBuffer.append(TEXT_125);
+					stringBuffer.append(genDataType.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_126);
+				} else {
+					stringBuffer.append(TEXT_121);
+					stringBuffer.append(genDataType.getImportedInstanceClassName());
+					stringBuffer.append(TEXT_56);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_127);
+					stringBuffer.append(genDataType.getObjectInstanceClassName());
+					stringBuffer.append(TEXT_81);
+					stringBuffer.append(genDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+					stringBuffer.append(TEXT_82);
+					stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+					stringBuffer.append(TEXT_124);
+					stringBuffer.append(genDataType.getSafeUncapName());
+					stringBuffer.append(TEXT_122);
+				}
+				stringBuffer.append(TEXT_128);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genDataType.getSafeUncapName());
+				stringBuffer.append(TEXT_60);
+				stringBuffer.append(genDataType.getName());
+				stringBuffer.append(TEXT_129);
+			}
+			stringBuffer.append(TEXT_17);
+		}
+		stringBuffer.append(TEXT_130);
+		stringBuffer.append(genPackage.getResourceClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.getResource() != GenResourceKind.NONE_LITERAL);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ResourceFactoryClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ResourceFactoryClass.java
new file mode 100644
index 0000000..4d23ec9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ResourceFactoryClass.java
@@ -0,0 +1,303 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ResourceFactoryClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized ResourceFactoryClass create(String lineSeparator) {
+		nl = lineSeparator;
+		ResourceFactoryClass result = new ResourceFactoryClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Resource Factory</b> associated with the package." + NL + " * <!-- end-user-doc -->" + NL
+			+ " * @see ";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "public class ";
+	protected final String TEXT_9 = " extends ";
+	protected final String TEXT_10 = NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_16 = " extendedMetaData;" + NL;
+	protected final String TEXT_17 = " xmlMap = new ";
+	protected final String TEXT_18 = "();" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * Creates an instance of the resource factory." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_20 = "()" + NL + "\t{" + NL + "\t\tsuper();";
+	protected final String TEXT_21 = NL + "\t\textendedMetaData = new ";
+	protected final String TEXT_22 = "(new ";
+	protected final String TEXT_23 = "(";
+	protected final String TEXT_24 = ".Registry.INSTANCE));" + NL + "\t\textendedMetaData.putPackage(null, ";
+	protected final String TEXT_25 = ".eINSTANCE);";
+	protected final String TEXT_26 = NL + "\t\txmlMap.setNoNamespacePackage(";
+	protected final String TEXT_27 = NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates an instance of the resource." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_28 = NL + "\t@Override";
+	protected final String TEXT_29 = NL + "\tpublic Resource createResource(URI uri)" + NL + "\t{";
+	protected final String TEXT_30 = NL + "\t}" + NL + "" + NL + "} //";
+	protected final String TEXT_31 = NL;
+
+	public ResourceFactoryClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(TEXT_31);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getUtilitiesPackageName();
+		className = genPackage.getResourceFactoryClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2006 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getUtilitiesPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.getImportedName("org.eclipse.emf.common.util.URI");
+		genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getQualifiedResourceClassName());
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genPackage.getResourceFactoryClassName());
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getImportedResourceFactoryBaseClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		if (genPackage.hasExtendedMetaData() && !genPackage.hasTargetNamespace()) {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
+			stringBuffer.append(TEXT_16);
+		} else if (genPackage.hasXMLMap()) {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource$XMLMap"));
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.XMLMapImpl"));
+			stringBuffer.append(TEXT_18);
+		}
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genPackage.getResourceFactoryClassName());
+		stringBuffer.append(TEXT_20);
+		if (genPackage.hasExtendedMetaData() && !genPackage.hasTargetNamespace()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.BasicExtendedMetaData"));
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageRegistryImpl"));
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_25);
+		} else if (genPackage.hasXMLMap() && !genPackage.hasTargetNamespace()) {
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_25);
+		}
+		stringBuffer.append(TEXT_27);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_28);
+		}
+		stringBuffer.append(TEXT_29);
+		stringBuffer.append(TEXT_14);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.ResourceFactoryClass.ResourceFactoryClass.createResource.override" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0uqqgWJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//ResourceFactoryClass/createResource.override.javajetinc
+		stringBuffer.append(TEXT_30);
+		stringBuffer.append(genPackage.getResourceFactoryClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.getResource() != GenResourceKind.NONE_LITERAL);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/SwitchClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/SwitchClass.java
new file mode 100644
index 0000000..b6aeb1b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/SwitchClass.java
@@ -0,0 +1,510 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class SwitchClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized SwitchClass create(String lineSeparator) {
+		nl = lineSeparator;
+		SwitchClass result = new SwitchClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Switch</b> for the model's inheritance hierarchy." + NL
+			+ " * It supports the call {@link #doSwitch(EObject) doSwitch(object)}" + NL
+			+ " * to invoke the <code>caseXXX</code> method for each class of the model," + NL
+			+ " * starting with the actual class of the object" + NL + " * and proceeding up the inheritance hierarchy"
+			+ NL + " * until a non-null result is returned," + NL + " * which is the result of the switch." + NL
+			+ " * <!-- end-user-doc -->" + NL + " * @see ";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "\t@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = " extends Switch";
+	protected final String TEXT_11 = NL + "{";
+	protected final String TEXT_12 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_13 = " copyright = ";
+	protected final String TEXT_14 = ";";
+	protected final String TEXT_15 = NL;
+	protected final String TEXT_16 = NL + "\t/**" + NL + "\t * The cached model package" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected static ";
+	protected final String TEXT_17 = " modelPackage;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Creates an instance of the switch." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_18 = "()" + NL + "\t{" + NL + "\t\tif (modelPackage == null)" + NL + "\t\t{" + NL
+			+ "\t\t\tmodelPackage = ";
+	protected final String TEXT_19 = ".eINSTANCE;" + NL + "\t\t}" + NL + "\t}" + NL;
+	protected final String TEXT_20 = NL + "\t/**" + NL + "\t * Checks whether this is a switch for the given package."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param ePackage the package in question." + NL
+			+ "\t * @return whether this is a switch for the given package." + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\t@Override" + NL + "\tprotected boolean isSwitchFor(EPackage ePackage)" + NL + "\t{" + NL
+			+ "\t\treturn ePackage == modelPackage;" + NL + "\t}";
+	protected final String TEXT_21 = NL + "\t/**" + NL
+			+ "\t * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the first non-null result returned by a <code>caseXXX</code> call." + NL + "\t * @generated"
+			+ NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_22 = " doSwitch(EObject theEObject)" + NL + "\t{" + NL
+			+ "\t\treturn doSwitch(theEObject.eClass(), theEObject);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the first non-null result returned by a <code>caseXXX</code> call." + NL + "\t * @generated"
+			+ NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_23 = " doSwitch(EClass theEClass, EObject theEObject)" + NL + "\t{" + NL
+			+ "\t\tif (theEClass.eContainer() == modelPackage)" + NL + "\t\t{" + NL
+			+ "\t\t\treturn doSwitch(theEClass.getClassifierID(), theEObject);" + NL + "\t\t}";
+	protected final String TEXT_24 = NL + "\t\telse" + NL + "\t\t{";
+	protected final String TEXT_25 = NL + "\t\t";
+	protected final String TEXT_26 = "<";
+	protected final String TEXT_27 = ">";
+	protected final String TEXT_28 = " eSuperTypes = theEClass.getESuperTypes();" + NL + "\t\t";
+	protected final String TEXT_29 = "return" + NL + "\t\t";
+	protected final String TEXT_30 = "\teSuperTypes.isEmpty() ?" + NL + "\t\t";
+	protected final String TEXT_31 = "\t\tdefaultCase(theEObject) :" + NL + "\t\t";
+	protected final String TEXT_32 = "\t\tdoSwitch(";
+	protected final String TEXT_33 = "(EClass)";
+	protected final String TEXT_34 = "eSuperTypes.get(0), theEObject);";
+	protected final String TEXT_35 = NL + "\t\t}";
+	protected final String TEXT_36 = NL + "\t}";
+	protected final String TEXT_37 = NL + NL + "\t/**" + NL
+			+ "\t * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return the first non-null result returned by a <code>caseXXX</code> call." + NL + "\t * @generated"
+			+ NL + "\t */";
+	protected final String TEXT_38 = NL + "\t@Override";
+	protected final String TEXT_39 = NL + "\tprotected ";
+	protected final String TEXT_40 = " doSwitch(int classifierID, EObject theEObject)" + NL + "\t{" + NL
+			+ "\t\tswitch (classifierID)" + NL + "\t\t{";
+	protected final String TEXT_41 = NL + "\t\t\tcase ";
+	protected final String TEXT_42 = ".";
+	protected final String TEXT_43 = ":" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_44 = "@SuppressWarnings(\"unchecked\") ";
+	protected final String TEXT_45 = " ";
+	protected final String TEXT_46 = " = (";
+	protected final String TEXT_47 = ")theEObject;" + NL + "\t\t\t\t";
+	protected final String TEXT_48 = " = case";
+	protected final String TEXT_49 = "(";
+	protected final String TEXT_50 = ");";
+	protected final String TEXT_51 = NL + "\t\t\t\tif (";
+	protected final String TEXT_52 = " == null) ";
+	protected final String TEXT_53 = " = ";
+	protected final String TEXT_54 = ")";
+	protected final String TEXT_55 = "case";
+	protected final String TEXT_56 = " = defaultCase(theEObject);" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_57 = ";" + NL + "\t\t\t}";
+	protected final String TEXT_58 = NL + "\t\t\tdefault: return defaultCase(theEObject);" + NL + "\t\t}" + NL + "\t}";
+	protected final String TEXT_59 = NL + NL + "\t/**" + NL
+			+ "\t * Returns the result of interpreting the object as an instance of '<em>";
+	protected final String TEXT_60 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * This implementation returns null;" + NL
+			+ "\t * returning a non-null result will terminate the switch." + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param object the target of the switch." + NL
+			+ "\t * @return the result of interpreting the object as an instance of '<em>";
+	protected final String TEXT_61 = "</em>'." + NL
+			+ "\t * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)";
+	protected final String TEXT_62 = NL + "\t * ";
+	protected final String TEXT_63 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_64 = NL + "\t@Deprecated";
+	protected final String TEXT_65 = NL + "\tpublic ";
+	protected final String TEXT_66 = " case";
+	protected final String TEXT_67 = " object)" + NL + "\t{" + NL + "\t\treturn null;" + NL + "\t}";
+	protected final String TEXT_68 = NL + NL + "\t/**" + NL
+			+ "\t * Returns the result of interpreting the object as an instance of '<em>EObject</em>'." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * This implementation returns null;" + NL
+			+ "\t * returning a non-null result will terminate the switch, but this is the last case anyway." + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @param object the target of the switch." + NL
+			+ "\t * @return the result of interpreting the object as an instance of '<em>EObject</em>'." + NL
+			+ "\t * @see #doSwitch(org.eclipse.emf.ecore.EObject)" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_69 = " defaultCase(EObject object)" + NL + "\t{" + NL + "\t\treturn null;" + NL + "\t}"
+			+ NL + "" + NL + "} //";
+	protected final String TEXT_70 = NL;
+
+	public SwitchClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_70);
+		stringBuffer.append(TEXT_70);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getUtilitiesPackageName();
+		className = genPackage.getSwitchClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2006 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		boolean supportsComposition = genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF27_VALUE;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getUtilitiesPackageName());
+		stringBuffer.append(TEXT_3);
+		if (supportsComposition) {
+			genModel.addImport("org.eclipse.emf.ecore.EObject");
+			genModel.addImport("org.eclipse.emf.ecore.EPackage");
+			genModel.addImport("org.eclipse.emf.ecore.util.Switch");
+		} else {
+			genModel.addImport("org.eclipse.emf.ecore.EClass");
+			genModel.addImport("org.eclipse.emf.ecore.EObject");
+		}
+		if (!genPackage.hasJavaLangConflict()
+				&& !genPackage.getUtilitiesPackageName().equals(genPackage.getInterfacePackageName()))
+			genModel.addImport(genPackage.getInterfacePackageName() + ".*");
+
+		String templateParameterName = null;
+		if (genModel.useGenerics()) {
+			Set<String> usedNames = new HashSet<String>();
+			for (GenEnum genEnum : genPackage.getGenEnums()) {
+				usedNames.add(genEnum.getName());
+			}
+			for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {
+				if (!genClass.isDynamic() && !genClass.isExternalInterface()) {
+					usedNames.add(genClass.getName());
+				}
+				for (GenTypeParameter genTypeParameter : genClass.getGenTypeParameters()) {
+					usedNames.add(genTypeParameter.getName());
+				}
+			}
+			templateParameterName = "T";
+			for (int i = 1; usedNames.contains(templateParameterName); ++i) {
+				templateParameterName = "T" + i;
+			}
+		}
+
+		String templateParameters = genModel.useGenerics() ? "<" + templateParameterName + ">" : "";
+		String returnType = genModel.useGenerics() ? templateParameterName
+				: genModel.getImportedName("java.lang.Object");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClasses())) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getSwitchClassName());
+		stringBuffer.append(templateParameters);
+		if (supportsComposition) {
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(templateParameters);
+		}
+		stringBuffer.append(TEXT_11);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_15);
+		}
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(genPackage.getSwitchClassName());
+		stringBuffer.append(TEXT_18);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_19);
+		if (supportsComposition) {
+			stringBuffer.append(TEXT_20);
+		} else {
+			boolean isUnnecessaryElse = genModel.isUnnecessaryElse();
+			String indent = isUnnecessaryElse ? "" : "\t";
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(returnType);
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(returnType);
+			stringBuffer.append(TEXT_23);
+			if (!isUnnecessaryElse) {
+				stringBuffer.append(TEXT_24);
+			}
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(indent);
+			stringBuffer.append(genModel.getImportedName("java.util.List"));
+			if (genModel.useGenerics()) {
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+				stringBuffer.append(TEXT_27);
+			}
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(indent);
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(indent);
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(indent);
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(indent);
+			stringBuffer.append(TEXT_32);
+			if (!genModel.useGenerics()) {
+				stringBuffer.append(TEXT_33);
+			}
+			stringBuffer.append(TEXT_34);
+			if (!isUnnecessaryElse) {
+				stringBuffer.append(TEXT_35);
+			}
+			stringBuffer.append(TEXT_36);
+		}
+		stringBuffer.append(TEXT_37);
+		if (supportsComposition) {
+			stringBuffer.append(TEXT_38);
+		}
+		stringBuffer.append(TEXT_39);
+		stringBuffer.append(returnType);
+		stringBuffer.append(TEXT_40);
+		for (GenClass genClass : genPackage.getGenClasses()) {
+			if (!genClass.isEObject()) {
+				String result = "result".equals(genClass.getSafeUncapName()) ? "theResult" : "result";
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genPackage.getClassifierID(genClass));
+				stringBuffer.append(TEXT_43);
+				if (genClass.isUncheckedCast() || genClass.isMapEntry() && isJDK50) {
+					stringBuffer.append(TEXT_44);
+				}
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(returnType);
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(result);
+				stringBuffer.append(TEXT_48);
+				stringBuffer.append(genPackage.getClassUniqueName(genClass));
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genClass.getSafeUncapName());
+				stringBuffer.append(TEXT_50);
+				for (GenClass baseGenClass : genClass.getSwitchGenClasses()) {
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(result);
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(result);
+					stringBuffer.append(TEXT_53);
+					if (genClass.isRawBaseClass(baseGenClass)) {
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(returnType);
+						stringBuffer.append(TEXT_54);
+					}
+					stringBuffer.append(TEXT_55);
+					stringBuffer.append(genPackage.getClassUniqueName(baseGenClass));
+					stringBuffer.append(TEXT_49);
+					if (genClass.isMapEntry()) {
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(baseGenClass.getImportedInterfaceName());
+						stringBuffer.append(baseGenClass.getInterfaceTypeArguments());
+						stringBuffer.append(TEXT_54);
+					}
+					stringBuffer.append(genClass.getSafeUncapName());
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(result);
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(result);
+				stringBuffer.append(TEXT_56);
+				stringBuffer.append(result);
+				stringBuffer.append(TEXT_57);
+			}
+		}
+		stringBuffer.append(TEXT_58);
+		for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {
+			stringBuffer.append(TEXT_59);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_60);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_61);
+			if (genClass.hasAPITags()) {
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_63);
+			if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_64);
+			}
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(genClass.getTypeParameters());
+			stringBuffer.append(returnType);
+			stringBuffer.append(TEXT_66);
+			stringBuffer.append(genPackage.getClassUniqueName(genClass));
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			stringBuffer.append(genClass.getInterfaceTypeArguments());
+			stringBuffer.append(TEXT_67);
+		}
+		stringBuffer.append(TEXT_68);
+		if (supportsComposition) {
+			stringBuffer.append(TEXT_38);
+		}
+		stringBuffer.append(TEXT_65);
+		stringBuffer.append(returnType);
+		stringBuffer.append(TEXT_69);
+		stringBuffer.append(genPackage.getSwitchClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.isAdapterFactory()
+				&& !genPackage.getGenClasses().isEmpty());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ValidatorClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ValidatorClass.java
new file mode 100644
index 0000000..076cf43
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/ValidatorClass.java
@@ -0,0 +1,1911 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ValidatorClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized ValidatorClass create(String lineSeparator) {
+		nl = lineSeparator;
+		ValidatorClass result = new ValidatorClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * The <b>Validator</b> for the model." + NL + " * <!-- end-user-doc -->" + NL + " * @see ";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_9 = NL + "public class ";
+	protected final String TEXT_10 = " extends ";
+	protected final String TEXT_11 = NL + "{";
+	protected final String TEXT_12 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_13 = " copyright = ";
+	protected final String TEXT_14 = ";";
+	protected final String TEXT_15 = NL;
+	protected final String TEXT_16 = NL + "\t/**" + NL + "\t * The cached model package" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static final ";
+	protected final String TEXT_17 = " INSTANCE = new ";
+	protected final String TEXT_18 = "();" + NL + "" + NL + "\t/**" + NL
+			+ "\t * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @see org.eclipse.emf.common.util.Diagnostic#getSource()" + NL
+			+ "\t * @see org.eclipse.emf.common.util.Diagnostic#getCode()" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static final String DIAGNOSTIC_SOURCE = \"";
+	protected final String TEXT_19 = "\";";
+	protected final String TEXT_20 = NL + "\t/**" + NL
+			+ "\t * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint '";
+	protected final String TEXT_21 = "' of '";
+	protected final String TEXT_22 = "'." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @generated" + NL + "\t */" + NL + "\tpublic static final int ";
+	protected final String TEXT_23 = " = ";
+	protected final String TEXT_24 = NL + "\t/**" + NL
+			+ "\t * A constant with a fixed name that can be used as the base value for additional hand written constants."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprivate static final int GENERATED_DIAGNOSTIC_CODE_COUNT = ";
+	protected final String TEXT_25 = ";" + NL + "" + NL + "\t/**" + NL
+			+ "\t * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tprotected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;"
+			+ NL;
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * The cached base package validator." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tprotected ";
+	protected final String TEXT_27 = " ";
+	protected final String TEXT_28 = "Validator;" + NL;
+	protected final String TEXT_29 = NL + "\t/**" + NL
+			+ "\t * Delegates evaluation of the given invariant expression against the object in the given context."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */" + NL + "\tpublic static boolean validate(";
+	protected final String TEXT_30 = " eClass, ";
+	protected final String TEXT_31 = " eObject, DiagnosticChain diagnostics, ";
+	protected final String TEXT_32 = " context, ";
+	protected final String TEXT_33 = " validationDelegate, ";
+	protected final String TEXT_34 = " invariant, ";
+	protected final String TEXT_35 = " expression, int severity, ";
+	protected final String TEXT_36 = " source, int code)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_37 = ".validate(eClass, eObject, diagnostics, context, validationDelegate, invariant, expression, severity, source, code);"
+			+ NL + "\t}" + NL;
+	protected final String TEXT_38 = NL + "\t/**" + NL + "\t * Creates an instance of the switch." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_39 = "()" + NL + "\t{" + NL + "\t\tsuper();";
+	protected final String TEXT_40 = NL + "\t\t";
+	protected final String TEXT_41 = "Validator = ";
+	protected final String TEXT_42 = ".INSTANCE;";
+	protected final String TEXT_43 = NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Returns the package of this validator switch." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_44 = NL + "\t@Override";
+	protected final String TEXT_45 = NL + "\tprotected EPackage getEPackage()" + NL + "\t{" + NL + "\t  return ";
+	protected final String TEXT_46 = ".eINSTANCE;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * Calls <code>validateXXX</code> for the corresponding classifier of the model." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_47 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_48 = NL
+			+ "\tprotected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, ";
+	protected final String TEXT_49 = " context)" + NL + "\t{" + NL + "\t\tswitch (classifierID)" + NL + "\t\t{";
+	protected final String TEXT_50 = NL + "\t\t\tcase ";
+	protected final String TEXT_51 = ".";
+	protected final String TEXT_52 = ":";
+	protected final String TEXT_53 = NL + "\t\t\t\treturn validate";
+	protected final String TEXT_54 = "(((";
+	protected final String TEXT_55 = ")value).";
+	protected final String TEXT_56 = "(), diagnostics, context);";
+	protected final String TEXT_57 = "((";
+	protected final String TEXT_58 = ")value, diagnostics, context);";
+	protected final String TEXT_59 = "(value, diagnostics, context);";
+	protected final String TEXT_60 = NL + "\t\t\tdefault:" + NL + "\t\t\t\treturn true;" + NL + "\t\t}" + NL + "\t}"
+			+ NL;
+	protected final String TEXT_61 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_62 = NL + "\t * ";
+	protected final String TEXT_63 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_64 = NL + "\t@Deprecated";
+	protected final String TEXT_65 = NL + "\tpublic boolean validate";
+	protected final String TEXT_66 = "(";
+	protected final String TEXT_67 = ", DiagnosticChain ";
+	protected final String TEXT_68 = ", ";
+	protected final String TEXT_69 = ")" + NL + "\t{";
+	protected final String TEXT_70 = NL + "\t\treturn true;";
+	protected final String TEXT_71 = NL + "\t\treturn validate_EveryDefaultConstraint(";
+	protected final String TEXT_72 = ")";
+	protected final String TEXT_73 = ");";
+	protected final String TEXT_74 = NL + "\t\tif (!validate_NoCircularContainment(";
+	protected final String TEXT_75 = ")) return false;";
+	protected final String TEXT_76 = NL + "\t\tboolean ";
+	protected final String TEXT_77 = "validate";
+	protected final String TEXT_78 = "_";
+	protected final String TEXT_79 = NL + "\t\tif (";
+	protected final String TEXT_80 = " || ";
+	protected final String TEXT_81 = " != null) ";
+	protected final String TEXT_82 = " &= ";
+	protected final String TEXT_83 = NL + "\t\treturn ";
+	protected final String TEXT_84 = NL + "\t}" + NL;
+	protected final String TEXT_85 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @see #validate";
+	protected final String TEXT_86 = NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_87 = "__VALUE = ";
+	protected final String TEXT_88 = "__UPPER_BOUND = ";
+	protected final String TEXT_89 = ";" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @see #validate";
+	protected final String TEXT_90 = "__LOWER_BOUND = ";
+	protected final String TEXT_91 = NL + "\t */" + NL + "\tpublic static final  PatternMatcher [][] ";
+	protected final String TEXT_92 = "__VALUES =" + NL + "\t\tnew PatternMatcher [][]" + NL + "\t\t{";
+	protected final String TEXT_93 = NL + "\t\t\tnew PatternMatcher []" + NL + "\t\t\t{";
+	protected final String TEXT_94 = NL + "\t\t\t\t";
+	protected final String TEXT_95 = ".createPatternMatcher(";
+	protected final String TEXT_96 = NL + "\t\t\t}";
+	protected final String TEXT_97 = NL + "\t\t};" + NL;
+	protected final String TEXT_98 = NL + "\t */";
+	protected final String TEXT_99 = NL + "\tpublic static final ";
+	protected final String TEXT_100 = "__VALUES =" + NL + "\t\twrapEnumerationValues" + NL + "\t\t\t(new Object[]" + NL
+			+ "\t\t\t {";
+	protected final String TEXT_101 = NL + "\t\t\t\t ";
+	protected final String TEXT_102 = "new ";
+	protected final String TEXT_103 = NL + "\t\t\t });" + NL;
+	protected final String TEXT_104 = NL + "\t/**" + NL + "\t * The cached validation expression for the ";
+	protected final String TEXT_105 = " constraint of '<em>";
+	protected final String TEXT_106 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected static final ";
+	protected final String TEXT_107 = "__";
+	protected final String TEXT_108 = "__EEXPRESSION = \"";
+	protected final String TEXT_109 = NL + "\t/**" + NL + "\t * Validates the ";
+	protected final String TEXT_110 = "</em>'." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic boolean validate";
+	protected final String TEXT_111 = " = true;" + NL + "\t\tfor (";
+	protected final String TEXT_112 = " i = ";
+	protected final String TEXT_113 = ".iterator(); i.hasNext() && (result || diagnostics != null); )" + NL + "\t\t{"
+			+ NL + "\t\t\tObject item = i.next();";
+	protected final String TEXT_114 = NL + "\t\t\tif (";
+	protected final String TEXT_115 = ".isInstance(item))" + NL + "\t\t\t{" + NL + "\t\t\t\tresult &= ";
+	protected final String TEXT_116 = ").";
+	protected final String TEXT_117 = "()";
+	protected final String TEXT_118 = ");" + NL + "\t\t\t}" + NL + "\t\t\telse";
+	protected final String TEXT_119 = NL + "\t\t\tif (!";
+	protected final String TEXT_120 = ".isInstance(item))";
+	protected final String TEXT_121 = NL + "\t\t\t{" + NL + "\t\t\t\tresult = false;" + NL
+			+ "\t\t\t\treportDataValueTypeViolation(";
+	protected final String TEXT_122 = ", item, ";
+	protected final String TEXT_123 = ");" + NL + "\t\t\t}" + NL + "\t\t}" + NL + "\t\treturn result;";
+	protected final String TEXT_124 = NL + "\t\tif (diagnostics != null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_125 = " tempDiagnostics = new BasicDiagnostic();";
+	protected final String TEXT_126 = ", tempDiagnostics, ";
+	protected final String TEXT_127 = ")) return true;";
+	protected final String TEXT_128 = ".isInstance(";
+	protected final String TEXT_129 = "))" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_130 = "if (";
+	protected final String TEXT_131 = ")) ";
+	protected final String TEXT_132 = "return true;" + NL + "\t\t\t}";
+	protected final String TEXT_133 = NL + "\t\t\tfor (";
+	protected final String TEXT_134 = " diagnostic : tempDiagnostics.getChildren())" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\tdiagnostics.add(diagnostic);" + NL + "\t\t\t}";
+	protected final String TEXT_135 = NL + "\t\t\t";
+	protected final String TEXT_136 = " children = tempDiagnostics.getChildren();" + NL
+			+ "\t\t\tfor (int i = 0; i < children.size(); i++)" + NL + "\t\t\t{" + NL + "\t\t\t\tdiagnostics.add((";
+	protected final String TEXT_137 = ")children.get(i));" + NL + "\t\t\t}";
+	protected final String TEXT_138 = NL + "\t\t}" + NL + "\t\telse" + NL + "\t\t{";
+	protected final String TEXT_139 = ", null, ";
+	protected final String TEXT_140 = NL + "\t\t}" + NL + "\t\treturn false;";
+	protected final String TEXT_141 = NL + "\t\treturn validatePattern(";
+	protected final String TEXT_142 = "__VALUES, ";
+	protected final String TEXT_143 = " = new ";
+	protected final String TEXT_144 = "__VALUES.contains(";
+	protected final String TEXT_145 = ");" + NL + "\t\tif (!";
+	protected final String TEXT_146 = " && ";
+	protected final String TEXT_147 = " != null)" + NL + "\t\t\treportEnumerationViolation(";
+	protected final String TEXT_148 = ");" + NL + "\t\treturn ";
+	protected final String TEXT_149 = "__VALUE;" + NL + "\t\tif (!";
+	protected final String TEXT_150 = " != null)";
+	protected final String TEXT_151 = NL + "\t\t\treportMinViolation(";
+	protected final String TEXT_152 = ", new ";
+	protected final String TEXT_153 = "), new ";
+	protected final String TEXT_154 = "__VALUE), ";
+	protected final String TEXT_155 = "__VALUE, ";
+	protected final String TEXT_156 = NL + "\t\tint ";
+	protected final String TEXT_157 = ".compareCalendar(";
+	protected final String TEXT_158 = "__VALUE);" + NL + "\t\tboolean ";
+	protected final String TEXT_159 = " == 0 || ";
+	protected final String TEXT_160 = " == 1;";
+	protected final String TEXT_161 = ".compareDuration(";
+	protected final String TEXT_162 = ".compareTo(";
+	protected final String TEXT_163 = "__VALUE) ";
+	protected final String TEXT_164 = " 0;";
+	protected final String TEXT_165 = NL + "\t\tif (!";
+	protected final String TEXT_166 = " != null)" + NL + "\t\t\treportMinViolation(";
+	protected final String TEXT_167 = NL + "\t\t\treportMaxViolation(";
+	protected final String TEXT_168 = " == -1;";
+	protected final String TEXT_169 = " != null)" + NL + "\t\t\treportMaxViolation(";
+	protected final String TEXT_170 = NL + "\t\tint length = ";
+	protected final String TEXT_171 = ";" + NL + "\t\tboolean ";
+	protected final String TEXT_172 = " = length >= ";
+	protected final String TEXT_173 = ";" + NL + "\t\tif (!";
+	protected final String TEXT_174 = " != null)" + NL + "\t\t\treportMinLengthViolation(";
+	protected final String TEXT_175 = ", length, ";
+	protected final String TEXT_176 = " = length <= ";
+	protected final String TEXT_177 = " != null)" + NL + "\t\t\treportMaxLengthViolation(";
+	protected final String TEXT_178 = " > ";
+	protected final String TEXT_179 = "__LOWER_BOUND && ";
+	protected final String TEXT_180 = " < ";
+	protected final String TEXT_181 = "__UPPER_BOUND;" + NL + "\t\tif (!";
+	protected final String TEXT_182 = NL + "\t\t\treportTotalDigitsViolation(";
+	protected final String TEXT_183 = "), ";
+	protected final String TEXT_184 = NL + "\t\tint scale = ";
+	protected final String TEXT_185 = ".scale();" + NL + "\t\tint totalDigits = scale < 0 ? ";
+	protected final String TEXT_186 = ".precision() - scale : ";
+	protected final String TEXT_187 = ".precision();" + NL + "\t\tboolean ";
+	protected final String TEXT_188 = " = totalDigits <= ";
+	protected final String TEXT_189 = " != null)" + NL + "\t\t\treportTotalDigitsViolation(";
+	protected final String TEXT_190 = "__LOWER_BOUND) > 0 && ";
+	protected final String TEXT_191 = "__UPPER_BOUND) < 0;" + NL + "\t\tif (!";
+	protected final String TEXT_192 = ".scale() <= ";
+	protected final String TEXT_193 = " != null)" + NL + "\t\t\treportFractionDigitsViolation(";
+	protected final String TEXT_194 = NL + "\t\t// TODO override the constraint, if desired" + NL
+			+ "\t\t// -> uncomment the scaffolding" + NL
+			+ "\t\t// -> specify the condition that violates the constraint" + NL
+			+ "\t\t// -> verify the diagnostic details, including severity, code, and message" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tif (false)" + NL
+			+ "\t\t{" + NL + "\t\t\tif (";
+	protected final String TEXT_195 = " != null)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_196 = ".add";
+	protected final String TEXT_197 = NL + "\t\t\t\t\t(createDiagnostic" + NL + "\t\t\t\t\t\t(";
+	protected final String TEXT_198 = ".ERROR," + NL + "\t\t\t\t\t\t DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t\t\t 0," + NL
+			+ "\t\t\t\t\t\t \"_UI_GenericConstraint_diagnostic\",";
+	protected final String TEXT_199 = NL + "\t\t\t\t\t\t new Object[] { \"";
+	protected final String TEXT_200 = "\", getValueLabel(";
+	protected final String TEXT_201 = ") },";
+	protected final String TEXT_202 = NL + "\t\t\t\t\t\t new Object[] { ";
+	protected final String TEXT_203 = " }," + NL + "\t\t\t\t\t\t context));";
+	protected final String TEXT_204 = NL + "\t\t\t\t\t(new ";
+	protected final String TEXT_205 = NL + "\t\t\t\t\t\t(";
+	protected final String TEXT_206 = ".ERROR," + NL + "\t\t\t\t\t\t DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t\t\t 0," + NL
+			+ "\t\t\t\t\t\t ";
+	protected final String TEXT_207 = ".INSTANCE.getString(\"_UI_GenericConstraint_diagnostic\", new Object[] { \"";
+	protected final String TEXT_208 = ") }),";
+	protected final String TEXT_209 = " }));";
+	protected final String TEXT_210 = NL + "\t\t\t}" + NL + "\t\t\treturn false;" + NL + "\t\t}" + NL + "\t\treturn ";
+	protected final String TEXT_211 = NL + "\t\treturn" + NL + "\t\t\tvalidate" + NL + "\t\t\t\t(";
+	protected final String TEXT_212 = "," + NL + "\t\t\t\t ";
+	protected final String TEXT_213 = "," + NL + "\t\t\t\t \"";
+	protected final String TEXT_214 = "\",";
+	protected final String TEXT_215 = NL + "\t\t\t\t \"";
+	protected final String TEXT_216 = "__EEXPRESSION," + NL + "\t\t\t\t ";
+	protected final String TEXT_217 = ".ERROR," + NL + "\t\t\t\t DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t 0);";
+	protected final String TEXT_218 = NL + "\t\t// TODO implement the constraint" + NL
+			+ "\t\t// -> specify the condition that violates the constraint" + NL
+			+ "\t\t// -> verify the diagnostic details, including severity, code, and message" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tif (false)" + NL
+			+ "\t\t{" + NL + "\t\t\tif (";
+	protected final String TEXT_219 = NL + "\t\t\t}" + NL + "\t\t\treturn false;" + NL + "\t\t}" + NL
+			+ "\t\treturn true;";
+	protected final String TEXT_220 = "\", getObjectLabel(";
+	protected final String TEXT_221 = NL + "\t/**" + NL
+			+ "\t * Returns the resource locator that will be used to fetch messages for this validator's diagnostics."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t */";
+	protected final String TEXT_222 = NL + "\tpublic ";
+	protected final String TEXT_223 = " getResourceLocator()" + NL + "\t{";
+	protected final String TEXT_224 = NL + "\t\t// TODO" + NL
+			+ "\t\t// Specialize this to return a resource locator for messages specific to this validator." + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\treturn super.getResourceLocator();";
+	protected final String TEXT_225 = NL + "} //";
+	protected final String TEXT_226 = NL;
+
+	public ValidatorClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_226);
+		stringBuffer.append(TEXT_226);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getUtilitiesPackageName();
+		className = genPackage.getValidatorClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2002-2013 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		final String singleWildcard = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50 ? "<?>" : "";
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getUtilitiesPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.addImport("java.util.Map");
+		final String _Map = genModel.useGenerics()
+				? "Map<" + genModel.getImportedName("java.lang.Object") + ", "
+						+ genModel.getImportedName("java.lang.Object") + ">"
+				: "Map";
+		final String objectArgument = genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.Object") + ">"
+				: "";
+		genModel.addImport("org.eclipse.emf.common.util.DiagnosticChain");
+		genModel.addImport("org.eclipse.emf.ecore.EPackage");
+		if (!genPackage.hasJavaLangConflict()
+				&& !genPackage.getUtilitiesPackageName().equals(genPackage.getInterfacePackageName()))
+			genModel.addImport(genPackage.getInterfacePackageName() + ".*");
+		genModel.markImportLocation(stringBuffer);
+		genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.Descriptor");
+		genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.Registry");
+		genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.SubstitutionLabelProvider");
+		genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.PatternMatcher");
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClassifiers())) {
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getValidatorClassName());
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator"));
+		stringBuffer.append(TEXT_11);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_15);
+		}
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genPackage.getValidatorClassName());
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(genPackage.getValidatorClassName());
+		stringBuffer.append(TEXT_18);
+		stringBuffer.append(genPackage.getInterfacePackageName());
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_15);
+		int count = 0;
+		for (GenClass genClass : genPackage.getGenClasses()) {
+			for (GenOperation genOperation : genClass.getInvariantOperations()) {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genOperation.getFormattedName());
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genClass.getFormattedName());
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genClass.getOperationID(genOperation));
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(++count);
+				stringBuffer.append(TEXT_3);
+			}
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(count);
+		stringBuffer.append(TEXT_25);
+		for (GenPackage baseGenPackage : genPackage.getAllValidatorBaseGenPackages()) {
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(baseGenPackage.getImportedValidatorClassName());
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genPackage.getValidatorPackageUniqueSafeName(baseGenPackage));
+			stringBuffer.append(TEXT_28);
+		}
+		if (genPackage.hasInvariantExpressions()) {
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(_Map);
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+			stringBuffer.append(TEXT_34);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_35);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator"));
+			stringBuffer.append(TEXT_37);
+		}
+		stringBuffer.append(TEXT_38);
+		stringBuffer.append(genPackage.getValidatorClassName());
+		stringBuffer.append(TEXT_39);
+		for (GenPackage baseGenPackage : genPackage.getAllValidatorBaseGenPackages()) {
+			stringBuffer.append(TEXT_40);
+			stringBuffer.append(genPackage.getValidatorPackageUniqueSafeName(baseGenPackage));
+			stringBuffer.append(TEXT_41);
+			stringBuffer.append(baseGenPackage.getImportedValidatorClassName());
+			stringBuffer.append(TEXT_42);
+		}
+		stringBuffer.append(TEXT_43);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_44);
+		}
+		stringBuffer.append(TEXT_45);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_46);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_44);
+		}
+		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+			if (genClassifier.isUncheckedCast()) {
+				stringBuffer.append(TEXT_47);
+				break;
+			}
+		}
+		stringBuffer.append(TEXT_48);
+		stringBuffer.append(_Map);
+		stringBuffer.append(TEXT_49);
+		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+			stringBuffer.append(TEXT_50);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_51);
+			stringBuffer.append(genPackage.getClassifierID(genClassifier));
+			stringBuffer.append(TEXT_52);
+			if (genClassifier instanceof GenDataType) {
+				GenDataType genDataType = (GenDataType) genClassifier;
+				if (genDataType.isPrimitiveType()) {
+					if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+						stringBuffer.append(TEXT_53);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_54);
+						stringBuffer.append(genDataType.getObjectInstanceClassName());
+						stringBuffer.append(TEXT_55);
+						stringBuffer.append(genDataType.getPrimitiveValueFunction());
+						stringBuffer.append(TEXT_56);
+					} else {
+						stringBuffer.append(TEXT_53);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_57);
+						stringBuffer.append(genDataType.getObjectInstanceClassName());
+						stringBuffer.append(TEXT_58);
+					}
+				} else if (genDataType.isObjectType()) {
+					stringBuffer.append(TEXT_53);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_59);
+				} else {
+					stringBuffer.append(TEXT_53);
+					stringBuffer.append(genDataType.getName());
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genDataType.getObjectType().getImportedWildcardInstanceClassName());
+					stringBuffer.append(TEXT_58);
+				}
+			} else {
+				GenClass genClass = (GenClass) genClassifier;
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_57);
+				stringBuffer.append(genClass.getImportedWildcardInstanceClassName());
+				stringBuffer.append(TEXT_58);
+			}
+		}
+		stringBuffer.append(TEXT_60);
+		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+			String result = "result".equals(genClassifier.getSafeUncapName()) ? "theResult" : "result";
+			String diagnostics = "diagnostics".equals(genClassifier.getSafeUncapName()) ? "theDiagnostics"
+					: "diagnostics";
+			String item = "item".equals(genClassifier.getSafeUncapName()) ? "theItem" : "item";
+			String context = "context".equals(genClassifier.getSafeUncapName()) ? "theContext" : "context";
+			stringBuffer.append(TEXT_61);
+			if (genClassifier.hasAPITags()) {
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(genClassifier.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_63);
+			if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_64);
+			}
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(genClassifier.getName());
+			stringBuffer.append(TEXT_66);
+			stringBuffer.append(genClassifier.getImportedWildcardInstanceClassName());
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genClassifier.getSafeUncapName());
+			stringBuffer.append(TEXT_67);
+			stringBuffer.append(diagnostics);
+			stringBuffer.append(TEXT_68);
+			stringBuffer.append(_Map);
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(context);
+			stringBuffer.append(TEXT_69);
+			if (genClassifier.getAllGenConstraints().isEmpty()) {
+				stringBuffer.append(TEXT_70);
+			} else if (genClassifier.hasOnlyDefaultConstraints()) {
+				stringBuffer.append(TEXT_71);
+				if (!((GenClass) genClassifier).isEObjectExtension()) {
+					stringBuffer.append(TEXT_66);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+					stringBuffer.append(TEXT_72);
+				}
+				stringBuffer.append(genClassifier.getSafeUncapName());
+				stringBuffer.append(TEXT_68);
+				stringBuffer.append(diagnostics);
+				stringBuffer.append(TEXT_68);
+				stringBuffer.append(context);
+				stringBuffer.append(TEXT_73);
+			} else {
+				boolean first = true;
+				for (String constraint : genClassifier.getAllGenConstraints()) {
+					GenClassifier constraintImplementor = genClassifier.getConstraintImplementor(constraint);
+					String delegate = constraintImplementor == null
+							|| constraintImplementor.getGenPackage() == genPackage ? ""
+									: genPackage.getValidatorPackageUniqueSafeName(
+											constraintImplementor.getGenPackage()) + "Validator.";
+					String cast = constraintImplementor == null && genClassifier instanceof GenClass
+							&& !((GenClass) genClassifier).isEObjectExtension()
+									? "(" + genModel.getImportedName("org.eclipse.emf.ecore.EObject") + ")"
+									: "";
+					String accessor = constraintImplementor != null && genClassifier instanceof GenDataType
+							&& !((GenDataType) genClassifier).isPrimitiveType()
+							&& ((GenDataType) constraintImplementor).isPrimitiveType()
+							&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50
+									? "." + ((GenDataType) constraintImplementor).getPrimitiveValueFunction() + "()"
+									: "";
+					if ("NoCircularContainment".equals(constraint)) {
+						stringBuffer.append(TEXT_74);
+						if (!((GenClass) genClassifier).isEObjectExtension()) {
+							stringBuffer.append(TEXT_66);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+							stringBuffer.append(TEXT_72);
+						}
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_75);
+					} else if (first) {
+						first = false;
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(delegate);
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(constraintImplementor == null ? "" : constraintImplementor.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(cast);
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(accessor);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_73);
+					} else {
+						stringBuffer.append(TEXT_79);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_80);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_81);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_82);
+						stringBuffer.append(delegate);
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(constraintImplementor == null ? "" : constraintImplementor.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(cast);
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(accessor);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_73);
+					}
+				}
+				stringBuffer.append(TEXT_83);
+				stringBuffer.append(result);
+				stringBuffer.append(TEXT_14);
+			}
+			stringBuffer.append(TEXT_84);
+			for (String constraint : genClassifier.getGenConstraints()) {
+				GenClassifier constraintDelegate = genClassifier.getConstraintDelegate(constraint);
+				String constant = genClassifier.getClassifierID() + "__"
+						+ CodeGenUtil.format(constraint, '_', null, false, false)
+								.toUpperCase(genClassifier.getGenModel().getLocale());
+				String delegate = constraintDelegate == null || constraintDelegate.getGenPackage() == genPackage ? ""
+						: genPackage.getValidatorPackageUniqueSafeName(constraintDelegate.getGenPackage())
+								+ "Validator.";
+				String cast = constraintDelegate == null && genClassifier instanceof GenClass
+						&& !((GenClass) genClassifier).isEObjectExtension()
+								? "(" + genModel.getImportedName("org.eclipse.emf.ecore.EObject") + ")"
+								: "";
+				String accessor = constraintDelegate != null && genClassifier instanceof GenDataType
+						&& !((GenDataType) genClassifier).isPrimitiveType()
+						&& ((GenDataType) constraintDelegate).isPrimitiveType()
+						&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50
+								? "." + ((GenDataType) constraintDelegate).getPrimitiveValueFunction() + "()"
+								: "";
+				if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					if (constraint.equals("Min") && genDataType.getMinLiteral() != null) {
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_86);
+						stringBuffer.append(genDataType.getImportedInstanceClassName());
+						stringBuffer.append(TEXT_27);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_87);
+						stringBuffer.append(genDataType.getStaticValue(genDataType.getMinLiteral()));
+						stringBuffer.append(TEXT_3);
+					} else if (constraint.equals("Max") && genDataType.getMaxLiteral() != null) {
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_86);
+						stringBuffer.append(genDataType.getImportedInstanceClassName());
+						stringBuffer.append(TEXT_27);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_87);
+						stringBuffer.append(genDataType.getStaticValue(genDataType.getMaxLiteral()));
+						stringBuffer.append(TEXT_3);
+					} else if (constraint.equals("TotalDigits") && genDataType.getTotalDigits() != -1
+							&& !"java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName())) {
+						String value = "1";
+						for (int digitCount = genDataType.getTotalDigits(); digitCount > 0; --digitCount)
+							value += "0";
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_86);
+						stringBuffer.append(genDataType.getImportedInstanceClassName());
+						stringBuffer.append(TEXT_27);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_88);
+						stringBuffer.append(genDataType.getStaticValue(value));
+						stringBuffer.append(TEXT_89);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_86);
+						stringBuffer.append(genDataType.getImportedInstanceClassName());
+						stringBuffer.append(TEXT_27);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_90);
+						stringBuffer.append(genDataType.getStaticValue("-" + value));
+						stringBuffer.append(TEXT_3);
+					} else if (constraint.equals("Pattern") && !genDataType.getPatterns().isEmpty()) {
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_91);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_92);
+						for (Iterator<List<String>> k = genDataType.getPatterns().iterator(); k.hasNext();) {
+							List<String> patternList = k.next();
+							stringBuffer.append(TEXT_93);
+							for (Iterator<String> p = patternList.iterator(); p.hasNext();) {
+								String pattern = p.next();
+								stringBuffer.append(TEXT_94);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil"));
+								stringBuffer.append(TEXT_95);
+								stringBuffer.append(pattern);
+								stringBuffer.append(TEXT_72);
+								stringBuffer.append(p.hasNext() ? "," : "");
+							}
+							stringBuffer.append(TEXT_96);
+							stringBuffer.append(k.hasNext() ? "," : "");
+						}
+						stringBuffer.append(TEXT_97);
+					} else if (constraint.equals("Enumeration") && !genDataType.getEnumerationLiterals().isEmpty()) {
+						stringBuffer.append(TEXT_85);
+						stringBuffer.append(genDataType.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_98);
+						if (genDataType.isUncheckedCast()) {
+							stringBuffer.append(TEXT_47);
+						}
+						stringBuffer.append(TEXT_99);
+						stringBuffer.append(genModel.getImportedName("java.util.Collection"));
+						stringBuffer.append(objectArgument);
+						stringBuffer.append(TEXT_27);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_100);
+						for (Iterator<String> k = genDataType.getEnumerationLiterals().iterator(); k.hasNext();) {
+							String literal = k.next();
+							stringBuffer.append(TEXT_101);
+							if (genDataType.isPrimitiveType()
+									&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_102);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_66);
+							}
+							stringBuffer.append(genDataType.getStaticValue(literal, false));
+							if (genDataType.isPrimitiveType()
+									&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_72);
+							}
+							stringBuffer.append(k.hasNext() ? "," : "");
+						}
+						stringBuffer.append(TEXT_103);
+					}
+				}
+				if (genClassifier.hasConstraintExpression(constraint)) {
+					stringBuffer.append(TEXT_104);
+					stringBuffer.append(constraint);
+					stringBuffer.append(TEXT_105);
+					stringBuffer.append(genClassifier.getFormattedName());
+					stringBuffer.append(TEXT_106);
+					stringBuffer.append(genModel.getImportedName("java.lang.String"));
+					stringBuffer.append(TEXT_27);
+					stringBuffer.append(genClassifier.getClassifierID());
+					stringBuffer.append(TEXT_107);
+					stringBuffer.append(CodeGenUtil.upperName(constraint));
+					stringBuffer.append(TEXT_108);
+					stringBuffer.append(genClassifier.getConstraintExpression(constraint, "\t\t"));
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_15);
+				}
+				stringBuffer.append(TEXT_109);
+				stringBuffer.append(constraint);
+				stringBuffer.append(TEXT_105);
+				stringBuffer.append(genClassifier.getFormattedName());
+				stringBuffer.append(TEXT_110);
+				stringBuffer.append(genClassifier.getName());
+				stringBuffer.append(TEXT_78);
+				stringBuffer.append(constraint);
+				stringBuffer.append(TEXT_66);
+				stringBuffer.append(genClassifier.getImportedWildcardInstanceClassName());
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(genClassifier.getSafeUncapName());
+				stringBuffer.append(TEXT_67);
+				stringBuffer.append(diagnostics);
+				stringBuffer.append(TEXT_68);
+				stringBuffer.append(_Map);
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(context);
+				stringBuffer.append(TEXT_69);
+				if (genClassifier instanceof GenDataType) {
+					GenDataType genDataType = (GenDataType) genClassifier;
+					if (constraint.equals("ItemType") && genDataType.getItemType() != null) {
+						GenDataType itemType = genDataType.getItemType();
+						String itemDelegate = itemType.getGenPackage() == genPackage ? ""
+								: genPackage.getValidatorPackageUniqueSafeName(itemType.getGenPackage()) + "Validator.";
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_111);
+						stringBuffer.append(genModel.getImportedName("java.util.Iterator"));
+						stringBuffer.append(singleWildcard);
+						stringBuffer.append(TEXT_112);
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(TEXT_113);
+						if (itemType.getGenPackage().hasConstraints()) {
+							stringBuffer.append(TEXT_114);
+							stringBuffer.append(itemType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_115);
+							stringBuffer.append(itemDelegate);
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(itemType.getName());
+							stringBuffer.append(TEXT_66);
+							if (itemType.isPrimitiveType()
+									&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_66);
+							}
+							if (!itemType.isObjectType()) {
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(itemType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_72);
+							}
+							stringBuffer.append(item);
+							if (itemType.isPrimitiveType()
+									&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_116);
+								stringBuffer.append(itemType.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_117);
+							}
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_118);
+						} else {
+							stringBuffer.append(TEXT_119);
+							stringBuffer.append(itemType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_120);
+						}
+						stringBuffer.append(TEXT_121);
+						stringBuffer.append(itemType.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_122);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_123);
+					} else if (constraint.equals("MemberTypes") && !genDataType.getMemberTypes().isEmpty()) {
+						stringBuffer.append(TEXT_124);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+						stringBuffer.append(TEXT_125);
+						for (ListIterator<GenDataType> k = genDataType.getMemberTypes().listIterator(); k.hasNext();) {
+							GenDataType memberType = k.next();
+							String memberDelegate = memberType.getGenPackage() == genPackage ? ""
+									: genPackage.getValidatorPackageUniqueSafeName(memberType.getGenPackage())
+											+ "Validator.";
+							if (genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_114);
+								stringBuffer.append(memberDelegate);
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(memberType.getName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_126);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_127);
+							} else {
+								stringBuffer.append(TEXT_114);
+								stringBuffer.append(memberType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_128);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_129);
+								if (memberType.getGenPackage().hasConstraints()) {
+									stringBuffer.append(TEXT_130);
+									stringBuffer.append(memberDelegate);
+									stringBuffer.append(TEXT_77);
+									stringBuffer.append(memberType.getName());
+									stringBuffer.append(TEXT_66);
+									if (memberType.isPrimitiveType()
+											&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+										stringBuffer.append(TEXT_66);
+									}
+									if (!memberType.isObjectType() && !memberType.getQualifiedInstanceClassName()
+											.equals(genDataType.getQualifiedInstanceClassName())) {
+										stringBuffer.append(TEXT_66);
+										stringBuffer.append(memberType.getImportedWildcardObjectInstanceClassName());
+										stringBuffer.append(TEXT_72);
+									}
+									stringBuffer.append(genClassifier.getSafeUncapName());
+									if (memberType.isPrimitiveType()
+											&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+										stringBuffer.append(TEXT_116);
+										stringBuffer.append(memberType.getPrimitiveValueFunction());
+										stringBuffer.append(TEXT_117);
+									}
+									stringBuffer.append(TEXT_126);
+									stringBuffer.append(context);
+									stringBuffer.append(TEXT_131);
+								}
+								stringBuffer.append(TEXT_132);
+							}
+						}
+						if (genModel.useGenerics()) {
+							stringBuffer.append(TEXT_133);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_134);
+						} else {
+							stringBuffer.append(TEXT_135);
+							stringBuffer.append(genModel.getImportedName("java.util.List"));
+							stringBuffer.append(TEXT_136);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_137);
+						}
+						stringBuffer.append(TEXT_138);
+						for (ListIterator<GenDataType> k = genDataType.getMemberTypes().listIterator(); k.hasNext();) {
+							GenDataType memberType = k.next();
+							String memberDelegate = memberType.getGenPackage() == genPackage ? ""
+									: genPackage.getValidatorPackageUniqueSafeName(memberType.getGenPackage())
+											+ "Validator.";
+							if (genDataType.isPrimitiveType()) {
+								stringBuffer.append(TEXT_114);
+								stringBuffer.append(memberDelegate);
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(memberType.getName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_139);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_127);
+							} else {
+								stringBuffer.append(TEXT_114);
+								stringBuffer.append(memberType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_128);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_129);
+								if (memberType.getGenPackage().hasConstraints()) {
+									stringBuffer.append(TEXT_130);
+									stringBuffer.append(memberDelegate);
+									stringBuffer.append(TEXT_77);
+									stringBuffer.append(memberType.getName());
+									stringBuffer.append(TEXT_66);
+									if (memberType.isPrimitiveType()
+											&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+										stringBuffer.append(TEXT_66);
+									}
+									if (!memberType.isObjectType() && !memberType.getQualifiedInstanceClassName()
+											.equals(genDataType.getQualifiedInstanceClassName())) {
+										stringBuffer.append(TEXT_66);
+										stringBuffer.append(memberType.getImportedWildcardObjectInstanceClassName());
+										stringBuffer.append(TEXT_72);
+									}
+									stringBuffer.append(genClassifier.getSafeUncapName());
+									if (memberType.isPrimitiveType()
+											&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+										stringBuffer.append(TEXT_116);
+										stringBuffer.append(memberType.getPrimitiveValueFunction());
+										stringBuffer.append(TEXT_117);
+									}
+									stringBuffer.append(TEXT_139);
+									stringBuffer.append(context);
+									stringBuffer.append(TEXT_131);
+								}
+								stringBuffer.append(TEXT_132);
+							}
+						}
+						stringBuffer.append(TEXT_140);
+					} else if (constraint.equals("Pattern") && !genDataType.getPatterns().isEmpty()) {
+						stringBuffer.append(TEXT_141);
+						stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_68);
+						if (genDataType.isPrimitiveType()
+								&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+							stringBuffer.append(TEXT_102);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_66);
+						}
+						stringBuffer.append(genDataType.getSafeUncapName());
+						if (genDataType.isPrimitiveType()
+								&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+							stringBuffer.append(TEXT_72);
+						}
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_142);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_73);
+					} else if (constraint.equals("Enumeration") && !genDataType.getEnumerationLiterals().isEmpty()) {
+						String variable = genDataType.getSafeUncapName();
+						if (genDataType.isPrimitiveType()
+								&& genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+							variable = variable + "Object";
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_27);
+							stringBuffer.append(variable);
+							stringBuffer.append(TEXT_143);
+							stringBuffer.append(genDataType.getObjectInstanceClassName());
+							stringBuffer.append(TEXT_66);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_73);
+						}
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_144);
+						stringBuffer.append(variable);
+						stringBuffer.append(TEXT_145);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_146);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_147);
+						stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(variable);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(constant);
+						stringBuffer.append(TEXT_142);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_14);
+					} else if (constraint.equals("Min") && genDataType.getMinLiteral() != null) {
+						if (genDataType.isPrimitiveType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_27);
+							stringBuffer.append(genDataType.isMinInclusive() ? ">=" : ">");
+							stringBuffer.append(TEXT_27);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_149);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_150);
+							if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_151);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_152);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_153);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_154);
+								stringBuffer.append(genDataType.isMinInclusive() ? "true" : "false");
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(diagnostics);
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_73);
+							} else {
+								stringBuffer.append(TEXT_151);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_155);
+								stringBuffer.append(genDataType.isMinInclusive() ? "true" : "false");
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(diagnostics);
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_14);
+						} else {
+							String comparison = "comparison".equals(genClassifier.getSafeUncapName()) ? "theComparison"
+									: "comparison";
+							if (genDataType.isXMLCalendar()) {
+								stringBuffer.append(TEXT_156);
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil"));
+								stringBuffer.append(TEXT_157);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_158);
+								stringBuffer.append(result);
+								stringBuffer.append(TEXT_23);
+								if (genDataType.isMinInclusive()) {
+									stringBuffer.append(comparison);
+									stringBuffer.append(TEXT_159);
+								}
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_160);
+							} else if (genDataType.isXMLDuration()) {
+								stringBuffer.append(TEXT_156);
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil"));
+								stringBuffer.append(TEXT_161);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_158);
+								stringBuffer.append(result);
+								stringBuffer.append(TEXT_23);
+								if (genDataType.isMinInclusive()) {
+									stringBuffer.append(comparison);
+									stringBuffer.append(TEXT_159);
+								}
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_160);
+							} else {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(result);
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_162);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_163);
+								stringBuffer.append(genDataType.isMinInclusive() ? ">=" : ">");
+								stringBuffer.append(TEXT_164);
+							}
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_166);
+							stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_155);
+							stringBuffer.append(genDataType.isMinInclusive() ? "true" : "false");
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_148);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_14);
+						}
+					} else if (constraint.equals("Max") && genDataType.getMaxLiteral() != null) {
+						if (genDataType.isPrimitiveType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_27);
+							stringBuffer.append(genDataType.isMaxInclusive() ? "<=" : "<");
+							stringBuffer.append(TEXT_27);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_149);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_150);
+							if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_167);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_152);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_153);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_154);
+								stringBuffer.append(genDataType.isMaxInclusive() ? "true" : "false");
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(diagnostics);
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_73);
+							} else {
+								stringBuffer.append(TEXT_167);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_155);
+								stringBuffer.append(genDataType.isMaxInclusive() ? "true" : "false");
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(diagnostics);
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_14);
+						} else {
+							String comparison = "comparison".equals(genClassifier.getSafeUncapName()) ? "theComparison"
+									: "comparison";
+							if (genDataType.isXMLCalendar()) {
+								stringBuffer.append(TEXT_156);
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil"));
+								stringBuffer.append(TEXT_157);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_158);
+								stringBuffer.append(result);
+								stringBuffer.append(TEXT_23);
+								if (genDataType.isMaxInclusive()) {
+									stringBuffer.append(comparison);
+									stringBuffer.append(TEXT_159);
+								}
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_168);
+							} else if (genDataType.isXMLDuration()) {
+								stringBuffer.append(TEXT_156);
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil"));
+								stringBuffer.append(TEXT_161);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_158);
+								stringBuffer.append(result);
+								stringBuffer.append(TEXT_23);
+								if (genDataType.isMaxInclusive()) {
+									stringBuffer.append(comparison);
+									stringBuffer.append(TEXT_159);
+								}
+								stringBuffer.append(comparison);
+								stringBuffer.append(TEXT_168);
+							} else {
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(result);
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_162);
+								stringBuffer.append(constant);
+								stringBuffer.append(TEXT_163);
+								stringBuffer.append(genDataType.isMaxInclusive() ? "<=" : "<");
+								stringBuffer.append(TEXT_164);
+							}
+							stringBuffer.append(TEXT_165);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_169);
+							stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_155);
+							stringBuffer.append(genDataType.isMaxInclusive() ? "true" : "false");
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_148);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_14);
+						}
+					} else if (constraint.equals("MinLength") && genDataType.getMinLength() != -1) {
+						stringBuffer.append(TEXT_170);
+						stringBuffer.append(genDataType.getSafeUncapName());
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genDataType.getLengthAccessorFunction());
+						stringBuffer.append(TEXT_171);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_172);
+						stringBuffer.append(genDataType.getMinLength());
+						stringBuffer.append(TEXT_173);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_146);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_174);
+						stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(genDataType.getSafeUncapName());
+						stringBuffer.append(TEXT_175);
+						stringBuffer.append(genDataType.getMinLength());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_14);
+					} else if (constraint.equals("MaxLength") && genDataType.getMaxLength() != -1) {
+						stringBuffer.append(TEXT_170);
+						stringBuffer.append(genDataType.getSafeUncapName());
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genDataType.getLengthAccessorFunction());
+						stringBuffer.append(TEXT_171);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_176);
+						stringBuffer.append(genDataType.getMaxLength());
+						stringBuffer.append(TEXT_173);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_146);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_177);
+						stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(genDataType.getSafeUncapName());
+						stringBuffer.append(TEXT_175);
+						stringBuffer.append(genDataType.getMaxLength());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_14);
+					} else if (constraint.equals("TotalDigits") && genDataType.getTotalDigits() != -1) {
+						if (genDataType.isPrimitiveType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_178);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_179);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_180);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_181);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_150);
+							if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {
+								stringBuffer.append(TEXT_182);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_152);
+								stringBuffer.append(genDataType.getObjectInstanceClassName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_183);
+								stringBuffer.append(genDataType.getTotalDigits());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(diagnostics);
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_73);
+							} else {
+								stringBuffer.append(TEXT_182);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genDataType.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genDataType.getTotalDigits());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(diagnostics);
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_73);
+							}
+						} else if ("java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName())) {
+							stringBuffer.append(TEXT_184);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_185);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_186);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_187);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_188);
+							stringBuffer.append(genDataType.getTotalDigits());
+							stringBuffer.append(TEXT_173);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_189);
+							stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genDataType.getTotalDigits());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_73);
+						} else {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_162);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_190);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_162);
+							stringBuffer.append(constant);
+							stringBuffer.append(TEXT_191);
+							stringBuffer.append(result);
+							stringBuffer.append(TEXT_146);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_189);
+							stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genDataType.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genDataType.getTotalDigits());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_73);
+						}
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_14);
+					} else if (constraint.equals("FractionDigits") && genDataType.getFractionDigits() != -1
+							&& "java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName())) {
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genDataType.getSafeUncapName());
+						stringBuffer.append(TEXT_192);
+						stringBuffer.append(genDataType.getFractionDigits());
+						stringBuffer.append(TEXT_173);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_146);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_193);
+						stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(genDataType.getSafeUncapName());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(genDataType.getFractionDigits());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_148);
+						stringBuffer.append(result);
+						stringBuffer.append(TEXT_14);
+					} else if (constraintDelegate != null) {
+						stringBuffer.append(TEXT_194);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_195);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_196);
+						if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+							stringBuffer.append(TEXT_197);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_198);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_199);
+							stringBuffer.append(constraint);
+							stringBuffer.append(TEXT_200);
+							stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_201);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_202);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_203);
+						} else {
+							stringBuffer.append(TEXT_204);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+							stringBuffer.append(TEXT_205);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_206);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+							stringBuffer.append(TEXT_207);
+							stringBuffer.append(constraint);
+							stringBuffer.append(TEXT_200);
+							stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_208);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(genModel.getNonNLS(2));
+							stringBuffer.append(TEXT_202);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_209);
+						}
+						stringBuffer.append(TEXT_210);
+						stringBuffer.append(delegate);
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(constraintDelegate.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(accessor);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_73);
+					} else {
+						if (genClassifier.hasConstraintExpression(constraint)) {
+							stringBuffer.append(TEXT_211);
+							stringBuffer.append(genClassifier.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_212);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_212);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_212);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_213);
+							stringBuffer.append(genClassifier.getValidationDelegate(constraint));
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_215);
+							stringBuffer.append(constraint);
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_101);
+							stringBuffer.append(genClassifier.getClassifierID());
+							stringBuffer.append(TEXT_107);
+							stringBuffer.append(CodeGenUtil.upperName(constraint));
+							stringBuffer.append(TEXT_216);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_217);
+						} else {
+							stringBuffer.append(TEXT_218);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_195);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_196);
+							if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+								stringBuffer.append(TEXT_197);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(TEXT_199);
+								stringBuffer.append(constraint);
+								stringBuffer.append(TEXT_200);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_201);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(TEXT_202);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_203);
+							} else {
+								stringBuffer.append(TEXT_204);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+								stringBuffer.append(TEXT_205);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+								stringBuffer.append(TEXT_206);
+								stringBuffer
+										.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+								stringBuffer.append(TEXT_207);
+								stringBuffer.append(constraint);
+								stringBuffer.append(TEXT_200);
+								stringBuffer.append(genDataType.getQualifiedClassifierAccessor());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_208);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(genModel.getNonNLS(2));
+								stringBuffer.append(TEXT_202);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_209);
+							}
+							stringBuffer.append(TEXT_219);
+						}
+					}
+				} else {
+					GenOperation genOperation = ((GenClass) genClassifier).getInvariantOperation(constraint);
+					if (genOperation != null) {
+						stringBuffer.append(TEXT_83);
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_73);
+					} else if (constraintDelegate != null) {
+						stringBuffer.append(TEXT_194);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_195);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_196);
+						if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+							stringBuffer.append(TEXT_197);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_198);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_199);
+							stringBuffer.append(constraint);
+							stringBuffer.append(TEXT_220);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_201);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_202);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_203);
+						} else {
+							stringBuffer.append(TEXT_204);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+							stringBuffer.append(TEXT_205);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_206);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+							stringBuffer.append(TEXT_207);
+							stringBuffer.append(constraint);
+							stringBuffer.append(TEXT_220);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_68);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_208);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(genModel.getNonNLS(2));
+							stringBuffer.append(TEXT_202);
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_209);
+						}
+						stringBuffer.append(TEXT_210);
+						stringBuffer.append(delegate);
+						stringBuffer.append(TEXT_77);
+						stringBuffer.append(constraintDelegate.getName());
+						stringBuffer.append(TEXT_78);
+						stringBuffer.append(constraint);
+						stringBuffer.append(TEXT_66);
+						stringBuffer.append(cast);
+						stringBuffer.append(genClassifier.getSafeUncapName());
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(diagnostics);
+						stringBuffer.append(TEXT_68);
+						stringBuffer.append(context);
+						stringBuffer.append(TEXT_73);
+					} else {
+						if (genClassifier.hasConstraintExpression(constraint)) {
+							stringBuffer.append(TEXT_211);
+							stringBuffer.append(genClassifier.getQualifiedClassifierAccessor());
+							stringBuffer.append(TEXT_212);
+							if (!((GenClass) genClassifier).isEObjectExtension()) {
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
+								stringBuffer.append(TEXT_72);
+							}
+							stringBuffer.append(genClassifier.getSafeUncapName());
+							stringBuffer.append(TEXT_212);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_212);
+							stringBuffer.append(context);
+							stringBuffer.append(TEXT_213);
+							stringBuffer.append(genClassifier.getValidationDelegate(constraint));
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_215);
+							stringBuffer.append(constraint);
+							stringBuffer.append(TEXT_214);
+							stringBuffer.append(genModel.getNonNLS());
+							stringBuffer.append(TEXT_101);
+							stringBuffer.append(genClassifier.getClassifierID());
+							stringBuffer.append(TEXT_107);
+							stringBuffer.append(CodeGenUtil.upperName(constraint));
+							stringBuffer.append(TEXT_216);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+							stringBuffer.append(TEXT_217);
+						} else {
+							stringBuffer.append(TEXT_218);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_195);
+							stringBuffer.append(diagnostics);
+							stringBuffer.append(TEXT_196);
+							if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+								stringBuffer.append(TEXT_197);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+								stringBuffer.append(TEXT_198);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(TEXT_199);
+								stringBuffer.append(constraint);
+								stringBuffer.append(TEXT_220);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_201);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(TEXT_202);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_203);
+							} else {
+								stringBuffer.append(TEXT_204);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+								stringBuffer.append(TEXT_205);
+								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+								stringBuffer.append(TEXT_206);
+								stringBuffer
+										.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+								stringBuffer.append(TEXT_207);
+								stringBuffer.append(constraint);
+								stringBuffer.append(TEXT_220);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(context);
+								stringBuffer.append(TEXT_208);
+								stringBuffer.append(genModel.getNonNLS());
+								stringBuffer.append(genModel.getNonNLS(2));
+								stringBuffer.append(TEXT_202);
+								stringBuffer.append(genClassifier.getSafeUncapName());
+								stringBuffer.append(TEXT_209);
+							}
+							stringBuffer.append(TEXT_219);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_84);
+			}
+		}
+		if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {
+			stringBuffer.append(TEXT_221);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_44);
+			}
+			stringBuffer.append(TEXT_222);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
+			stringBuffer.append(TEXT_223);
+			if (genModel.hasModelPluginClass()) {
+				stringBuffer.append(TEXT_83);
+				stringBuffer.append(genModel.getImportedName(genModel.getQualifiedModelPluginClassName()));
+				stringBuffer.append(TEXT_42);
+			} else {
+				stringBuffer.append(TEXT_224);
+			}
+			stringBuffer.append(TEXT_84);
+		}
+		stringBuffer.append(TEXT_15);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.ValidatorClass.ValidatorClass.insert" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,singleWildcard:singleWildcard,_Map:_Map,objectArgument:objectArgument,count:count"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("_Map", _Map);
+			callParameters.put("objectArgument", objectArgument);
+			callParameters.put("count", count);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_omcocbM-EeKd56X4hcZPSw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_225);
+		stringBuffer.append(genPackage.getValidatorClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.hasConstraints());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/XMLProcessorClass.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/XMLProcessorClass.java
new file mode 100644
index 0000000..49dbb09
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/XMLProcessorClass.java
@@ -0,0 +1,289 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class XMLProcessorClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized XMLProcessorClass create(String lineSeparator) {
+		nl = lineSeparator;
+		XMLProcessorClass result = new XMLProcessorClass();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL
+			+ " * This class contains helper methods to serialize and deserialize XML documents" + NL
+			+ " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_5 = NL + " * ";
+	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_7 = NL + "@Deprecated";
+	protected final String TEXT_8 = NL + "public class ";
+	protected final String TEXT_9 = " extends ";
+	protected final String TEXT_10 = NL + "{";
+	protected final String TEXT_11 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_12 = " copyright = ";
+	protected final String TEXT_13 = ";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + NL + "\t/**" + NL + "\t * Public constructor to instantiate the helper." + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_16 = "()" + NL + "\t{";
+	protected final String TEXT_17 = NL + "\t\tsuper(new ";
+	protected final String TEXT_18 = "(";
+	protected final String TEXT_19 = ".Registry.INSTANCE));" + NL + "\t\textendedMetaData.putPackage(null, ";
+	protected final String TEXT_20 = ".eINSTANCE);";
+	protected final String TEXT_21 = NL + "\t\tsuper((";
+	protected final String TEXT_22 = ".Registry.INSTANCE));" + NL + "\t\t";
+	protected final String TEXT_23 = ".eINSTANCE.eClass();";
+	protected final String TEXT_24 = NL + "\t}" + NL + "\t" + NL + "\t/**" + NL
+			+ "\t * Register for \"*\" and \"xml\" file extensions the ";
+	protected final String TEXT_25 = " factory." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_26 = NL + "\t@Override";
+	protected final String TEXT_27 = NL + "\tprotected Map";
+	protected final String TEXT_28 = "<";
+	protected final String TEXT_29 = ", ";
+	protected final String TEXT_30 = ".Factory>";
+	protected final String TEXT_31 = " getRegistrations()" + NL + "\t{" + NL + "\t\tif (registrations == null)" + NL
+			+ "\t\t{" + NL + "\t\t\tsuper.getRegistrations();" + NL + "\t\t\tregistrations.put(XML_EXTENSION, new ";
+	protected final String TEXT_32 = "());" + NL + "\t\t\tregistrations.put(STAR_EXTENSION, new ";
+	protected final String TEXT_33 = "());" + NL + "\t\t}" + NL + "\t\treturn registrations;" + NL + "\t}" + NL + ""
+			+ NL + "} //";
+	protected final String TEXT_34 = NL;
+
+	public XMLProcessorClass() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_34);
+		stringBuffer.append(TEXT_34);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getModelDirectory();
+		packageName = genPackage.getUtilitiesPackageName();
+		className = genPackage.getXMLProcessorClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
+				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005-2006 IBM Corporation and others. 
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getUtilitiesPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.getImportedName("java.util.Map");
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_6);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genPackage.getXMLProcessorClassName());
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genPackage.getImportedXMLProcessorBaseClassName());
+		stringBuffer.append(TEXT_10);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		stringBuffer.append(genPackage.getXMLProcessorClassName());
+		stringBuffer.append(TEXT_16);
+		if (genPackage.hasExtendedMetaData() && !genPackage.hasTargetNamespace()) {
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageRegistryImpl"));
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_20);
+		} else {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_23);
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(genPackage.getResourceFactoryClassName());
+		stringBuffer.append(TEXT_25);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_26);
+		}
+		stringBuffer.append(TEXT_27);
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
+			stringBuffer.append(TEXT_30);
+		}
+		stringBuffer.append(TEXT_31);
+		stringBuffer.append(genPackage.getResourceFactoryClassName());
+		stringBuffer.append(TEXT_32);
+		stringBuffer.append(genPackage.getResourceFactoryClassName());
+		stringBuffer.append(TEXT_33);
+		stringBuffer.append(genPackage.getXMLProcessorClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+		canGenerate = canGenerate
+				&& (genPackage.hasClassifiers() && genPackage.getResource().getValue() == GenResourceKind.XML);
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..9452244
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureTODOoverride.java
@@ -0,0 +1,326 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicGetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassbasicGetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicGetGenFeatureTODOoverride result = new ClassbasicGetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to return the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// -> do not perform proxy resolution" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public ClassbasicGetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..716fc07
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicGetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassbasicGetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicGetGenFeatureannotationsinsert result = new ClassbasicGetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassbasicGetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureoverride.java
new file mode 100644
index 0000000..792af08
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeatureoverride.java
@@ -0,0 +1,539 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicGetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassbasicGetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicGetGenFeatureoverride result = new ClassbasicGetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_2 = NL + "\t * ";
+	protected final String TEXT_3 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "\t@Deprecated";
+	protected final String TEXT_6 = NL + "\tpublic ";
+	protected final String TEXT_7 = " basicGet";
+	protected final String TEXT_8 = "()" + NL + "\t{";
+	protected final String TEXT_9 = NL + "\t\treturn (";
+	protected final String TEXT_10 = ")eDynamicGet(";
+	protected final String TEXT_11 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_12 = ", ";
+	protected final String TEXT_13 = ", false, ";
+	protected final String TEXT_14 = ");";
+	protected final String TEXT_15 = NL + "\t\treturn ";
+	protected final String TEXT_16 = "(";
+	protected final String TEXT_17 = ")";
+	protected final String TEXT_18 = "__ESETTING_DELEGATE.dynamicGet(this, null, 0, false, false)";
+	protected final String TEXT_19 = ").";
+	protected final String TEXT_20 = "()";
+	protected final String TEXT_21 = ";";
+	protected final String TEXT_22 = NL + "\t\tif (eContainerFeatureID() != ";
+	protected final String TEXT_23 = ") return null;" + NL + "\t\treturn (";
+	protected final String TEXT_24 = ")eInternalContainer();";
+	protected final String TEXT_25 = ")eVirtualGet(";
+	protected final String TEXT_26 = ")((";
+	protected final String TEXT_27 = ".Internal.Wrapper)get";
+	protected final String TEXT_28 = "()).featureMap().get(";
+	protected final String TEXT_29 = ", false);";
+	protected final String TEXT_30 = ")get";
+	protected final String TEXT_31 = "().get(";
+	protected final String TEXT_32 = NL + "\t\t";
+	protected final String TEXT_33 = NL + "\t}" + NL + NL;
+	protected final String TEXT_34 = NL;
+
+	public ClassbasicGetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_34);
+		stringBuffer.append(TEXT_34);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_3);
+		if (isJDK50) { //Class/basicGetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0l364GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genFeature.getImportedType(genClass));
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mBr4GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			if (genClass.hasStaticFeatures()) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(!genFeature.isEffectiveSuppressEMFTypes());
+			stringBuffer.append(TEXT_14);
+		} else if (genFeature.hasSettingDelegate()) {
+			stringBuffer.append(TEXT_15);
+			if (!isJDK50 && genFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_16);
+			}
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genFeature.getObjectType(genClass));
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genFeature.getUpperName());
+			stringBuffer.append(TEXT_18);
+			if (!isJDK50 && genFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getPrimitiveValueFunction());
+				stringBuffer.append(TEXT_20);
+			}
+			stringBuffer.append(TEXT_21);
+		} else if (genFeature.isContainer()) {
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_24);
+		} else if (!genFeature.isVolatile()) {
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_14);
+			} else {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_21);
+			}
+		} else if (genFeature.hasDelegateFeature()) {
+			GenFeature delegateFeature = genFeature.getDelegateFeature();
+			if (delegateFeature.isWrappedFeatureMapType()) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_29);
+			} else {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_29);
+			}
+		} else if (genFeature.hasGetterBody()) {
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genFeature.getGetterBody(genModel.getIndentation(stringBuffer)));
+		} else {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mK10GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicGetGenFeature.todo.override.javajetinc
+		}
+		stringBuffer.append(TEXT_33);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeaturepreinsert.java
new file mode 100644
index 0000000..8228458
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicGetGenFeaturepreinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicGetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized ClassbasicGetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicGetGenFeaturepreinsert result = new ClassbasicGetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassbasicGetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..9d1c6e3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureTODOoverride.java
@@ -0,0 +1,329 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicSetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassbasicSetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicSetGenFeatureTODOoverride result = new ClassbasicSetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to set the contained '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL
+			+ "\t\t// -> this method is automatically invoked to keep the containment relationship in synch" + NL
+			+ "\t\t// -> do not modify other features" + NL
+			+ "\t\t// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)"
+			+ NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public ClassbasicSetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..38ee7e9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicSetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassbasicSetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicSetGenFeatureannotationsinsert result = new ClassbasicSetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassbasicSetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureoverride.java
new file mode 100644
index 0000000..0851b26
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeatureoverride.java
@@ -0,0 +1,812 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicSetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassbasicSetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicSetGenFeatureoverride result = new ClassbasicSetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_2 = NL + "\t * ";
+	protected final String TEXT_3 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "\t@Deprecated";
+	protected final String TEXT_6 = NL + "\tpublic ";
+	protected final String TEXT_7 = " basicSet";
+	protected final String TEXT_8 = "(";
+	protected final String TEXT_9 = " new";
+	protected final String TEXT_10 = ", ";
+	protected final String TEXT_11 = " msgs)" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t\tmsgs = eBasicSetContainer(";
+	protected final String TEXT_13 = ", msgs);";
+	protected final String TEXT_14 = NL + "\t\treturn msgs;";
+	protected final String TEXT_15 = NL + "\t\tmsgs = eDynamicInverseAdd(";
+	protected final String TEXT_16 = NL + "\t\tObject old";
+	protected final String TEXT_17 = " = eVirtualSet(";
+	protected final String TEXT_18 = ", new";
+	protected final String TEXT_19 = ");";
+	protected final String TEXT_20 = NL + "\t\t";
+	protected final String TEXT_21 = " old";
+	protected final String TEXT_22 = " = ";
+	protected final String TEXT_23 = ";" + NL + "\t\t";
+	protected final String TEXT_24 = " = new";
+	protected final String TEXT_25 = ";";
+	protected final String TEXT_26 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_27 = " == EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_28 = NL + "\t\tboolean old";
+	protected final String TEXT_29 = "ESet = (";
+	protected final String TEXT_30 = " & ";
+	protected final String TEXT_31 = "_ESETFLAG) != 0;";
+	protected final String TEXT_32 = " |= ";
+	protected final String TEXT_33 = "_ESETFLAG;";
+	protected final String TEXT_34 = "ESet = ";
+	protected final String TEXT_35 = "ESet;";
+	protected final String TEXT_36 = "ESet = true;";
+	protected final String TEXT_37 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t{";
+	protected final String TEXT_38 = NL + "\t\t\t";
+	protected final String TEXT_39 = " notification = new ";
+	protected final String TEXT_40 = "(this, ";
+	protected final String TEXT_41 = ".SET, ";
+	protected final String TEXT_42 = "isSetChange ? null : old";
+	protected final String TEXT_43 = "old";
+	protected final String TEXT_44 = "isSetChange";
+	protected final String TEXT_45 = "!old";
+	protected final String TEXT_46 = "ESet";
+	protected final String TEXT_47 = " == EVIRTUAL_NO_VALUE ? null : old";
+	protected final String TEXT_48 = NL + "\t\t\tif (msgs == null) msgs = notification; else msgs.add(notification);"
+			+ NL + "\t\t}";
+	protected final String TEXT_49 = NL + "\t\treturn ((";
+	protected final String TEXT_50 = ".Internal)((";
+	protected final String TEXT_51 = ".Internal.Wrapper)get";
+	protected final String TEXT_52 = "()).featureMap()).basicAdd(";
+	protected final String TEXT_53 = ".Internal)get";
+	protected final String TEXT_54 = "()).basicAdd(";
+	protected final String TEXT_55 = NL + "\t}" + NL + NL;
+	protected final String TEXT_56 = NL;
+
+	public ClassbasicSetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_56);
+		stringBuffer.append(TEXT_56);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_3);
+		if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mnhwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genFeature.getImportedInternalType(genClass));
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genFeature.getCapName());
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_11);
+		if (genFeature.isContainer()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mxSwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mxS1GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_14);
+		} else if (genModel.isDynamicDelegation()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mxSwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mxS1GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_14);
+		} else if (!genFeature.isVolatile()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mxSwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_19);
+			} else {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_25);
+			}
+			if (genFeature.isUnsettable()) {
+				if (genModel.isVirtualDelegation()) {
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_27);
+					}
+				} else if (genClass.isESetFlag(genFeature)) {
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genClass.getESetFlagsField(genFeature));
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_31);
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genClass.getESetFlagsField(genFeature));
+						stringBuffer.append(TEXT_32);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_33);
+					}
+				} else {
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genFeature.getUncapName());
+						stringBuffer.append(TEXT_35);
+					}
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genFeature.getUncapName());
+					stringBuffer.append(TEXT_36);
+				}
+			}
+			if (!genModel.isSuppressNotification()) {
+				stringBuffer.append(TEXT_37);
+				if (genFeature.isUnsettable()) {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_10);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genFeature.getCapName());
+					} else {
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getCapName());
+					}
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_10);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_46);
+					}
+					stringBuffer.append(TEXT_19);
+				} else {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_10);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_47);
+						stringBuffer.append(genFeature.getCapName());
+					} else {
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getCapName());
+					}
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_19);
+				}
+				stringBuffer.append(TEXT_48);
+			}
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mxS1GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_14);
+		} else if (genFeature.hasDelegateFeature()) {
+			GenFeature delegateFeature = genFeature.getDelegateFeature();
+			if (delegateFeature.isWrappedFeatureMapType()) {
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_50);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_13);
+			} else {
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_13);
+			}
+		} else {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0m6cwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicSetGenFeature.todo.override.javajetinc
+		}
+		stringBuffer.append(TEXT_55);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeaturepostinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeaturepostinsert.java
new file mode 100644
index 0000000..ce3d70d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeaturepostinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicSetGenFeaturepostinsert {
+	protected static String nl;
+
+	public static synchronized ClassbasicSetGenFeaturepostinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicSetGenFeaturepostinsert result = new ClassbasicSetGenFeaturepostinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassbasicSetGenFeaturepostinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeaturepreinsert.java
new file mode 100644
index 0000000..6e4ba00
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicSetGenFeaturepreinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicSetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized ClassbasicSetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicSetGenFeaturepreinsert result = new ClassbasicSetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassbasicSetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..5d16de0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureTODOoverride.java
@@ -0,0 +1,329 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicUnsetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassbasicUnsetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicUnsetGenFeatureTODOoverride result = new ClassbasicUnsetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to unset the contained '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL
+			+ "\t\t// -> this method is automatically invoked to keep the containment relationship in synch" + NL
+			+ "\t\t// -> do not modify other features" + NL
+			+ "\t\t// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)"
+			+ NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public ClassbasicUnsetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..ec079a6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicUnsetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassbasicUnsetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicUnsetGenFeatureannotationsinsert result = new ClassbasicUnsetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassbasicUnsetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureoverride.java
new file mode 100644
index 0000000..75a558c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassbasicUnsetGenFeatureoverride.java
@@ -0,0 +1,550 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassbasicUnsetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassbasicUnsetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassbasicUnsetGenFeatureoverride result = new ClassbasicUnsetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_2 = NL + "\t * ";
+	protected final String TEXT_3 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "\t@Deprecated";
+	protected final String TEXT_6 = NL + "\tpublic ";
+	protected final String TEXT_7 = " basicUnset";
+	protected final String TEXT_8 = "(";
+	protected final String TEXT_9 = " msgs)" + NL + "\t{";
+	protected final String TEXT_10 = NL + "\t\treturn eDynamicInverseRemove(";
+	protected final String TEXT_11 = "basicGet";
+	protected final String TEXT_12 = "(), ";
+	protected final String TEXT_13 = ", msgs);";
+	protected final String TEXT_14 = "Object old";
+	protected final String TEXT_15 = " = ";
+	protected final String TEXT_16 = "eVirtualUnset(";
+	protected final String TEXT_17 = ");";
+	protected final String TEXT_18 = NL + "\t\t";
+	protected final String TEXT_19 = " old";
+	protected final String TEXT_20 = ";";
+	protected final String TEXT_21 = " = null;";
+	protected final String TEXT_22 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_23 = " != EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_24 = NL + "\t\tboolean old";
+	protected final String TEXT_25 = "ESet = (";
+	protected final String TEXT_26 = " & ";
+	protected final String TEXT_27 = "_ESETFLAG) != 0;";
+	protected final String TEXT_28 = " &= ~";
+	protected final String TEXT_29 = "_ESETFLAG;";
+	protected final String TEXT_30 = "ESet = ";
+	protected final String TEXT_31 = "ESet;";
+	protected final String TEXT_32 = "ESet = false;";
+	protected final String TEXT_33 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_34 = " notification = new ";
+	protected final String TEXT_35 = "(this, ";
+	protected final String TEXT_36 = ".UNSET, ";
+	protected final String TEXT_37 = ", ";
+	protected final String TEXT_38 = "isSetChange ? old";
+	protected final String TEXT_39 = " : null";
+	protected final String TEXT_40 = "old";
+	protected final String TEXT_41 = ", null, ";
+	protected final String TEXT_42 = "isSetChange";
+	protected final String TEXT_43 = "ESet";
+	protected final String TEXT_44 = ");" + NL
+			+ "\t\t\tif (msgs == null) msgs = notification; else msgs.add(notification);" + NL + "\t\t}" + NL
+			+ "\t\treturn msgs;";
+	protected final String TEXT_45 = NL + "\t}" + NL + NL;
+	protected final String TEXT_46 = NL;
+
+	public ClassbasicUnsetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_46);
+		stringBuffer.append(TEXT_46);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_3);
+		if (isJDK50) { //Class/basicUnsetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0qpGIGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_9);
+		if (genModel.isDynamicDelegation()) {
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getAsInternalEObject("", false));
+			if (genFeature.isResolveProxies()) {
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getAccessorName());
+			} else {
+				stringBuffer.append(genFeature.getGetAccessor());
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_13);
+		} else if (!genFeature.isVolatile()) {
+			if (genModel.isVirtualDelegation()) {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_15);
+				}
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_17);
+			} else {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_21);
+			}
+			if (genModel.isVirtualDelegation()) {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_23);
+				}
+			} else if (genClass.isESetFlag(genFeature)) {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genClass.getESetFlagsField(genFeature));
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_27);
+				}
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genClass.getESetFlagsField(genFeature));
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_29);
+			} else {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genFeature.getUncapName());
+					stringBuffer.append(TEXT_31);
+				}
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getUncapName());
+				stringBuffer.append(TEXT_32);
+			}
+			if (!genModel.isSuppressNotification()) {
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_37);
+				if (genModel.isVirtualDelegation()) {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_39);
+				} else {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genFeature.getCapName());
+				}
+				stringBuffer.append(TEXT_41);
+				if (genModel.isVirtualDelegation()) {
+					stringBuffer.append(TEXT_42);
+				} else {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_43);
+				}
+				stringBuffer.append(TEXT_44);
+			}
+		} else {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0qy3IGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicUnsetGenFeature.todo.override.javajetinc
+		}
+		stringBuffer.append(TEXT_45);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdeclaredFieldGenFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdeclaredFieldGenFeatureinsert.java
new file mode 100644
index 0000000..8ad69fb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdeclaredFieldGenFeatureinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassdeclaredFieldGenFeatureinsert {
+	protected static String nl;
+
+	public static synchronized ClassdeclaredFieldGenFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassdeclaredFieldGenFeatureinsert result = new ClassdeclaredFieldGenFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassdeclaredFieldGenFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdeclaredFieldGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdeclaredFieldGenFeatureoverride.java
new file mode 100644
index 0000000..b57afea
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdeclaredFieldGenFeatureoverride.java
@@ -0,0 +1,780 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassdeclaredFieldGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassdeclaredFieldGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassdeclaredFieldGenFeatureoverride result = new ClassdeclaredFieldGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * The cached setting delegate for the '{@link #";
+	protected final String TEXT_3 = "() <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @see #";
+	protected final String TEXT_6 = "()";
+	protected final String TEXT_7 = NL + "\t * ";
+	protected final String TEXT_8 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_9 = NL + "\t@";
+	protected final String TEXT_10 = NL + "\t@Deprecated";
+	protected final String TEXT_11 = NL + "\tprotected ";
+	protected final String TEXT_12 = ".Internal.SettingDelegate ";
+	protected final String TEXT_13 = "__ESETTING_DELEGATE = ((";
+	protected final String TEXT_14 = ".Internal)";
+	protected final String TEXT_15 = ").getSettingDelegate();" + NL;
+	protected final String TEXT_16 = NL + "\t/**" + NL + "\t * The cached value of the '{@link #";
+	protected final String TEXT_17 = " ";
+	protected final String TEXT_18 = ";" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * The empty value for the '{@link #";
+	protected final String TEXT_20 = "</em>}' array accessor." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_21 = NL + "\t@SuppressWarnings(\"rawtypes\")";
+	protected final String TEXT_22 = NL + "\tprotected static final ";
+	protected final String TEXT_23 = "[] ";
+	protected final String TEXT_24 = "_EEMPTY_ARRAY = new ";
+	protected final String TEXT_25 = " [0]";
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * The default value of the '{@link #";
+	protected final String TEXT_27 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_28 = "; // TODO The default value literal \"";
+	protected final String TEXT_29 = "\" is not valid.";
+	protected final String TEXT_30 = " = ";
+	protected final String TEXT_31 = ";";
+	protected final String TEXT_32 = NL;
+	protected final String TEXT_33 = NL + "\t/**" + NL
+			+ "\t * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_34 = NL + "\tprotected int ";
+	protected final String TEXT_35 = " = 0;" + NL;
+	protected final String TEXT_36 = NL + "\t/**" + NL
+			+ "\t * The offset of the flags representing the value of the '{@link #";
+	protected final String TEXT_37 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_38 = NL + "\tprotected static final int ";
+	protected final String TEXT_39 = "_EFLAG_OFFSET = ";
+	protected final String TEXT_40 = ";" + NL + "" + NL + "\t/**" + NL
+			+ "\t * The flags representing the default value of the '{@link #";
+	protected final String TEXT_41 = "_EFLAG_DEFAULT = ";
+	protected final String TEXT_42 = ".ordinal()";
+	protected final String TEXT_43 = ".VALUES.indexOf(";
+	protected final String TEXT_44 = ")";
+	protected final String TEXT_45 = " << ";
+	protected final String TEXT_46 = "_EFLAG_OFFSET;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * The array of enumeration values for '{@link ";
+	protected final String TEXT_47 = "}'" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_48 = NL + "\tprivate static final ";
+	protected final String TEXT_49 = "_EFLAG_VALUES = ";
+	protected final String TEXT_50 = ".values()";
+	protected final String TEXT_51 = "(";
+	protected final String TEXT_52 = "[])";
+	protected final String TEXT_53 = ".VALUES.toArray(new ";
+	protected final String TEXT_54 = "[";
+	protected final String TEXT_55 = ".VALUES.size()])";
+	protected final String TEXT_56 = NL + "\t/**" + NL + "\t * The flag";
+	protected final String TEXT_57 = " representing the value of the '{@link #";
+	protected final String TEXT_58 = "_EFLAG = ";
+	protected final String TEXT_59 = "_EFLAG_OFFSET";
+	protected final String TEXT_60 = NL + "\t/**" + NL + "\t * The flag representing whether the ";
+	protected final String TEXT_61 = " has been set." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_62 = "_ESETFLAG = 1 << ";
+	protected final String TEXT_63 = NL + "\t/**" + NL + "\t * This is true if the ";
+	protected final String TEXT_64 = NL + "\tprotected boolean ";
+	protected final String TEXT_65 = "ESet;" + NL;
+	protected final String TEXT_66 = NL;
+
+	public ClassdeclaredFieldGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_66);
+		stringBuffer.append(TEXT_66);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasSettingDelegate()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genFeature.getFormattedName());
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genFeature.getFeatureKind());
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_6);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_8);
+			if (isGWT) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getUpperName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+			stringBuffer.append(TEXT_15);
+		} else if (genFeature.isListType() || genFeature.isReferenceType()) {
+			if (genClass.isField(genFeature)) {
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_6);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isGWT) {
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getImportedInternalType(genClass));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_18);
+			}
+			if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+					&& !genFeature.isMapType()) {
+				String rawListItemType = genFeature.getRawListItemType(genClass);
+				int index = rawListItemType.indexOf('[');
+				String head = rawListItemType;
+				String tail = "";
+				if (index != -1) {
+					head = rawListItemType.substring(0, index);
+					tail = rawListItemType.substring(index);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_6);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (genFeature.getQualifiedListItemType(genClass).contains("<")
+						|| genFeature.getArrayItemType(genClass).contains("<")) {
+					stringBuffer.append(TEXT_21);
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(rawListItemType);
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(head);
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(tail);
+				stringBuffer.append(TEXT_18);
+			}
+		} else {
+			if (genFeature.hasEDefault() && (!genFeature.isVolatile() || !genModel.isReflectiveDelegation()
+					&& (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable()))) {
+				String staticDefaultValue = genFeature.getStaticDefaultValue();
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_6);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (genModel.useGenerics() && genFeature.isListDataType() && genFeature.isSetDefaultValue()) {
+					stringBuffer.append(TEXT_27);
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getEDefault());
+				if ("".equals(staticDefaultValue)) {
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genFeature.getEcoreFeature().getDefaultValueLiteral());
+					stringBuffer.append(TEXT_29);
+				} else {
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(staticDefaultValue);
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genModel.getNonNLS(staticDefaultValue));
+				}
+				stringBuffer.append(TEXT_32);
+			}
+			if (genClass.isField(genFeature)) {
+				if (genClass.isFlag(genFeature)) {
+					int flagIndex = genClass.getFlagIndex(genFeature);
+					if (flagIndex > 31 && flagIndex % 32 == 0) {
+						stringBuffer.append(TEXT_33);
+						if (isGWT) {
+							stringBuffer.append(TEXT_9);
+							stringBuffer
+									.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+						}
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genClass.getFlagsField(genFeature));
+						stringBuffer.append(TEXT_35);
+					}
+					if (genFeature.isEnumType()) {
+						stringBuffer.append(TEXT_36);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_3);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_4);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_37);
+						if (genFeature.hasAPITags()) {
+							stringBuffer.append(TEXT_7);
+							stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_8);
+						if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_10);
+						}
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(flagIndex % 32);
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_3);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_4);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_37);
+						if (genFeature.hasAPITags()) {
+							stringBuffer.append(TEXT_7);
+							stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_8);
+						if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_10);
+						}
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_41);
+						if (isJDK50) {
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_42);
+						} else {
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_44);
+						}
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(genFeature.getTypeGenClassifier().getFormattedName());
+						stringBuffer.append(TEXT_47);
+						if (genFeature.hasAPITags()) {
+							stringBuffer.append(TEXT_7);
+							stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_8);
+						if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_10);
+						}
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_49);
+						if (isJDK50) {
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_50);
+						} else {
+							stringBuffer.append(TEXT_51);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_52);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_53);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_54);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_55);
+						}
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_56);
+					stringBuffer.append(genClass.getFlagSize(genFeature) > 1 ? "s" : "");
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_3);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_4);
+					stringBuffer.append(genFeature.getFeatureKind());
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_6);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_7);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_8);
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_10);
+					}
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_58);
+					stringBuffer.append(genClass.getFlagMask(genFeature));
+					stringBuffer.append(TEXT_45);
+					if (genFeature.isEnumType()) {
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_59);
+					} else {
+						stringBuffer.append(flagIndex % 32);
+					}
+					stringBuffer.append(TEXT_18);
+				} else {
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_3);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_4);
+					stringBuffer.append(genFeature.getFeatureKind());
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_6);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_7);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_8);
+					if (isGWT) {
+						stringBuffer.append(TEXT_9);
+						stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+					}
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_10);
+					}
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(genFeature.getSafeName());
+					if (genFeature.hasEDefault()) {
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getEDefault());
+					}
+					stringBuffer.append(TEXT_18);
+				}
+			}
+		}
+		if (genClass.isESetField(genFeature)) {
+			if (genClass.isESetFlag(genFeature)) {
+				int flagIndex = genClass.getESetFlagIndex(genFeature);
+				if (flagIndex > 31 && flagIndex % 32 == 0) {
+					stringBuffer.append(TEXT_33);
+					if (isGWT) {
+						stringBuffer.append(TEXT_9);
+						stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+					}
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genClass.getESetFlagsField(genFeature));
+					stringBuffer.append(TEXT_35);
+				}
+				stringBuffer.append(TEXT_60);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_61);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_38);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(flagIndex % 32);
+				stringBuffer.append(TEXT_18);
+			} else {
+				stringBuffer.append(TEXT_63);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_61);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isGWT) {
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genFeature.getUncapName());
+				stringBuffer.append(TEXT_65);
+			}
+		}
+		stringBuffer.append(TEXT_32);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.declaredFieldGenFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0jyQMGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_32);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicDelegation.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicDelegation.java
new file mode 100644
index 0000000..9dc7e23
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicDelegation.java
@@ -0,0 +1,304 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassdynamicDelegation {
+	protected static String nl;
+
+	public static synchronized ClassdynamicDelegation create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassdynamicDelegation result = new ClassdynamicDelegation();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassdynamicDelegation() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicSetGenFeaturepostinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicSetGenFeaturepostinsert.java
new file mode 100644
index 0000000..9aef723
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicSetGenFeaturepostinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassdynamicSetGenFeaturepostinsert {
+	protected static String nl;
+
+	public static synchronized ClassdynamicSetGenFeaturepostinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassdynamicSetGenFeaturepostinsert result = new ClassdynamicSetGenFeaturepostinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassdynamicSetGenFeaturepostinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicSetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicSetGenFeaturepreinsert.java
new file mode 100644
index 0000000..e1bed83
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassdynamicSetGenFeaturepreinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassdynamicSetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized ClassdynamicSetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassdynamicSetGenFeaturepreinsert result = new ClassdynamicSetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassdynamicSetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasseIsSetoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasseIsSetoverride.java
new file mode 100644
index 0000000..9a4cf6b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasseIsSetoverride.java
@@ -0,0 +1,587 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasseIsSetoverride {
+	protected static String nl;
+
+	public static synchronized ClasseIsSetoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasseIsSetoverride result = new ClasseIsSetoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_2 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_3 = NL + "\t@Override";
+	protected final String TEXT_4 = NL + "\tpublic boolean eIsSet(int featureID)" + NL + "\t{" + NL
+			+ "\t\tswitch (featureID";
+	protected final String TEXT_5 = ")" + NL + "\t\t{";
+	protected final String TEXT_6 = NL + "\t\t\tcase ";
+	protected final String TEXT_7 = ":";
+	protected final String TEXT_8 = NL + "\t\t\t\treturn isSet";
+	protected final String TEXT_9 = "();";
+	protected final String TEXT_10 = NL + "\t\t\t\treturn ";
+	protected final String TEXT_11 = "__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);";
+	protected final String TEXT_12 = NL + "\t\t\t\treturn !((";
+	protected final String TEXT_13 = ".Internal.Wrapper)";
+	protected final String TEXT_14 = "()).featureMap().isEmpty();";
+	protected final String TEXT_15 = " != null && !";
+	protected final String TEXT_16 = ".featureMap().isEmpty();";
+	protected final String TEXT_17 = ".isEmpty();";
+	protected final String TEXT_18 = NL + "\t\t\t\t";
+	protected final String TEXT_19 = " ";
+	protected final String TEXT_20 = " = (";
+	protected final String TEXT_21 = ")eVirtualGet(";
+	protected final String TEXT_22 = ");" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_23 = NL + "\t\t\t\treturn !";
+	protected final String TEXT_24 = "().isEmpty();";
+	protected final String TEXT_25 = " != null;";
+	protected final String TEXT_26 = NL + "\t\t\t\treturn eVirtualGet(";
+	protected final String TEXT_27 = ") != null;";
+	protected final String TEXT_28 = NL + "\t\t\t\treturn basicGet";
+	protected final String TEXT_29 = "() != null;";
+	protected final String TEXT_30 = NL + "\t\t\t\treturn ((";
+	protected final String TEXT_31 = " & ";
+	protected final String TEXT_32 = "_EFLAG) != 0) != ";
+	protected final String TEXT_33 = ";";
+	protected final String TEXT_34 = NL + "\t\t\t\treturn (";
+	protected final String TEXT_35 = "_EFLAG) != ";
+	protected final String TEXT_36 = "_EFLAG_DEFAULT;";
+	protected final String TEXT_37 = " != ";
+	protected final String TEXT_38 = ", ";
+	protected final String TEXT_39 = ") != ";
+	protected final String TEXT_40 = "() != ";
+	protected final String TEXT_41 = " == null ? ";
+	protected final String TEXT_42 = " != null : !";
+	protected final String TEXT_43 = ".equals(";
+	protected final String TEXT_44 = ");";
+	protected final String TEXT_45 = "() != null : !";
+	protected final String TEXT_46 = "());";
+	protected final String TEXT_47 = NL + "\t\t\tdefault:";
+	protected final String TEXT_48 = NL + "\t\t}";
+	protected final String TEXT_49 = NL;
+	protected final String TEXT_50 = "\t\treturn super.eIsSet(featureID);";
+	protected final String TEXT_51 = "\t\treturn eDynamicIsSet(featureID);";
+	protected final String TEXT_52 = NL + "\t}" + NL + NL;
+	protected final String TEXT_53 = NL;
+
+	public ClasseIsSetoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_53);
+		stringBuffer.append(TEXT_53);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.useGenerics()) {
+			for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) {
+				if (genFeature.isListType() && !genFeature.isUnsettable() && !genFeature.isWrappedFeatureMapType()
+						&& !genClass.isField(genFeature) && genFeature.isField()
+						&& genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+					stringBuffer.append(TEXT_2);
+					break;
+				}
+			}
+		}
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(negativeOffsetCorrection);
+		stringBuffer.append(TEXT_5);
+		for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) {
+			String safeNameAccessor = genFeature.getSafeName();
+			if ("featureID".equals(safeNameAccessor)) {
+				safeNameAccessor = "this." + safeNameAccessor;
+			}
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(TEXT_7);
+			if (genFeature.hasSettingDelegate()) {
+				if (genFeature.isUnsettable()) {
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_9);
+				} else {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_11);
+				}
+			} else if (genFeature.isListType() && !genFeature.isUnsettable()) {
+				if (genFeature.isWrappedFeatureMapType()) {
+					if (genFeature.isVolatile()) {
+						stringBuffer.append(TEXT_12);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_13);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_14);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_16);
+					}
+				} else {
+					if (genClass.isField(genFeature)) {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_17);
+					} else {
+						if (genFeature.isField()
+								&& genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+							stringBuffer.append(TEXT_18);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(safeNameAccessor);
+							stringBuffer.append(TEXT_20);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_21);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_22);
+							stringBuffer.append(safeNameAccessor);
+							stringBuffer.append(TEXT_15);
+							stringBuffer.append(safeNameAccessor);
+							stringBuffer.append(TEXT_17);
+						} else {
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_24);
+						}
+					}
+				}
+			} else if (genFeature.isUnsettable()) {
+				stringBuffer.append(TEXT_8);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_9);
+			} else if (genFeature.isResolveProxies()) {
+				if (genClass.isField(genFeature)) {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_25);
+				} else {
+					if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_27);
+					} else {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genFeature.getAccessorName());
+						stringBuffer.append(TEXT_29);
+					}
+				}
+			} else if (!genFeature.hasEDefault()) {
+				if (genClass.isField(genFeature)) {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_25);
+				} else {
+					if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_27);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_29);
+					}
+				}
+			} else if (genFeature.isPrimitiveType() || genFeature.isEnumType()) {
+				if (genClass.isField(genFeature)) {
+					if (genClass.isFlag(genFeature)) {
+						if (genFeature.isBooleanType()) {
+							stringBuffer.append(TEXT_30);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_31);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_32);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_33);
+						} else {
+							stringBuffer.append(TEXT_34);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_31);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_35);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_36);
+						}
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_37);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_33);
+					}
+				} else {
+					if (genFeature.isEnumType() && genFeature.isField()
+							&& genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_33);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_33);
+					}
+				}
+			} else {//datatype
+				if (genClass.isField(genFeature)) {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getEDefault());
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(genFeature.getEDefault());
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_44);
+				} else {
+					if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_19);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_46);
+					}
+				}
+			}
+		}
+		if (forceDefaultCase) {
+			stringBuffer.append(TEXT_47);
+		} else { // {
+			stringBuffer.append(TEXT_48);
+		}
+		if (genModel.isMinimalReflectiveMethods()) {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_50);
+		} else {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_51);
+		}
+		if (forceDefaultCase) { // {
+			stringBuffer.append(TEXT_48);
+		} // }
+		stringBuffer.append(TEXT_52);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasseUnsetoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasseUnsetoverride.java
new file mode 100644
index 0000000..906edf7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasseUnsetoverride.java
@@ -0,0 +1,401 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasseUnsetoverride {
+	protected static String nl;
+
+	public static synchronized ClasseUnsetoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasseUnsetoverride result = new ClasseUnsetoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_2 = NL + "\t@Override";
+	protected final String TEXT_3 = NL + "\tpublic void eUnset(int featureID)" + NL + "\t{" + NL
+			+ "\t\tswitch (featureID";
+	protected final String TEXT_4 = ")" + NL + "\t\t{";
+	protected final String TEXT_5 = NL + "\t\t\tcase ";
+	protected final String TEXT_6 = ":";
+	protected final String TEXT_7 = NL + "\t\t\t\t((";
+	protected final String TEXT_8 = ".Internal.Wrapper)";
+	protected final String TEXT_9 = "()).featureMap().clear();";
+	protected final String TEXT_10 = NL + "\t\t\t\t";
+	protected final String TEXT_11 = "().clear();";
+	protected final String TEXT_12 = NL + "\t\t\t\tunset";
+	protected final String TEXT_13 = "();";
+	protected final String TEXT_14 = NL + "\t\t\t\tset";
+	protected final String TEXT_15 = "((";
+	protected final String TEXT_16 = ")null);";
+	protected final String TEXT_17 = "__ESETTING_DELEGATE.dynamicUnset(this, null, 0);";
+	protected final String TEXT_18 = "(";
+	protected final String TEXT_19 = ");";
+	protected final String TEXT_20 = NL + "\t\t\t\treturn;";
+	protected final String TEXT_21 = NL + "\t\t\tdefault:";
+	protected final String TEXT_22 = NL + "\t\t}";
+	protected final String TEXT_23 = NL;
+	protected final String TEXT_24 = "\t\tsuper.eUnset(featureID);";
+	protected final String TEXT_25 = "\t\teDynamicUnset(featureID);";
+	protected final String TEXT_26 = NL + "\t}" + NL + NL;
+	protected final String TEXT_27 = NL;
+
+	public ClasseUnsetoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_2);
+		}
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(negativeOffsetCorrection);
+		stringBuffer.append(TEXT_4);
+		for (GenFeature genFeature : genClass.getEUnsetGenFeatures()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(TEXT_6);
+			if (genFeature.isListType() && !genFeature.isUnsettable()) {
+				if (genFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_9);
+				} else {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_11);
+				}
+			} else if (genFeature.isUnsettable()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_13);
+			} else if (!genFeature.hasEDefault()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_16);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_17);
+			} else {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getEDefault());
+				stringBuffer.append(TEXT_19);
+			}
+			stringBuffer.append(TEXT_20);
+		}
+		if (forceDefaultCase) {
+			stringBuffer.append(TEXT_21);
+		} else { // {
+			stringBuffer.append(TEXT_22);
+		}
+		if (genModel.isMinimalReflectiveMethods()) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_24);
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_20);
+			}
+		} else {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_25);
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_20);
+			}
+		}
+		if (forceDefaultCase) { // {
+			stringBuffer.append(TEXT_22);
+		} // }
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassegfCustomconstructoroverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassegfCustomconstructoroverride.java
new file mode 100644
index 0000000..463f2bb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassegfCustomconstructoroverride.java
@@ -0,0 +1,305 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassegfCustomconstructoroverride {
+	protected static String nl;
+
+	public static synchronized ClassegfCustomconstructoroverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassegfCustomconstructoroverride result = new ClassegfCustomconstructoroverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\tsuper();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public ClassegfCustomconstructoroverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureReifiedoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureReifiedoverride.java
new file mode 100644
index 0000000..7f298e1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureReifiedoverride.java
@@ -0,0 +1,715 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenFeatureReifiedoverride {
+	protected static String nl;
+
+	public static synchronized ClassgenFeatureReifiedoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenFeatureReifiedoverride result = new ClassgenFeatureReifiedoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL
+			+ "\t * This is specialized for the more specific element type known in this context." + NL + "\t * @see #";
+	protected final String TEXT_3 = "()";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_7 = NL + "\t@Deprecated";
+	protected final String TEXT_8 = NL + "\t@Override";
+	protected final String TEXT_9 = NL + "\tpublic ";
+	protected final String TEXT_10 = "[] ";
+	protected final String TEXT_11 = "()" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t\t";
+	protected final String TEXT_13 = " list = (";
+	protected final String TEXT_14 = ")";
+	protected final String TEXT_15 = "();" + NL + "\t\tif (list.isEmpty()) return ";
+	protected final String TEXT_16 = "_EEMPTY_ARRAY;";
+	protected final String TEXT_17 = NL + "\t\tif (";
+	protected final String TEXT_18 = " == null || ";
+	protected final String TEXT_19 = ".isEmpty()) return ";
+	protected final String TEXT_20 = "_EEMPTY_ARRAY;" + NL + "\t\t";
+	protected final String TEXT_21 = ";";
+	protected final String TEXT_22 = NL + "\t\tlist.shrink();" + NL + "\t\treturn (";
+	protected final String TEXT_23 = "[])list.data();" + NL + "\t}" + NL;
+	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL
+			+ "\t * This is specialized for the more specific element type known in this context.";
+	protected final String TEXT_25 = NL;
+	protected final String TEXT_26 = " ";
+	protected final String TEXT_27 = "_";
+	protected final String TEXT_28 = " = (";
+	protected final String TEXT_29 = ")eVirtualGet(";
+	protected final String TEXT_30 = ");";
+	protected final String TEXT_31 = " == null)" + NL + "\t\t{";
+	protected final String TEXT_32 = NL + "\t\t\teVirtualSet(";
+	protected final String TEXT_33 = ", ";
+	protected final String TEXT_34 = " = new ";
+	protected final String TEXT_35 = NL + "\t\t\t";
+	protected final String TEXT_36 = NL + "\t\t}" + NL + "\t\treturn ";
+	protected final String TEXT_37 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_38 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL
+			+ "\t * This is specialized for the more specific type known in this context.";
+	protected final String TEXT_39 = " basicSet";
+	protected final String TEXT_40 = "(";
+	protected final String TEXT_41 = " new";
+	protected final String TEXT_42 = " msgs)" + NL + "\t{" + NL + "\t\treturn super.basicSet";
+	protected final String TEXT_43 = "(new";
+	protected final String TEXT_44 = ", msgs);" + NL + "\t}" + NL;
+	protected final String TEXT_45 = NL + "\tpublic void set";
+	protected final String TEXT_46 = ")" + NL + "\t{" + NL + "\t\tsuper.set";
+	protected final String TEXT_47 = ");" + NL + "\t}" + NL;
+	protected final String TEXT_48 = NL;
+
+	public ClassgenFeatureReifiedoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> classExtendsGenClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> classExtendsAllGenFeaturesList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object classExtendsGenClassParameter : classExtendsGenClassList) {
+				for (Object classExtendsAllGenFeaturesParameter : classExtendsAllGenFeaturesList) {
+					for (Object genClassParameter : genClassList) {
+						for (Object genPackageParameter : genPackageList) {
+							for (Object genModelParameter : genModelList) {
+								for (Object isJDK50Parameter : isJDK50List) {
+									for (Object isInterfaceParameter : isInterfaceList) {
+										for (Object isImplementationParameter : isImplementationList) {
+											for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+												for (Object isGWTParameter : isGWTList) {
+													for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+														for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+															for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+																for (Object singleWildcardParameter : singleWildcardList) {
+																	for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																		for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																			for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																				for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																					this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																					this.classExtendsGenClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) classExtendsGenClassParameter;
+																					this.classExtendsAllGenFeatures = (java.util.List) classExtendsAllGenFeaturesParameter;
+																					this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																					this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																					this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																					this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																					this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																					this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																					this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																					this.isGWT = (java.lang.Boolean) isGWTParameter;
+																					this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																					this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																					this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																					this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																					this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																					this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																					this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																					this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																					if (preCondition(ctx)) {
+																						ctx.setNode(new Node.Container(
+																								currentNode,
+																								getClass()));
+																						orchestration(ctx);
+																					}
+
+																				}
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_48);
+		stringBuffer.append(TEXT_48);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("classExtendsGenClass", this.classExtendsGenClass);
+			parameterValues.put("classExtendsAllGenFeatures", this.classExtendsAllGenFeatures);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass classExtendsGenClass = null;
+
+	public void set_classExtendsGenClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.classExtendsGenClass = object;
+	}
+
+	protected java.util.List classExtendsAllGenFeatures = null;
+
+	public void set_classExtendsAllGenFeatures(java.util.List object) {
+		this.classExtendsAllGenFeatures = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("classExtendsGenClass", this.classExtendsGenClass);
+		parameters.put("classExtendsAllGenFeatures", this.classExtendsAllGenFeatures);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+				&& !genFeature.isMapType()) {
+			String arrayElementType = genFeature.getArrayItemType(genClass);
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {
+				stringBuffer.append(TEXT_6);
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_7);
+			}
+			if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(arrayElementType);
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getGetArrayAccessor());
+			stringBuffer.append(TEXT_11);
+			if (genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_16);
+			} else {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_21);
+			}
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(arrayElementType);
+			stringBuffer.append(TEXT_23);
+		}
+		if (genFeature.isGet() && genFeature.isListType()) {
+			stringBuffer.append(TEXT_24);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_25);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lIUFGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+			if (genFeature.isListType() && genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_6);
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_7);
+			}
+			if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genFeature.getGetAccessor());
+			if (genClass.hasCollidingGetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_27);
+			}
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(TEXT_25);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lSFDGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_29);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_30);
+			}
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genFeature.getSafeName());
+			stringBuffer.append(TEXT_31);
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_32);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genClass.getListConstructor(genFeature));
+				stringBuffer.append(TEXT_30);
+			} else {
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genClass.getListConstructor(genFeature));
+				stringBuffer.append(TEXT_21);
+			}
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genFeature.getSafeName());
+			stringBuffer.append(genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : "");
+			stringBuffer.append(TEXT_37);
+		}
+		if (!genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {
+			stringBuffer.append(TEXT_38);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_25);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mnhwGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_7);
+			}
+			if (classExtendsAllGenFeatures.contains(genFeature)) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_39);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_40);
+			stringBuffer.append(genFeature.getImportedInternalType(genClass));
+			stringBuffer.append(TEXT_41);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_42);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_43);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_44);
+		}
+		if (genFeature.isSet() && !(!genModel.isReflectiveDelegation() && genFeature.isBasicSet())) {
+			stringBuffer.append(TEXT_38);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_25);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0nqqoGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+			{
+				GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_7);
+				}
+				if (classExtendsAllGenFeatures.contains(genFeature)) {
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genFeature.getAccessorName());
+				if (genClass.hasCollidingSetAccessorOperation(genFeature)) {
+					stringBuffer.append(TEXT_27);
+				}
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(setAccessorOperation == null ? "new" + genFeature.getCapName()
+						: setAccessorOperation.getGenParameters().get(0).getName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genFeature.getAccessorName());
+				if (genClass.hasCollidingSetAccessorOperation(genFeature)) {
+					stringBuffer.append(TEXT_27);
+				}
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(setAccessorOperation == null ? "new" + genFeature.getCapName()
+						: setAccessorOperation.getGenParameters().get(0).getName());
+				stringBuffer.append(TEXT_47);
+			}
+		}
+		stringBuffer.append(TEXT_25);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureinsert.java
new file mode 100644
index 0000000..e552b55
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenFeatureinsert {
+	protected static String nl;
+
+	public static synchronized ClassgenFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenFeatureinsert result = new ClassgenFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgenFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureoverride.java
new file mode 100644
index 0000000..c820a49
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenFeatureoverride.java
@@ -0,0 +1,841 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassgenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenFeatureoverride result = new ClassgenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_3 = NL + "\t * ";
+	protected final String TEXT_4 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_5 = NL + "\t";
+	protected final String TEXT_6 = "[] ";
+	protected final String TEXT_7 = "();" + NL;
+	protected final String TEXT_8 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\t@Override";
+	protected final String TEXT_11 = NL + "\tpublic ";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t\t";
+	protected final String TEXT_14 = " list = (";
+	protected final String TEXT_15 = ")";
+	protected final String TEXT_16 = "();" + NL + "\t\tif (list.isEmpty()) return ";
+	protected final String TEXT_17 = "_EEMPTY_ARRAY;";
+	protected final String TEXT_18 = NL + "\t\tif (";
+	protected final String TEXT_19 = " == null || ";
+	protected final String TEXT_20 = ".isEmpty()) return ";
+	protected final String TEXT_21 = "_EEMPTY_ARRAY;" + NL + "\t\t";
+	protected final String TEXT_22 = ";";
+	protected final String TEXT_23 = NL + "\t\tlist.shrink();" + NL + "\t\treturn (";
+	protected final String TEXT_24 = "[])list.data();" + NL + "\t}" + NL;
+	protected final String TEXT_25 = " get";
+	protected final String TEXT_26 = "(int index);" + NL;
+	protected final String TEXT_27 = "(int index)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_28 = "(";
+	protected final String TEXT_29 = "().get(index);" + NL + "\t}" + NL;
+	protected final String TEXT_30 = NL + "\tint get";
+	protected final String TEXT_31 = "Length();" + NL;
+	protected final String TEXT_32 = NL + "\tpublic int get";
+	protected final String TEXT_33 = "Length()" + NL + "\t{";
+	protected final String TEXT_34 = NL + "\t\treturn ";
+	protected final String TEXT_35 = "().size();";
+	protected final String TEXT_36 = " == null ? 0 : ";
+	protected final String TEXT_37 = ".size();";
+	protected final String TEXT_38 = NL + "\t}" + NL;
+	protected final String TEXT_39 = NL + "\tvoid set";
+	protected final String TEXT_40 = "[] new";
+	protected final String TEXT_41 = ");" + NL;
+	protected final String TEXT_42 = NL + "\tpublic void set";
+	protected final String TEXT_43 = ")" + NL + "\t{" + NL + "\t\t((";
+	protected final String TEXT_44 = "()).setData(new";
+	protected final String TEXT_45 = ".length, new";
+	protected final String TEXT_46 = ");" + NL + "\t}" + NL;
+	protected final String TEXT_47 = "(int index, ";
+	protected final String TEXT_48 = " element);" + NL;
+	protected final String TEXT_49 = " element)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_50 = "().set(index, element);" + NL + "\t}" + NL;
+	protected final String TEXT_51 = NL;
+	protected final String TEXT_52 = NL;
+
+	public ClassgenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_52);
+		stringBuffer.append(TEXT_52);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+				&& !genFeature.isMapType()) {
+			String arrayElementType = genFeature.getArrayItemType(genClass);
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(arrayElementType);
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_7);
+			} else {
+				if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {
+					stringBuffer.append(TEXT_8);
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_9);
+				}
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(arrayElementType);
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_12);
+				if (genFeature.isVolatile()) {
+					stringBuffer.append(TEXT_13);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_17);
+				} else {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_21);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_22);
+				}
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(arrayElementType);
+				stringBuffer.append(TEXT_24);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_26);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_27);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genFeature.getListItemType(genClass));
+					stringBuffer.append(TEXT_15);
+				}
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_29);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_31);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_32);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_33);
+				if (genFeature.isVolatile()) {
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_35);
+				} else {
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_37);
+				}
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_41);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_44);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_46);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_48);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_50);
+			}
+		}
+		if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0kh3EGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/getGenFeature.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet()) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lk_8GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicGetGenFeature.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0mUm0GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicSetGenFeature.override.javajetinc
+		}
+		if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0nN-sGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/setGenFeature.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset()) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0qfVIGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class.basicUnsetGenFeature.override.javajetinc
+		}
+		if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0q8BEGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/unsetGenFeature.override.javajetinc
+		}
+		if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0sIT4GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/isSetGenFeature.override.javajetinc
+		}
+		stringBuffer.append(TEXT_51);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0s36wGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_51);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationannotationsinsert.java
new file mode 100644
index 0000000..de3fd85
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenOperationannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassgenOperationannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenOperationannotationsinsert result = new ClassgenOperationannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgenOperationannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationinsert.java
new file mode 100644
index 0000000..0252062
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenOperationinsert {
+	protected static String nl;
+
+	public static synchronized ClassgenOperationinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenOperationinsert result = new ClassgenOperationinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgenOperationinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationjavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationjavadocinsert.java
new file mode 100644
index 0000000..a77ed03
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationjavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenOperationjavadocinsert {
+	protected static String nl;
+
+	public static synchronized ClassgenOperationjavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenOperationjavadocinsert result = new ClassgenOperationjavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgenOperationjavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationjavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationjavadocoverride.java
new file mode 100644
index 0000000..718ad9e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationjavadocoverride.java
@@ -0,0 +1,406 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenOperationjavadocoverride {
+	protected static String nl;
+
+	public static synchronized ClassgenOperationjavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenOperationjavadocoverride result = new ClassgenOperationjavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * <!-- begin-model-doc -->";
+	protected final String TEXT_5 = NL + "\t * ";
+	protected final String TEXT_6 = NL + "\t * @param ";
+	protected final String TEXT_7 = NL + "\t *   ";
+	protected final String TEXT_8 = " ";
+	protected final String TEXT_9 = NL + "\t * <!-- end-model-doc -->";
+	protected final String TEXT_10 = NL + "\t * @model ";
+	protected final String TEXT_11 = NL + "\t *        ";
+	protected final String TEXT_12 = NL + "\t * @model";
+	protected final String TEXT_13 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_14 = NL;
+
+	public ClassgenOperationjavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_14);
+		stringBuffer.append(TEXT_14);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.javadoc.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genOperation", genOperation);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0toIsGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		if (genOperation.hasDocumentation() || genOperation.hasParameterDocumentation()) {
+			stringBuffer.append(TEXT_4);
+			if (genOperation.hasDocumentation()) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genOperation.getDocumentation(genModel.getIndentation(stringBuffer)));
+			}
+			for (GenParameter genParameter : genOperation.getGenParameters()) {
+				if (genParameter.hasDocumentation()) {
+					String documentation = genParameter.getDocumentation("");
+					if (documentation.contains("\n") || documentation.contains("\r")) {
+						stringBuffer.append(TEXT_6);
+						stringBuffer.append(genParameter.getName());
+						stringBuffer.append(TEXT_7);
+						stringBuffer.append(genParameter.getDocumentation(genModel.getIndentation(stringBuffer)));
+					} else {
+						stringBuffer.append(TEXT_6);
+						stringBuffer.append(genParameter.getName());
+						stringBuffer.append(TEXT_8);
+						stringBuffer.append(genParameter.getDocumentation(genModel.getIndentation(stringBuffer)));
+					}
+				}
+			}
+			stringBuffer.append(TEXT_9);
+		}
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genOperation.getModelInfo(),
+					"\n\r"); stringTokenizer.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_12);
+			}
+		}
+		stringBuffer.append(TEXT_13);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationoverride.java
new file mode 100644
index 0000000..806ddc8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgenOperationoverride.java
@@ -0,0 +1,751 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgenOperationoverride {
+	protected static String nl;
+
+	public static synchronized ClassgenOperationoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgenOperationoverride result = new ClassgenOperationoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * The cached validation expression for the '{@link #";
+	protected final String TEXT_3 = "(";
+	protected final String TEXT_4 = ") <em>";
+	protected final String TEXT_5 = "</em>}' invariant operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_6 = ")";
+	protected final String TEXT_7 = NL + "\t * ";
+	protected final String TEXT_8 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\tprotected static final ";
+	protected final String TEXT_11 = " ";
+	protected final String TEXT_12 = "__EEXPRESSION = \"";
+	protected final String TEXT_13 = "\";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * The cached invocation delegate for the '{@link #";
+	protected final String TEXT_16 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_17 = ".Internal.InvocationDelegate ";
+	protected final String TEXT_18 = "__EINVOCATION_DELEGATE = ((";
+	protected final String TEXT_19 = ".Internal)";
+	protected final String TEXT_20 = ").getInvocationDelegate();" + NL;
+	protected final String TEXT_21 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_22 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_23 = NL + "\t";
+	protected final String TEXT_24 = ";" + NL;
+	protected final String TEXT_25 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_26 = NL + "\t@Override";
+	protected final String TEXT_27 = NL + "\tpublic ";
+	protected final String TEXT_28 = NL + "\t{";
+	protected final String TEXT_29 = NL + "\t\t";
+	protected final String TEXT_30 = NL + "\t\treturn" + NL + "\t\t\t";
+	protected final String TEXT_31 = ".validate" + NL + "\t\t\t\t(";
+	protected final String TEXT_32 = "," + NL + "\t\t\t\t this," + NL + "\t\t\t\t ";
+	protected final String TEXT_33 = "," + NL + "\t\t\t\t ";
+	protected final String TEXT_34 = "," + NL + "\t\t\t\t \"";
+	protected final String TEXT_35 = "\",";
+	protected final String TEXT_36 = NL + "\t\t\t\t ";
+	protected final String TEXT_37 = "__EEXPRESSION," + NL + "\t\t\t\t ";
+	protected final String TEXT_38 = ".ERROR," + NL + "\t\t\t\t ";
+	protected final String TEXT_39 = ".DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t ";
+	protected final String TEXT_40 = ".";
+	protected final String TEXT_41 = ");";
+	protected final String TEXT_42 = NL + "\t\t// TODO: implement this method" + NL
+			+ "\t\t// -> specify the condition that violates the invariant" + NL
+			+ "\t\t// -> verify the details of the diagnostic, including severity and message" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tif (false)" + NL
+			+ "\t\t{" + NL + "\t\t\tif (";
+	protected final String TEXT_43 = " != null)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_44 = ".add" + NL + "\t\t\t\t\t(new ";
+	protected final String TEXT_45 = NL + "\t\t\t\t\t\t(";
+	protected final String TEXT_46 = ".ERROR," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_47 = ".DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_48 = "," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_49 = ".INSTANCE.getString(\"_UI_GenericInvariant_diagnostic\", new Object[] { \"";
+	protected final String TEXT_50 = "\", ";
+	protected final String TEXT_51 = ".getObjectLabel(this, ";
+	protected final String TEXT_52 = ") }),";
+	protected final String TEXT_53 = NL + "\t\t\t\t\t\t new Object [] { this }));" + NL + "\t\t\t}" + NL
+			+ "\t\t\treturn false;" + NL + "\t\t}" + NL + "\t\treturn true;";
+	protected final String TEXT_54 = NL + "\t\ttry" + NL + "\t\t{";
+	protected final String TEXT_55 = NL + "\t\t\t";
+	protected final String TEXT_56 = "__EINVOCATION_DELEGATE.dynamicInvoke(this, ";
+	protected final String TEXT_57 = "new ";
+	protected final String TEXT_58 = ".UnmodifiableEList<Object>(";
+	protected final String TEXT_59 = ", ";
+	protected final String TEXT_60 = "null";
+	protected final String TEXT_61 = NL + "\t\t\treturn ";
+	protected final String TEXT_62 = ").";
+	protected final String TEXT_63 = "()";
+	protected final String TEXT_64 = ";";
+	protected final String TEXT_65 = NL + "\t\t}" + NL + "\t\tcatch (";
+	protected final String TEXT_66 = " ite)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
+	protected final String TEXT_67 = "(ite);" + NL + "\t\t}";
+	protected final String TEXT_68 = NL + "\t}" + NL;
+	protected final String TEXT_69 = NL;
+
+	public ClassgenOperationoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_69);
+		stringBuffer.append(TEXT_69);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isImplementation) {
+			if (genOperation.isInvariant() && genOperation.hasInvariantExpression()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genOperation.getFormattedName());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_6);
+				if (genOperation.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_9);
+				}
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genModel.getImportedName("java.lang.String"));
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genOperation.getInvariantExpression("\t\t"));
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_14);
+			} else if (genOperation.hasInvocationDelegate()) {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genOperation.getFormattedName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_6);
+				if (genOperation.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_9);
+				}
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genOperation.getQualifiedOperationAccessor());
+				stringBuffer.append(TEXT_20);
+			}
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_14);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.javadoc.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genOperation", genOperation);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0tUmsGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/genOperation.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_21);
+			if (genOperation.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_22);
+			if (isJDK50) { //Class/genOperation.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_14);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.annotations.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genOperation", genOperation);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0txSoGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_9);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genOperation.getTypeParameters(genClass));
+			stringBuffer.append(genOperation.getImportedType(genClass));
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genOperation.getName());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genOperation.getParameters(genClass));
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genOperation.getThrows(genClass));
+			stringBuffer.append(TEXT_24);
+		} else {
+			if (genModel.useGenerics() && !genOperation.hasBody() && !genOperation.isInvariant()
+					&& genOperation.hasInvocationDelegate() && genOperation.isUncheckedCast(genClass)) {
+				stringBuffer.append(TEXT_25);
+			}
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genOperation.isSuppressedVisibility()) {
+				stringBuffer.append(TEXT_26);
+			}
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genOperation.getTypeParameters(genClass));
+			stringBuffer.append(genOperation.getImportedType(genClass));
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genOperation.getName());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genOperation.getParameters(isImplementation, genClass));
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genOperation.getThrows(genClass));
+			stringBuffer.append(TEXT_28);
+			if (genOperation.hasBody()) {
+				stringBuffer.append(TEXT_29);
+				stringBuffer.append(genOperation.getBody(genModel.getIndentation(stringBuffer)));
+			} else if (genOperation.isInvariant()) {
+				GenClass opClass = genOperation.getGenClass();
+				String diagnostics = genOperation.getGenParameters().get(0).getName();
+				String context = genOperation.getGenParameters().get(1).getName();
+				if (genOperation.hasInvariantExpression()) {
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(diagnostics);
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(context);
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genOperation.getValidationDelegate());
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genOperation.getQualifiedOperationAccessor());
+					stringBuffer.append(TEXT_33);
+					stringBuffer
+							.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(opClass.getOperationID(genOperation));
+					stringBuffer.append(TEXT_41);
+				} else {
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(diagnostics);
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(diagnostics);
+					stringBuffer.append(TEXT_44);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(opClass.getOperationID(genOperation));
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+					stringBuffer.append(TEXT_49);
+					stringBuffer.append(genOperation.getName());
+					stringBuffer.append(TEXT_50);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator"));
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(context);
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(genModel.getNonNLS(2));
+					stringBuffer.append(TEXT_53);
+				}
+			} else if (genOperation.hasInvocationDelegate()) {
+				int size = genOperation.getGenParameters().size();
+				stringBuffer.append(TEXT_54);
+				if (genOperation.isVoid()) {
+					stringBuffer.append(TEXT_55);
+					stringBuffer
+							.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+					stringBuffer.append(TEXT_56);
+					if (size > 0) {
+						stringBuffer.append(TEXT_57);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+						stringBuffer.append(TEXT_58);
+						stringBuffer.append(size);
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genOperation.getParametersArray(genClass));
+						stringBuffer.append(TEXT_6);
+					} else {
+						stringBuffer.append(TEXT_60);
+					}
+					stringBuffer.append(TEXT_41);
+				} else {
+					stringBuffer.append(TEXT_61);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_3);
+					stringBuffer.append(genOperation.getObjectType(genClass));
+					stringBuffer.append(TEXT_6);
+					stringBuffer
+							.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+					stringBuffer.append(TEXT_56);
+					if (size > 0) {
+						stringBuffer.append(TEXT_57);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+						stringBuffer.append(TEXT_58);
+						stringBuffer.append(size);
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genOperation.getParametersArray(genClass));
+						stringBuffer.append(TEXT_6);
+					} else {
+						stringBuffer.append(TEXT_60);
+					}
+					stringBuffer.append(TEXT_6);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_62);
+						stringBuffer.append(genOperation.getPrimitiveValueFunction());
+						stringBuffer.append(TEXT_63);
+					}
+					stringBuffer.append(TEXT_64);
+				}
+				stringBuffer.append(TEXT_65);
+				stringBuffer
+						.append(genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException"
+								: "java.lang.reflect.InvocationTargetException"));
+				stringBuffer.append(TEXT_66);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
+				stringBuffer.append(TEXT_67);
+			} else {
+				stringBuffer.append(TEXT_14);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.implementedGenOperation.TODO.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genOperation", genOperation);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0t7DoGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/implementedGenOperation.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_68);
+		}
+		stringBuffer.append(TEXT_14);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genOperation", genOperation);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0uENkGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..418c488
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureTODOoverride.java
@@ -0,0 +1,344 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassgetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgetGenFeatureTODOoverride result = new ClassgetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to return the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT";
+	protected final String TEXT_4 = NL
+			+ "\t\t// The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting"
+			+ NL + "\t\t// so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.";
+	protected final String TEXT_5 = "EcoreEMap";
+	protected final String TEXT_6 = "BasicFeatureMap";
+	protected final String TEXT_7 = "EcoreEList";
+	protected final String TEXT_8 = " should be used.";
+	protected final String TEXT_9 = NL + "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_10 = NL;
+
+	public ClassgetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(TEXT_10);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		if (genFeature.isListType()) {
+			stringBuffer.append(TEXT_4);
+			if (genFeature.isMapType()) {
+				stringBuffer.append(TEXT_5);
+			} else if (genFeature.isFeatureMapType()) {
+				stringBuffer.append(TEXT_6);
+			} else {
+				stringBuffer.append(TEXT_7);
+			}
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..c214701
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassgetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgetGenFeatureannotationsinsert result = new ClassgetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..728754f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized ClassgetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgetGenFeaturejavadocinsert result = new ClassgetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..3b5ccfd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturejavadocoverride.java
@@ -0,0 +1,525 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized ClassgetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgetGenFeaturejavadocoverride result = new ClassgetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Returns the value of the '<em><b>";
+	protected final String TEXT_2 = "</b></em>' ";
+	protected final String TEXT_3 = ".";
+	protected final String TEXT_4 = NL + "\t * The key is of type ";
+	protected final String TEXT_5 = "list of {@link ";
+	protected final String TEXT_6 = "}";
+	protected final String TEXT_7 = "{@link ";
+	protected final String TEXT_8 = "," + NL + "\t * and the value is of type ";
+	protected final String TEXT_9 = ",";
+	protected final String TEXT_10 = NL + "\t * The list contents are of type {@link ";
+	protected final String TEXT_11 = NL + "\t * The default value is <code>";
+	protected final String TEXT_12 = "</code>.";
+	protected final String TEXT_13 = NL + "\t * The literals are from the enumeration {@link ";
+	protected final String TEXT_14 = "}.";
+	protected final String TEXT_15 = NL + "\t * It is bidirectional and its opposite is '{@link ";
+	protected final String TEXT_16 = "#";
+	protected final String TEXT_17 = " <em>";
+	protected final String TEXT_18 = "</em>}'.";
+	protected final String TEXT_19 = NL;
+	protected final String TEXT_20 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_21 = NL + "\t * <!-- begin-model-doc -->" + NL + "\t * ";
+	protected final String TEXT_22 = NL + "\t * <!-- end-model-doc -->";
+	protected final String TEXT_23 = NL + "\t * @return the value of the '<em>";
+	protected final String TEXT_24 = "</em>' ";
+	protected final String TEXT_25 = NL + "\t * @see ";
+	protected final String TEXT_26 = NL + "\t * @see #isSet";
+	protected final String TEXT_27 = "()";
+	protected final String TEXT_28 = NL + "\t * @see #unset";
+	protected final String TEXT_29 = NL + "\t * @see #set";
+	protected final String TEXT_30 = "(";
+	protected final String TEXT_31 = ")";
+	protected final String TEXT_32 = "#get";
+	protected final String TEXT_33 = NL + "\t * @model ";
+	protected final String TEXT_34 = NL + "\t *        ";
+	protected final String TEXT_35 = NL + "\t * @model";
+	protected final String TEXT_36 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_37 = NL;
+
+	public ClassgetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_37);
+		stringBuffer.append(TEXT_37);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		if (genFeature.isListType() && genFeature.getEcoreFeature().getEGenericType().getETypeParameter() == null) {
+			if (genFeature.isMapType()) {
+				GenFeature keyFeature = genFeature.getMapEntryTypeGenClass().getMapEntryKeyFeature();
+				GenFeature valueFeature = genFeature.getMapEntryTypeGenClass().getMapEntryValueFeature();
+				stringBuffer.append(TEXT_4);
+				if (keyFeature.isListType()) {
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(keyFeature.getQualifiedListItemType(genClass));
+					stringBuffer.append(TEXT_6);
+				} else {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(keyFeature.getType(genClass));
+					stringBuffer.append(TEXT_6);
+				}
+				stringBuffer.append(TEXT_8);
+				if (valueFeature.isListType()) {
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(valueFeature.getQualifiedListItemType(genClass));
+					stringBuffer.append(TEXT_6);
+				} else {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(valueFeature.getType(genClass));
+					stringBuffer.append(TEXT_6);
+				}
+				stringBuffer.append(TEXT_9);
+			} else if (!genFeature.isWrappedFeatureMapType() && !(genModel.isSuppressEMFMetaData()
+					&& "org.eclipse.emf.ecore.EObject".equals(genFeature.getQualifiedListItemType(genClass)))) {
+				String typeName = genFeature.getQualifiedListItemType(genClass);
+				String head = typeName;
+				String tail = "";
+				int index = typeName.indexOf('<');
+				if (index == -1) {
+					index = typeName.indexOf('[');
+				}
+				if (index != -1) {
+					head = typeName.substring(0, index);
+					tail = "<code>" + CodeGenUtil.xmlEscapeEncode(typeName.substring(index)) + "</code>";
+				}
+
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(head);
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(tail);
+				stringBuffer.append(TEXT_3);
+			}
+		} else if (genFeature.isSetDefaultValue()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getDefaultValue());
+			stringBuffer.append(TEXT_12);
+		}
+		if (genFeature.getTypeGenEnum() != null) {
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genFeature.getTypeGenEnum().getQualifiedName());
+			stringBuffer.append(TEXT_14);
+		}
+		if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) {
+			GenFeature reverseGenFeature = genFeature.getReverse();
+			if (!reverseGenFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(reverseGenFeature.getGenClass().getRawQualifiedInterfaceName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(reverseGenFeature.getGetAccessor());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(reverseGenFeature.getFormattedName());
+				stringBuffer.append(TEXT_18);
+			}
+		}
+		stringBuffer.append(TEXT_19);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lIUAGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_20);
+		if (genFeature.hasDocumentation()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genFeature.getDocumentation(genModel.getIndentation(stringBuffer)));
+			stringBuffer.append(TEXT_22);
+		}
+		stringBuffer.append(TEXT_23);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		if (genFeature.getTypeGenEnum() != null) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genFeature.getTypeGenEnum().getQualifiedName());
+		}
+		if (genFeature.isUnsettable()) {
+			if (!genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_27);
+			}
+			if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_27);
+			}
+		}
+		if (genFeature.isChangeable() && !genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genFeature.getRawImportedBoundType());
+			stringBuffer.append(TEXT_31);
+		}
+		if (!genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genFeature.getFeatureAccessorName());
+			stringBuffer.append(TEXT_27);
+		}
+		if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) {
+			GenFeature reverseGenFeature = genFeature.getReverse();
+			if (!reverseGenFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(reverseGenFeature.getGenClass().getRawQualifiedInterfaceName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(reverseGenFeature.getGetAccessor());
+			}
+		}
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genFeature.getModelInfo(),
+					"\n\r"); stringTokenizer.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_35);
+			}
+		}
+		stringBuffer.append(TEXT_36);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureoverride.java
new file mode 100644
index 0000000..7dc76a8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeatureoverride.java
@@ -0,0 +1,994 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassgetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgetGenFeatureoverride result = new ClassgetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\t";
+	protected final String TEXT_8 = " ";
+	protected final String TEXT_9 = "();" + NL;
+	protected final String TEXT_10 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_11 = NL + "\t@Override";
+	protected final String TEXT_12 = NL + "\tpublic ";
+	protected final String TEXT_13 = "_";
+	protected final String TEXT_14 = "()" + NL + "\t{";
+	protected final String TEXT_15 = NL + "\t\treturn ";
+	protected final String TEXT_16 = "(";
+	protected final String TEXT_17 = ")eDynamicGet(";
+	protected final String TEXT_18 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_19 = ", ";
+	protected final String TEXT_20 = ", true, ";
+	protected final String TEXT_21 = ")";
+	protected final String TEXT_22 = ").";
+	protected final String TEXT_23 = "()";
+	protected final String TEXT_24 = ";";
+	protected final String TEXT_25 = NL + "\t\t";
+	protected final String TEXT_26 = ")eGet(";
+	protected final String TEXT_27 = ", true)";
+	protected final String TEXT_28 = "__ESETTING_DELEGATE.dynamicGet(this, null, 0, true, false)";
+	protected final String TEXT_29 = " = (";
+	protected final String TEXT_30 = ")eVirtualGet(";
+	protected final String TEXT_31 = ");";
+	protected final String TEXT_32 = NL + "\t\tif (";
+	protected final String TEXT_33 = " == null)" + NL + "\t\t{";
+	protected final String TEXT_34 = NL + "\t\t\teVirtualSet(";
+	protected final String TEXT_35 = " = new ";
+	protected final String TEXT_36 = NL + "\t\t\t";
+	protected final String TEXT_37 = NL + "\t\t}" + NL + "\t\treturn ";
+	protected final String TEXT_38 = NL + "\t\tif (eContainerFeatureID() != ";
+	protected final String TEXT_39 = ") return null;" + NL + "\t\treturn (";
+	protected final String TEXT_40 = "eContainer";
+	protected final String TEXT_41 = "eInternalContainer";
+	protected final String TEXT_42 = "();";
+	protected final String TEXT_43 = " != null && ";
+	protected final String TEXT_44 = ".eIsProxy())" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_45 = " old";
+	protected final String TEXT_46 = " = ";
+	protected final String TEXT_47 = ";" + NL + "\t\t\t";
+	protected final String TEXT_48 = "eResolveProxy(old";
+	protected final String TEXT_49 = ");" + NL + "\t\t\tif (";
+	protected final String TEXT_50 = " != old";
+	protected final String TEXT_51 = ")" + NL + "\t\t\t{";
+	protected final String TEXT_52 = NL + "\t\t\t\t";
+	protected final String TEXT_53 = " new";
+	protected final String TEXT_54 = " msgs = old";
+	protected final String TEXT_55 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_56 = ", null, null);";
+	protected final String TEXT_57 = " msgs =  old";
+	protected final String TEXT_58 = ".eInverseRemove(this, ";
+	protected final String TEXT_59 = ".class, null);";
+	protected final String TEXT_60 = NL + "\t\t\t\tif (new";
+	protected final String TEXT_61 = ".eInternalContainer() == null)" + NL + "\t\t\t\t{";
+	protected final String TEXT_62 = NL + "\t\t\t\t\tmsgs = new";
+	protected final String TEXT_63 = ".eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_64 = ", null, msgs);";
+	protected final String TEXT_65 = NL + "\t\t\t\t\tmsgs =  new";
+	protected final String TEXT_66 = ".eInverseAdd(this, ";
+	protected final String TEXT_67 = ".class, msgs);";
+	protected final String TEXT_68 = NL + "\t\t\t\t}" + NL + "\t\t\t\tif (msgs != null) msgs.dispatch();";
+	protected final String TEXT_69 = NL + "\t\t\t\teVirtualSet(";
+	protected final String TEXT_70 = NL + "\t\t\t\tif (eNotificationRequired())" + NL + "\t\t\t\t\teNotify(new ";
+	protected final String TEXT_71 = "(this, ";
+	protected final String TEXT_72 = ".RESOLVE, ";
+	protected final String TEXT_73 = ", old";
+	protected final String TEXT_74 = "));";
+	protected final String TEXT_75 = NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_76 = NL + "\t\treturn (";
+	protected final String TEXT_77 = " & ";
+	protected final String TEXT_78 = "_EFLAG) != 0;";
+	protected final String TEXT_79 = "_EFLAG_VALUES[(";
+	protected final String TEXT_80 = "_EFLAG) >>> ";
+	protected final String TEXT_81 = "_EFLAG_OFFSET];";
+	protected final String TEXT_82 = " = basicGet";
+	protected final String TEXT_83 = "();" + NL + "\t\treturn ";
+	protected final String TEXT_84 = ".eIsProxy() ? ";
+	protected final String TEXT_85 = "eResolveProxy(";
+	protected final String TEXT_86 = ") : ";
+	protected final String TEXT_87 = NL + "\t\treturn new ";
+	protected final String TEXT_88 = "((";
+	protected final String TEXT_89 = ".Internal)((";
+	protected final String TEXT_90 = ".Internal.Wrapper)get";
+	protected final String TEXT_91 = "()).featureMap().";
+	protected final String TEXT_92 = "list(";
+	protected final String TEXT_93 = ")get";
+	protected final String TEXT_94 = "().";
+	protected final String TEXT_95 = NL + "\t\treturn ((";
+	protected final String TEXT_96 = "()).featureMap().list(";
+	protected final String TEXT_97 = NL + "\t\treturn get";
+	protected final String TEXT_98 = "().list(";
+	protected final String TEXT_99 = "()).featureMap().get(";
+	protected final String TEXT_100 = "get";
+	protected final String TEXT_101 = "().get(";
+	protected final String TEXT_102 = NL + "\t}" + NL;
+	protected final String TEXT_103 = NL;
+
+	public ClassgetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_103);
+		stringBuffer.append(TEXT_103);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0kroEGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/getGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lIUFGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_9);
+		} else {
+			if (genModel.useGenerics() && ((genFeature.isContainer() || genFeature.isResolveProxies())
+					&& !genFeature.isListType() && genFeature.isUncheckedCast(genClass)
+					|| genFeature.isListType() && !genFeature.isFeatureMapType()
+							&& (genModel.isReflectiveDelegation() || genModel.isVirtualDelegation()
+									|| (genModel.isDynamicDelegation() && !genFeature.isVolatile()))
+					|| genFeature.isListDataType() && genFeature.hasDelegateFeature()
+					|| genFeature.isListType() && genFeature.hasSettingDelegate())) {
+				stringBuffer.append(TEXT_10);
+			}
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingGetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getGetAccessor());
+			if (genClass.hasCollidingGetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_13);
+			}
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lSFDGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_15);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_16);
+				}
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(!genFeature.isEffectiveSuppressEMFTypes());
+				stringBuffer.append(TEXT_21);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genFeature.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_23);
+				}
+				stringBuffer.append(TEXT_24);
+			} else if (genModel.isReflectiveDelegation()) {
+				if (genFeature.hasGetterBody()) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getGetterBody(genModel.getIndentation(stringBuffer)));
+				} else {
+					stringBuffer.append(TEXT_15);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_27);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genFeature.getPrimitiveValueFunction());
+						stringBuffer.append(TEXT_23);
+					}
+					stringBuffer.append(TEXT_24);
+				}
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_15);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_16);
+				}
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_28);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genFeature.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_23);
+				}
+				stringBuffer.append(TEXT_24);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isListType()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_25);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_8);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_31);
+					}
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_33);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_19);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_35);
+						stringBuffer.append(genClass.getListConstructor(genFeature));
+						stringBuffer.append(TEXT_31);
+					} else {
+						stringBuffer.append(TEXT_36);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_35);
+						stringBuffer.append(genClass.getListConstructor(genFeature));
+						stringBuffer.append(TEXT_24);
+					}
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer
+							.append(genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : "");
+					stringBuffer.append(TEXT_24);
+				} else if (genFeature.isContainer()) {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_21);
+					if (genFeature.isResolveProxies()) {
+						stringBuffer.append(TEXT_40);
+					} else {
+						stringBuffer.append(TEXT_41);
+					}
+					stringBuffer.append(TEXT_42);
+				} else {
+					if (genFeature.isResolveProxies()) {
+						if (genModel.isVirtualDelegation()) {
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_8);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_29);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_30);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							if (genFeature.hasEDefault()) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getEDefault());
+							}
+							stringBuffer.append(TEXT_31);
+						}
+						stringBuffer.append(TEXT_32);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getSafeNameAsEObject());
+						stringBuffer.append(TEXT_44);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), false));
+						stringBuffer.append(TEXT_47);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(genFeature.getNonEObjectInternalTypeCast(genClass));
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_51);
+						if (genFeature.isEffectiveContains()) {
+							stringBuffer.append(TEXT_52);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+							stringBuffer.append(TEXT_53);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_46);
+							stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), false));
+							stringBuffer.append(TEXT_24);
+							if (!genFeature.isBidirectional()) {
+								stringBuffer.append(TEXT_52);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+								stringBuffer.append(TEXT_54);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_55);
+								stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+								stringBuffer.append(negativeOffsetCorrection);
+								stringBuffer.append(TEXT_56);
+							} else {
+								GenFeature reverseFeature = genFeature.getReverse();
+								GenClass targetClass = reverseFeature.getGenClass();
+								String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+										? " + " + genClass.getOffsetCorrectionField(genFeature)
+										: "";
+								stringBuffer.append(TEXT_52);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+								stringBuffer.append(TEXT_57);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_58);
+								stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+								stringBuffer.append(reverseOffsetCorrection);
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(targetClass.getRawImportedInterfaceName());
+								stringBuffer.append(TEXT_59);
+							}
+							stringBuffer.append(TEXT_60);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_61);
+							if (!genFeature.isBidirectional()) {
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_63);
+								stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+								stringBuffer.append(negativeOffsetCorrection);
+								stringBuffer.append(TEXT_64);
+							} else {
+								GenFeature reverseFeature = genFeature.getReverse();
+								GenClass targetClass = reverseFeature.getGenClass();
+								String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+										? " + " + genClass.getOffsetCorrectionField(genFeature)
+										: "";
+								stringBuffer.append(TEXT_65);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+								stringBuffer.append(reverseOffsetCorrection);
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(targetClass.getRawImportedInterfaceName());
+								stringBuffer.append(TEXT_67);
+							}
+							stringBuffer.append(TEXT_68);
+						} else if (genModel.isVirtualDelegation()) {
+							stringBuffer.append(TEXT_69);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_31);
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_70);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_71);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_72);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_73);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_74);
+						}
+						stringBuffer.append(TEXT_75);
+					}
+					if (!genFeature.isResolveProxies() && genModel.isVirtualDelegation()
+							&& !genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						if (genFeature.hasEDefault()) {
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(genFeature.getEDefault());
+						}
+						stringBuffer.append(TEXT_31);
+					} else if (genClass.isFlag(genFeature)) {
+						if (genFeature.isBooleanType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_78);
+						} else {
+							stringBuffer.append(TEXT_15);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_79);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_80);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_81);
+						}
+					} else {
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_24);
+					}
+				}
+			} else {//volatile
+				if (genFeature.isResolveProxies() && !genFeature.isListType()) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_82);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genFeature.getSafeNameAsEObject());
+					stringBuffer.append(TEXT_84);
+					stringBuffer.append(genFeature.getNonEObjectInternalTypeCast(genClass));
+					stringBuffer.append(TEXT_85);
+					stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), false));
+					stringBuffer.append(TEXT_86);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_24);
+				} else if (genFeature.hasDelegateFeature()) {
+					GenFeature delegateFeature = genFeature.getDelegateFeature();
+					if (genFeature.isFeatureMapType()) {
+						String featureMapEntryTemplateArgument = isJDK50
+								? "<" + genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap") + ".Entry>"
+								: "";
+						if (delegateFeature.isWrappedFeatureMapType()) {
+							stringBuffer.append(TEXT_87);
+							stringBuffer.append(genFeature.getImportedEffectiveFeatureMapWrapperClass());
+							stringBuffer.append(TEXT_88);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_90);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_91);
+							stringBuffer.append(featureMapEntryTemplateArgument);
+							stringBuffer.append(TEXT_92);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_74);
+						} else {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_93);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_94);
+							stringBuffer.append(featureMapEntryTemplateArgument);
+							stringBuffer.append(TEXT_92);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_31);
+						}
+					} else if (genFeature.isListType()) {
+						if (delegateFeature.isWrappedFeatureMapType()) {
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_90);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_96);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_31);
+						} else {
+							stringBuffer.append(TEXT_97);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_98);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_31);
+						}
+					} else {
+						if (delegateFeature.isWrappedFeatureMapType()) {
+							stringBuffer.append(TEXT_15);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_16);
+							}
+							if (genFeature.getTypeGenDataType() == null
+									|| !genFeature.getTypeGenDataType().isObjectType()) {
+								stringBuffer.append(TEXT_16);
+								stringBuffer.append(genFeature.getObjectType(genClass));
+								stringBuffer.append(TEXT_21);
+							}
+							stringBuffer.append(TEXT_88);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_90);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_99);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_27);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_22);
+								stringBuffer.append(genFeature.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_23);
+							}
+							stringBuffer.append(TEXT_24);
+						} else {
+							stringBuffer.append(TEXT_15);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_16);
+							}
+							if (genFeature.getTypeGenDataType() == null
+									|| !genFeature.getTypeGenDataType().isObjectType()) {
+								stringBuffer.append(TEXT_16);
+								stringBuffer.append(genFeature.getObjectType(genClass));
+								stringBuffer.append(TEXT_21);
+							}
+							stringBuffer.append(TEXT_100);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_101);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_27);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_22);
+								stringBuffer.append(genFeature.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_23);
+							}
+							stringBuffer.append(TEXT_24);
+						}
+					}
+				} else if (genClass.getGetAccessorOperation(genFeature) != null) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genClass.getGetAccessorOperation(genFeature)
+							.getBody(genModel.getIndentation(stringBuffer)));
+				} else if (genFeature.hasGetterBody()) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getGetterBody(genModel.getIndentation(stringBuffer)));
+				} else {
+					stringBuffer.append(TEXT_2);
+					{
+						//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+						InternalPatternContext ictx = (InternalPatternContext) ctx;
+						new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+						stringBuffer.setLength(0);
+
+						final Map<String, Object> callParameters = new HashMap<String, Object>();
+						callParameters.put("genFeature", genFeature);
+						callParameters.put("genClass", genClass);
+						callParameters.put("genPackage", genPackage);
+						callParameters.put("genModel", genModel);
+						callParameters.put("isJDK50", isJDK50);
+						callParameters.put("isInterface", isInterface);
+						callParameters.put("isImplementation", isImplementation);
+						callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+						callParameters.put("isGWT", isGWT);
+						callParameters.put("forceDefaultCase", forceDefaultCase);
+						callParameters.put("indentDefaultCase", indentDefaultCase);
+						callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+						callParameters.put("singleWildcard", singleWildcard);
+						callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+						callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+						callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+						callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+						CallHelper.executeWithParameterInjection(
+								"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0lbPAWJ-Ed-FqczH3ESmRw",
+								new ExecutionContext((InternalPatternContext) ctx), callParameters);
+						stringBuffer.setLength(0);
+					}
+
+					//Class/getGenFeature.todo.override.javajetinc
+				}
+			}
+			stringBuffer.append(TEXT_102);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturepreinsert.java
new file mode 100644
index 0000000..e0bf91f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassgetGenFeaturepreinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassgetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized ClassgetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassgetGenFeaturepreinsert result = new ClassgetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassgetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassimplementedGenOperationTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassimplementedGenOperationTODOoverride.java
new file mode 100644
index 0000000..75d7dd4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassimplementedGenOperationTODOoverride.java
@@ -0,0 +1,320 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassimplementedGenOperationTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassimplementedGenOperationTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassimplementedGenOperationTODOoverride result = new ClassimplementedGenOperationTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public ClassimplementedGenOperationTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/Classinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/Classinsert.java
new file mode 100644
index 0000000..eaadb16
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/Classinsert.java
@@ -0,0 +1,304 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Classinsert {
+	protected static String nl;
+
+	public static synchronized Classinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		Classinsert result = new Classinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public Classinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/Classinterfacejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/Classinterfacejavadocoverride.java
new file mode 100644
index 0000000..5fce59a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/Classinterfacejavadocoverride.java
@@ -0,0 +1,384 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Classinterfacejavadocoverride {
+	protected static String nl;
+
+	public static synchronized Classinterfacejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		Classinterfacejavadocoverride result = new Classinterfacejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A representation of the model object '<em><b>";
+	protected final String TEXT_2 = "</b></em>'." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_3 = NL + " *" + NL + " * <!-- begin-model-doc -->" + NL + " * ";
+	protected final String TEXT_4 = NL + " * <!-- end-model-doc -->";
+	protected final String TEXT_5 = NL + " *";
+	protected final String TEXT_6 = NL + " * <p>" + NL + " * The following features are supported:" + NL + " * </p>"
+			+ NL + " * <ul>";
+	protected final String TEXT_7 = NL + " *   <li>{@link ";
+	protected final String TEXT_8 = "#";
+	protected final String TEXT_9 = " <em>";
+	protected final String TEXT_10 = "</em>}</li>";
+	protected final String TEXT_11 = NL + " * </ul>";
+	protected final String TEXT_12 = NL + " * @see ";
+	protected final String TEXT_13 = "#get";
+	protected final String TEXT_14 = "()";
+	protected final String TEXT_15 = NL + " * @model ";
+	protected final String TEXT_16 = NL + " *        ";
+	protected final String TEXT_17 = NL + " * @model";
+	protected final String TEXT_18 = NL + " * @extends ";
+	protected final String TEXT_19 = NL + " * ";
+	protected final String TEXT_20 = NL + " * @generated" + NL + " */" + NL;
+	protected final String TEXT_21 = NL;
+
+	public Classinterfacejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(TEXT_21);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		if (genClass.hasDocumentation()) {
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genClass.getDocumentation(genModel.getIndentation(stringBuffer)));
+			stringBuffer.append(TEXT_4);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genClass.getGenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_6);
+			for (GenFeature genFeature : genClass.getGenFeatures()) {
+				if (!genFeature.isSuppressedGetVisibility()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_10);
+				}
+			}
+			stringBuffer.append(TEXT_11);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genClass.getClassifierAccessorName());
+			stringBuffer.append(TEXT_14);
+		}
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer
+					.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_17);
+			}
+		}
+		if (genClass.needsRootExtendsInterfaceExtendsTag()) {
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getImportedName(genModel.getRootExtendsInterface()));
+		}
+		if (genClass.hasImplicitAPITags(true)) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer), true));
+		}
+		stringBuffer.append(TEXT_20);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..c3b25e7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureTODOoverride.java
@@ -0,0 +1,326 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassisSetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassisSetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassisSetGenFeatureTODOoverride result = new ClassisSetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to return whether the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = " is set" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public ClassisSetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..9184030
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassisSetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassisSetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassisSetGenFeatureannotationsinsert result = new ClassisSetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassisSetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..6cdbdaa
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassisSetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized ClassisSetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassisSetGenFeaturejavadocinsert result = new ClassisSetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassisSetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..1ef5ce4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeaturejavadocoverride.java
@@ -0,0 +1,399 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassisSetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized ClassisSetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassisSetGenFeaturejavadocoverride result = new ClassisSetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Returns whether the value of the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = " <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = " is set.";
+	protected final String TEXT_6 = NL;
+	protected final String TEXT_7 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return whether the value of the '<em>";
+	protected final String TEXT_8 = "</em>' ";
+	protected final String TEXT_9 = NL + "\t * @see #unset";
+	protected final String TEXT_10 = "()";
+	protected final String TEXT_11 = NL + "\t * @see #";
+	protected final String TEXT_12 = NL + "\t * @see #set";
+	protected final String TEXT_13 = "(";
+	protected final String TEXT_14 = ")";
+	protected final String TEXT_15 = NL + "\t * ";
+	protected final String TEXT_16 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_17 = NL;
+
+	public ClassisSetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(TEXT_17);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_6);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0sb14GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_10);
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_10);
+		if (!genFeature.isListType() && genFeature.isChangeable() && !genFeature.isSuppressedSetVisibility()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genFeature.getRawImportedBoundType());
+			stringBuffer.append(TEXT_14);
+		}
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_16);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureoverride.java
new file mode 100644
index 0000000..9456c3d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassisSetGenFeatureoverride.java
@@ -0,0 +1,573 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassisSetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassisSetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassisSetGenFeatureoverride result = new ClassisSetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\tboolean isSet";
+	protected final String TEXT_8 = "();" + NL;
+	protected final String TEXT_9 = NL + "\t@Override";
+	protected final String TEXT_10 = NL + "\tpublic boolean isSet";
+	protected final String TEXT_11 = "_";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t\treturn eDynamicIsSet(";
+	protected final String TEXT_14 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_15 = ", ";
+	protected final String TEXT_16 = ");";
+	protected final String TEXT_17 = NL + "\t\treturn eIsSet(";
+	protected final String TEXT_18 = NL + "\t\treturn ";
+	protected final String TEXT_19 = "__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);";
+	protected final String TEXT_20 = NL + "\t\t";
+	protected final String TEXT_21 = " ";
+	protected final String TEXT_22 = " = (";
+	protected final String TEXT_23 = ")eVirtualGet(";
+	protected final String TEXT_24 = " != null && ((";
+	protected final String TEXT_25 = ".Unsettable";
+	protected final String TEXT_26 = ")";
+	protected final String TEXT_27 = ").isSet();";
+	protected final String TEXT_28 = NL + "\t\treturn eVirtualIsSet(";
+	protected final String TEXT_29 = NL + "\t\treturn (";
+	protected final String TEXT_30 = " & ";
+	protected final String TEXT_31 = "_ESETFLAG) != 0;";
+	protected final String TEXT_32 = "ESet;";
+	protected final String TEXT_33 = NL + "\t\treturn !((";
+	protected final String TEXT_34 = ".Internal)((";
+	protected final String TEXT_35 = ".Internal.Wrapper)get";
+	protected final String TEXT_36 = "()).featureMap()).isEmpty(";
+	protected final String TEXT_37 = ".Internal)get";
+	protected final String TEXT_38 = "()).isEmpty(";
+	protected final String TEXT_39 = NL + "\t}" + NL;
+	protected final String TEXT_40 = NL;
+
+	public ClassisSetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_40);
+		stringBuffer.append(TEXT_40);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0sSE4GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/isSetGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/isSetGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0sk_0GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_8);
+		} else {
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingIsSetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getAccessorName());
+			if (genClass.hasCollidingIsSetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_14);
+				}
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genModel.isReflectiveDelegation()) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_19);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isListType()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(singleWildcard);
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_27);
+				} else {
+					if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					} else if (genClass.isESetFlag(genFeature)) {
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(genClass.getESetFlagsField(genFeature));
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_31);
+					} else {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getUncapName());
+						stringBuffer.append(TEXT_32);
+					}
+				}
+			} else if (genFeature.hasDelegateFeature()) {
+				GenFeature delegateFeature = genFeature.getDelegateFeature();
+				if (delegateFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				} else {
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				}
+			} else if (genClass.getIsSetAccessorOperation(genFeature) != null) {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(
+						genClass.getIsSetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer)));
+			} else {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0suw0GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/isSetGenFeature.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_39);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassreflectiveDelegationoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassreflectiveDelegationoverride.java
new file mode 100644
index 0000000..c96e088
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassreflectiveDelegationoverride.java
@@ -0,0 +1,338 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassreflectiveDelegationoverride {
+	protected static String nl;
+
+	public static synchronized ClassreflectiveDelegationoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassreflectiveDelegationoverride result = new ClassreflectiveDelegationoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected static final int ESTATIC_FEATURE_COUNT = ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_5 = NL + "\t@Override";
+	protected final String TEXT_6 = NL + "\tprotected int eStaticFeatureCount()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_7 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_8 = NL;
+	protected final String TEXT_9 = NL;
+
+	public ClassreflectiveDelegationoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(TEXT_9);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isImplementation
+				&& (genModel.getFeatureDelegation() == GenDelegationKind.REFLECTIVE_LITERAL
+						|| genModel.isDynamicDelegation())
+				&& (genClass.getClassExtendsGenClass() == null || (genClass.getClassExtendsGenClass().getGenModel()
+						.getFeatureDelegation() != GenDelegationKind.REFLECTIVE_LITERAL
+						&& !genClass.getClassExtendsGenClass().getGenModel().isDynamicDelegation()))) {
+			if (genClass.hasStaticFeatures()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(genClass.getClassExtendsGenClass() == null ? 0
+						: genClass.getClassExtendsGenClass().getAllGenFeatures().size());
+				stringBuffer.append(TEXT_3);
+			}
+			stringBuffer.append(TEXT_4);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_5);
+			}
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genClass.getClassExtendsGenClass() == null ? "0"
+					: genClass.hasStaticFeatures() ? "ESTATIC_FEATURE_COUNT"
+							: Integer.toString(genClass.getClassExtendsGenClass().getAllGenFeatures().size()));
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..adf35e7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureTODOoverride.java
@@ -0,0 +1,338 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeatureTODOoverride result = new ClasssetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to set the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public ClasssetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..6f1d25d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeatureannotationsinsert result = new ClasssetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClasssetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..d8faa4b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeaturejavadocinsert result = new ClasssetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClasssetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..2769fcf
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturejavadocoverride.java
@@ -0,0 +1,402 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeaturejavadocoverride result = new ClasssetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Sets the value of the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = " <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = ".";
+	protected final String TEXT_6 = NL;
+	protected final String TEXT_7 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param value the new value of the '<em>";
+	protected final String TEXT_8 = "</em>' ";
+	protected final String TEXT_9 = NL + "\t * @see ";
+	protected final String TEXT_10 = NL + "\t * @see #isSet";
+	protected final String TEXT_11 = "()";
+	protected final String TEXT_12 = NL + "\t * @see #unset";
+	protected final String TEXT_13 = NL + "\t * @see #";
+	protected final String TEXT_14 = NL + "\t * ";
+	protected final String TEXT_15 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_16 = NL;
+
+	public ClasssetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(TEXT_16);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_6);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0ng5oGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.isEnumType()) {
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getTypeGenEnum().getQualifiedName());
+		}
+		if (genFeature.isUnsettable()) {
+			if (!genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_11);
+			}
+			if (!genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_11);
+			}
+		}
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_11);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureoverride.java
new file mode 100644
index 0000000..d73672f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeatureoverride.java
@@ -0,0 +1,1235 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeatureoverride result = new ClasssetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\tvoid set";
+	protected final String TEXT_8 = "(";
+	protected final String TEXT_9 = " value);" + NL;
+	protected final String TEXT_10 = NL + "\t@Override";
+	protected final String TEXT_11 = NL + "\tpublic void set";
+	protected final String TEXT_12 = "_";
+	protected final String TEXT_13 = " ";
+	protected final String TEXT_14 = ")" + NL + "\t{";
+	protected final String TEXT_15 = NL + "\t\teDynamicSet(";
+	protected final String TEXT_16 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_17 = ", ";
+	protected final String TEXT_18 = "new ";
+	protected final String TEXT_19 = "new";
+	protected final String TEXT_20 = ")";
+	protected final String TEXT_21 = ");";
+	protected final String TEXT_22 = NL + "\t\teSet(";
+	protected final String TEXT_23 = NL + "\t\t";
+	protected final String TEXT_24 = "__ESETTING_DELEGATE.dynamicSet(this, null, 0, ";
+	protected final String TEXT_25 = NL + "\t\tif (new";
+	protected final String TEXT_26 = " != eInternalContainer() || (eContainerFeatureID() != ";
+	protected final String TEXT_27 = " && new";
+	protected final String TEXT_28 = " != null))" + NL + "\t\t{" + NL + "\t\t\tif (";
+	protected final String TEXT_29 = ".isAncestor(this, ";
+	protected final String TEXT_30 = "))" + NL + "\t\t\t\tthrow new ";
+	protected final String TEXT_31 = "(\"Recursive containment not allowed for \" + toString());";
+	protected final String TEXT_32 = NL + "\t\t\t";
+	protected final String TEXT_33 = " msgs = null;" + NL + "\t\t\tif (eInternalContainer() != null)" + NL
+			+ "\t\t\t\tmsgs = eBasicRemoveFromContainer(msgs);" + NL + "\t\t\tif (new";
+	protected final String TEXT_34 = " != null)" + NL + "\t\t\t\tmsgs = ";
+	protected final String TEXT_35 = ".eInverseAdd(this, ";
+	protected final String TEXT_36 = ".class, msgs);" + NL + "\t\t\tmsgs = basicSet";
+	protected final String TEXT_37 = ", msgs);" + NL + "\t\t\tif (msgs != null) msgs.dispatch();" + NL + "\t\t}";
+	protected final String TEXT_38 = NL + "\t\telse if (eNotificationRequired())" + NL + "\t\t\teNotify(new ";
+	protected final String TEXT_39 = "(this, ";
+	protected final String TEXT_40 = ".SET, ";
+	protected final String TEXT_41 = ", new";
+	protected final String TEXT_42 = "));";
+	protected final String TEXT_43 = " = (";
+	protected final String TEXT_44 = ")eVirtualGet(";
+	protected final String TEXT_45 = " != ";
+	protected final String TEXT_46 = ")" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_47 = " msgs = null;" + NL + "\t\t\tif (";
+	protected final String TEXT_48 = " != null)";
+	protected final String TEXT_49 = NL + "\t\t\t\tmsgs = ";
+	protected final String TEXT_50 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_51 = ", null, msgs);" + NL + "\t\t\tif (new";
+	protected final String TEXT_52 = ".eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_53 = ", null, msgs);";
+	protected final String TEXT_54 = ".eInverseRemove(this, ";
+	protected final String TEXT_55 = ".class, msgs);" + NL + "\t\t\tif (new";
+	protected final String TEXT_56 = ".class, msgs);";
+	protected final String TEXT_57 = NL + "\t\t\tmsgs = basicSet";
+	protected final String TEXT_58 = NL + "\t\telse" + NL + "\t\t{";
+	protected final String TEXT_59 = NL + "\t\t\tboolean old";
+	protected final String TEXT_60 = "ESet = eVirtualIsSet(";
+	protected final String TEXT_61 = "ESet = (";
+	protected final String TEXT_62 = " & ";
+	protected final String TEXT_63 = "_ESETFLAG) != 0;";
+	protected final String TEXT_64 = " |= ";
+	protected final String TEXT_65 = "_ESETFLAG;";
+	protected final String TEXT_66 = "ESet = ";
+	protected final String TEXT_67 = "ESet;";
+	protected final String TEXT_68 = "ESet = true;";
+	protected final String TEXT_69 = NL + "\t\t\tif (eNotificationRequired())" + NL + "\t\t\t\teNotify(new ";
+	protected final String TEXT_70 = ", !old";
+	protected final String TEXT_71 = "ESet));";
+	protected final String TEXT_72 = NL + "\t\t}";
+	protected final String TEXT_73 = " old";
+	protected final String TEXT_74 = "_EFLAG) != 0;";
+	protected final String TEXT_75 = " = ";
+	protected final String TEXT_76 = "_EFLAG_VALUES[(";
+	protected final String TEXT_77 = "_EFLAG) >>> ";
+	protected final String TEXT_78 = "_EFLAG_OFFSET];";
+	protected final String TEXT_79 = ") ";
+	protected final String TEXT_80 = "_EFLAG; else ";
+	protected final String TEXT_81 = " &= ~";
+	protected final String TEXT_82 = "_EFLAG;";
+	protected final String TEXT_83 = " == null) new";
+	protected final String TEXT_84 = "_EDEFAULT;" + NL + "\t\t";
+	protected final String TEXT_85 = " & ~";
+	protected final String TEXT_86 = "_EFLAG | ";
+	protected final String TEXT_87 = ".ordinal()";
+	protected final String TEXT_88 = ".VALUES.indexOf(new";
+	protected final String TEXT_89 = " << ";
+	protected final String TEXT_90 = "_EFLAG_OFFSET;";
+	protected final String TEXT_91 = ";";
+	protected final String TEXT_92 = " = new";
+	protected final String TEXT_93 = " == null ? ";
+	protected final String TEXT_94 = " : new";
+	protected final String TEXT_95 = NL + "\t\tObject old";
+	protected final String TEXT_96 = " = eVirtualSet(";
+	protected final String TEXT_97 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_98 = " == EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_99 = NL + "\t\tboolean old";
+	protected final String TEXT_100 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t\teNotify(new ";
+	protected final String TEXT_101 = "isSetChange ? ";
+	protected final String TEXT_102 = " : old";
+	protected final String TEXT_103 = "old";
+	protected final String TEXT_104 = "isSetChange";
+	protected final String TEXT_105 = "!old";
+	protected final String TEXT_106 = "ESet";
+	protected final String TEXT_107 = " == EVIRTUAL_NO_VALUE ? ";
+	protected final String TEXT_108 = NL + "\t\t((";
+	protected final String TEXT_109 = ".Internal)((";
+	protected final String TEXT_110 = ".Internal.Wrapper)get";
+	protected final String TEXT_111 = "()).featureMap()).set(";
+	protected final String TEXT_112 = ".Internal)get";
+	protected final String TEXT_113 = "()).set(";
+	protected final String TEXT_114 = NL + "\t}" + NL;
+	protected final String TEXT_115 = NL;
+
+	public ClasssetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_115);
+		stringBuffer.append(TEXT_115);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0nXIoGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/setGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0nqqoGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_9);
+		} else {
+			GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingSetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedSetVisibility()) {
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getAccessorName());
+			if (genClass.hasCollidingSetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_12);
+			}
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(setAccessorOperation == null ? "new" + genFeature.getCapName()
+					: setAccessorOperation.getGenParameters().get(0).getName());
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("setAccessorOperation", setAccessorOperation);
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0nz0kGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicSetGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_Y__lwCSWEemxeP6B0lLOpA",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_16);
+				}
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_17);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getCapName());
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicSetGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_ZGGNwCSWEemxeP6B0lLOpA",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			} else if (genModel.isReflectiveDelegation()) {
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_17);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getCapName());
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_21);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_24);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getCapName());
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_21);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isContainer()) {
+					GenFeature reverseFeature = genFeature.getReverse();
+					GenClass targetClass = reverseFeature.getGenClass();
+					String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+							? " + " + genClass.getOffsetCorrectionField(genFeature)
+							: "";
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_27);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil"));
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genFeature.getEObjectCast());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genModel.getImportedName("java.lang.IllegalArgumentException"));
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true));
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+					stringBuffer.append(reverseOffsetCorrection);
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(targetClass.getRawImportedInterfaceName());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getInternalTypeCast());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_37);
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_42);
+					}
+				} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_13);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_44);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_21);
+					}
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_48);
+					if (!genFeature.isBidirectional()) {
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true));
+						stringBuffer.append(TEXT_52);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_53);
+					} else {
+						GenFeature reverseFeature = genFeature.getReverse();
+						GenClass targetClass = reverseFeature.getGenClass();
+						String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+								? " + " + genClass.getOffsetCorrectionField(genFeature)
+								: "";
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_54);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_55);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true));
+						stringBuffer.append(TEXT_35);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_56);
+					}
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getInternalTypeCast());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_37);
+					if (genFeature.isUnsettable()) {
+						stringBuffer.append(TEXT_58);
+						if (genModel.isVirtualDelegation()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_60);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_21);
+						} else if (genClass.isESetFlag(genFeature)) {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_59);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_61);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_63);
+							}
+							stringBuffer.append(TEXT_32);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_64);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_65);
+						} else {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_59);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_67);
+							}
+							stringBuffer.append(TEXT_32);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_68);
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_69);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_70);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_71);
+						}
+						stringBuffer.append(TEXT_72);
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_38);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_42);
+						}
+					}
+				} else {
+					if (genClass.isFlag(genFeature)) {
+						if (!genModel.isSuppressNotification()) {
+							if (genFeature.isBooleanType()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_74);
+							} else {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_78);
+							}
+						}
+						if (genFeature.isBooleanType()) {
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_79);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_64);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_80);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_81);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_82);
+						} else {
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_75);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_84);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_75);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_85);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_86);
+							if (isJDK50) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_87);
+							} else {
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_88);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_20);
+							}
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_90);
+						}
+					} else {
+						if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_91);
+							}
+						}
+						if (genFeature.isEnumType()) {
+							if (genModel.isVirtualDelegation()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_13);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_93);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_94);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							} else {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_93);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_94);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							}
+						} else {
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_13);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getInternalTypeCast());
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							} else {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getInternalTypeCast());
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							}
+						}
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_96);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_17);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_21);
+						}
+					}
+					if (genFeature.isUnsettable()) {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_97);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_98);
+						} else if (genClass.isESetFlag(genFeature)) {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_61);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_63);
+							}
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_64);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_65);
+						} else {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_67);
+							}
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_68);
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_100);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_17);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_101);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_102);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(TEXT_103);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_17);
+							if (genClass.isFlag(genFeature)) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(genFeature.getSafeName());
+							}
+							stringBuffer.append(TEXT_17);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_104);
+							} else {
+								stringBuffer.append(TEXT_105);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_106);
+							}
+							stringBuffer.append(TEXT_42);
+						}
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_100);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_17);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_103);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_107);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_102);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(TEXT_103);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_17);
+							if (genClass.isFlag(genFeature)) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(genFeature.getSafeName());
+							}
+							stringBuffer.append(TEXT_42);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0qMaMGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			} else if (genFeature.hasDelegateFeature()) {
+				GenFeature delegateFeature = genFeature.getDelegateFeature();
+				if (delegateFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_108);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_109);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_110);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_111);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_17);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_8);
+					}
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_20);
+					}
+					stringBuffer.append(TEXT_21);
+				} else {
+					stringBuffer.append(TEXT_108);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_112);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_113);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_17);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_8);
+					}
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_20);
+					}
+					stringBuffer.append(TEXT_21);
+				}
+			} else if (setAccessorOperation != null) {
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(setAccessorOperation.getBody(genModel.getIndentation(stringBuffer)));
+			} else {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.TODO.override" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0qMaRWJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/setGenFeature.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_114);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturepostinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturepostinsert.java
new file mode 100644
index 0000000..484bcab
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturepostinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeaturepostinsert {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeaturepostinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeaturepostinsert result = new ClasssetGenFeaturepostinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClasssetGenFeaturepostinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturepreinsert.java
new file mode 100644
index 0000000..f714b77
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClasssetGenFeaturepreinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClasssetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized ClasssetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClasssetGenFeaturepreinsert result = new ClasssetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClasssetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..e05663f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureTODOoverride.java
@@ -0,0 +1,325 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassunsetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized ClassunsetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassunsetGenFeatureTODOoverride result = new ClassunsetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to unset the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public ClassunsetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..d5039c7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassunsetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized ClassunsetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassunsetGenFeatureannotationsinsert result = new ClassunsetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassunsetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..684622d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassunsetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized ClassunsetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassunsetGenFeaturejavadocinsert result = new ClassunsetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ClassunsetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..c3ffbc7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeaturejavadocoverride.java
@@ -0,0 +1,393 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassunsetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized ClassunsetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassunsetGenFeaturejavadocoverride result = new ClassunsetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Unsets the value of the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = " <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = ".";
+	protected final String TEXT_6 = NL;
+	protected final String TEXT_7 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_8 = NL + "\t * @see #isSet";
+	protected final String TEXT_9 = "()";
+	protected final String TEXT_10 = NL + "\t * @see #";
+	protected final String TEXT_11 = NL + "\t * @see #set";
+	protected final String TEXT_12 = "(";
+	protected final String TEXT_13 = ")";
+	protected final String TEXT_14 = NL + "\t * ";
+	protected final String TEXT_15 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_16 = NL;
+
+	public ClassunsetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(TEXT_16);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_6);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0rieAGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_7);
+		if (!genFeature.isSuppressedIsSetVisibility()) {
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_9);
+		if (!genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getRawImportedBoundType());
+			stringBuffer.append(TEXT_13);
+		}
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureoverride.java
new file mode 100644
index 0000000..6029815
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Class/ClassunsetGenFeatureoverride.java
@@ -0,0 +1,887 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Class;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ClassunsetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized ClassunsetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ClassunsetGenFeatureoverride result = new ClassunsetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\tvoid unset";
+	protected final String TEXT_8 = "();" + NL;
+	protected final String TEXT_9 = NL + "\t@Override";
+	protected final String TEXT_10 = NL + "\tpublic void unset";
+	protected final String TEXT_11 = "_";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t\teDynamicUnset(";
+	protected final String TEXT_14 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_15 = ", ";
+	protected final String TEXT_16 = ");";
+	protected final String TEXT_17 = NL + "\t\teUnset(";
+	protected final String TEXT_18 = NL + "\t\t";
+	protected final String TEXT_19 = "__ESETTING_DELEGATE.dynamicUnset(this, null, 0);";
+	protected final String TEXT_20 = " ";
+	protected final String TEXT_21 = " = (";
+	protected final String TEXT_22 = ")eVirtualGet(";
+	protected final String TEXT_23 = NL + "\t\tif (";
+	protected final String TEXT_24 = " != null) ((";
+	protected final String TEXT_25 = ".Unsettable";
+	protected final String TEXT_26 = ")";
+	protected final String TEXT_27 = ").unset();";
+	protected final String TEXT_28 = " != null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_29 = " msgs = null;";
+	protected final String TEXT_30 = NL + "\t\t\tmsgs = ";
+	protected final String TEXT_31 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_32 = ", null, msgs);";
+	protected final String TEXT_33 = ".eInverseRemove(this, ";
+	protected final String TEXT_34 = ".class, msgs);";
+	protected final String TEXT_35 = NL + "\t\t\tmsgs = basicUnset";
+	protected final String TEXT_36 = "(msgs);" + NL + "\t\t\tif (msgs != null) msgs.dispatch();" + NL + "\t\t}" + NL
+			+ "\t\telse" + NL + "\t\t{";
+	protected final String TEXT_37 = NL + "\t\t\tboolean old";
+	protected final String TEXT_38 = "ESet = eVirtualIsSet(";
+	protected final String TEXT_39 = "ESet = (";
+	protected final String TEXT_40 = " & ";
+	protected final String TEXT_41 = "_ESETFLAG) != 0;";
+	protected final String TEXT_42 = NL + "\t\t\t";
+	protected final String TEXT_43 = " &= ~";
+	protected final String TEXT_44 = "_ESETFLAG;";
+	protected final String TEXT_45 = "ESet = ";
+	protected final String TEXT_46 = "ESet;";
+	protected final String TEXT_47 = "ESet = false;";
+	protected final String TEXT_48 = NL + "\t\t\tif (eNotificationRequired())" + NL + "\t\t\t\teNotify(new ";
+	protected final String TEXT_49 = "(this, ";
+	protected final String TEXT_50 = ".UNSET, ";
+	protected final String TEXT_51 = ", null, null, old";
+	protected final String TEXT_52 = "ESet));";
+	protected final String TEXT_53 = NL + "\t\t}";
+	protected final String TEXT_54 = " old";
+	protected final String TEXT_55 = "_EFLAG) != 0;";
+	protected final String TEXT_56 = " = ";
+	protected final String TEXT_57 = "_EFLAG_VALUES[(";
+	protected final String TEXT_58 = "_EFLAG) >>> ";
+	protected final String TEXT_59 = "_EFLAG_OFFSET];";
+	protected final String TEXT_60 = NL + "\t\tObject old";
+	protected final String TEXT_61 = " = eVirtualUnset(";
+	protected final String TEXT_62 = ";";
+	protected final String TEXT_63 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_64 = " != EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_65 = NL + "\t\tboolean old";
+	protected final String TEXT_66 = " = null;";
+	protected final String TEXT_67 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t\teNotify(new ";
+	protected final String TEXT_68 = "isSetChange ? old";
+	protected final String TEXT_69 = " : null";
+	protected final String TEXT_70 = "old";
+	protected final String TEXT_71 = ", null, ";
+	protected final String TEXT_72 = "isSetChange";
+	protected final String TEXT_73 = "ESet";
+	protected final String TEXT_74 = "));";
+	protected final String TEXT_75 = ") ";
+	protected final String TEXT_76 = " |= ";
+	protected final String TEXT_77 = "_EFLAG; else ";
+	protected final String TEXT_78 = "_EFLAG;";
+	protected final String TEXT_79 = " & ~";
+	protected final String TEXT_80 = "_EFLAG | ";
+	protected final String TEXT_81 = "_EFLAG_DEFAULT;";
+	protected final String TEXT_82 = " : ";
+	protected final String TEXT_83 = NL + "\t\t((";
+	protected final String TEXT_84 = ".Internal)((";
+	protected final String TEXT_85 = ".Internal.Wrapper)get";
+	protected final String TEXT_86 = "()).featureMap()).clear(";
+	protected final String TEXT_87 = ".Internal)get";
+	protected final String TEXT_88 = "()).clear(";
+	protected final String TEXT_89 = NL + "\t}" + NL;
+	protected final String TEXT_90 = NL;
+
+	public ClassunsetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_90);
+		stringBuffer.append(TEXT_90);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0rPjEGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/unsetGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/unsetGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0rrn8GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_8);
+		} else {
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingUnsetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getAccessorName());
+			if (genClass.hasCollidingUnsetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_14);
+				}
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genModel.isReflectiveDelegation()) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_19);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isListType()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_23);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(singleWildcard);
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_27);
+				} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_23);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+					stringBuffer.append(TEXT_29);
+					if (!genFeature.isBidirectional()) {
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_31);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_32);
+					} else {
+						GenFeature reverseFeature = genFeature.getReverse();
+						GenClass targetClass = reverseFeature.getGenClass();
+						String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+								? " + " + genClass.getOffsetCorrectionField(genFeature)
+								: "";
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_33);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_34);
+					}
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_36);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_37);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					} else if (genClass.isESetFlag(genFeature)) {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_37);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_41);
+						}
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genClass.getESetFlagsField(genFeature));
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_44);
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_37);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_45);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_46);
+						}
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genFeature.getUncapName());
+						stringBuffer.append(TEXT_47);
+					}
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_52);
+					}
+					stringBuffer.append(TEXT_53);
+				} else {
+					if (genClass.isFlag(genFeature)) {
+						if (!genModel.isSuppressNotification()) {
+							if (genFeature.isBooleanType()) {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_54);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_21);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_40);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_55);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_54);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_56);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_57);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_40);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_58);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_59);
+							}
+						}
+					} else if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_60);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_61);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_18);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_54);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_56);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_62);
+						}
+					}
+					if (!genModel.isSuppressNotification()) {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_63);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_64);
+						} else if (genClass.isESetFlag(genFeature)) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_41);
+						} else {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_45);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_46);
+						}
+					}
+					if (genFeature.isReferenceType()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_66);
+						if (!genModel.isVirtualDelegation()) {
+							if (genClass.isESetFlag(genFeature)) {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_44);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_47);
+							}
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_67);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_49);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_50);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_15);
+							if (genModel.isVirtualDelegation()) {
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_69);
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_71);
+							if (genModel.isVirtualDelegation()) {
+								stringBuffer.append(TEXT_72);
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_74);
+						}
+					} else {
+						if (genClass.isFlag(genFeature)) {
+							if (genFeature.isBooleanType()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_78);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_56);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_79);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_80);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_81);
+							}
+						} else if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_18);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_56);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_62);
+						}
+						if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {
+							if (genClass.isESetFlag(genFeature)) {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_44);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_47);
+							}
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_67);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_49);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_50);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_15);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_82);
+								stringBuffer.append(genFeature.getEDefault());
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_15);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_15);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_72);
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_74);
+						}
+					}
+				}
+			} else if (genFeature.hasDelegateFeature()) {
+				GenFeature delegateFeature = genFeature.getDelegateFeature();
+				if (delegateFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_84);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_85);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_86);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				} else {
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_87);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_88);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				}
+			} else if (genClass.getUnsetAccessorOperation(genFeature) != null) {
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(
+						genClass.getUnsetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer)));
+			} else {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0r_J8GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/unsetGenFeature.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_89);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..97ca8a3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureTODOoverride.java
@@ -0,0 +1,326 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicGetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfacebasicGetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicGetGenFeatureTODOoverride result = new InterfacebasicGetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to return the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// -> do not perform proxy resolution" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public InterfacebasicGetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..c71f3e8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicGetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfacebasicGetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicGetGenFeatureannotationsinsert result = new InterfacebasicGetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacebasicGetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureoverride.java
new file mode 100644
index 0000000..1bd4096
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeatureoverride.java
@@ -0,0 +1,539 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicGetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacebasicGetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicGetGenFeatureoverride result = new InterfacebasicGetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_2 = NL + "\t * ";
+	protected final String TEXT_3 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "\t@Deprecated";
+	protected final String TEXT_6 = NL + "\tpublic ";
+	protected final String TEXT_7 = " basicGet";
+	protected final String TEXT_8 = "()" + NL + "\t{";
+	protected final String TEXT_9 = NL + "\t\treturn (";
+	protected final String TEXT_10 = ")eDynamicGet(";
+	protected final String TEXT_11 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_12 = ", ";
+	protected final String TEXT_13 = ", false, ";
+	protected final String TEXT_14 = ");";
+	protected final String TEXT_15 = NL + "\t\treturn ";
+	protected final String TEXT_16 = "(";
+	protected final String TEXT_17 = ")";
+	protected final String TEXT_18 = "__ESETTING_DELEGATE.dynamicGet(this, null, 0, false, false)";
+	protected final String TEXT_19 = ").";
+	protected final String TEXT_20 = "()";
+	protected final String TEXT_21 = ";";
+	protected final String TEXT_22 = NL + "\t\tif (eContainerFeatureID() != ";
+	protected final String TEXT_23 = ") return null;" + NL + "\t\treturn (";
+	protected final String TEXT_24 = ")eInternalContainer();";
+	protected final String TEXT_25 = ")eVirtualGet(";
+	protected final String TEXT_26 = ")((";
+	protected final String TEXT_27 = ".Internal.Wrapper)get";
+	protected final String TEXT_28 = "()).featureMap().get(";
+	protected final String TEXT_29 = ", false);";
+	protected final String TEXT_30 = ")get";
+	protected final String TEXT_31 = "().get(";
+	protected final String TEXT_32 = NL + "\t\t";
+	protected final String TEXT_33 = NL + "\t}" + NL + NL;
+	protected final String TEXT_34 = NL;
+
+	public InterfacebasicGetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_34);
+		stringBuffer.append(TEXT_34);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_3);
+		if (isJDK50) { //Class/basicGetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0w5fIGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genFeature.getImportedType(genClass));
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(TEXT_4);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xDQIGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			if (genClass.hasStaticFeatures()) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(!genFeature.isEffectiveSuppressEMFTypes());
+			stringBuffer.append(TEXT_14);
+		} else if (genFeature.hasSettingDelegate()) {
+			stringBuffer.append(TEXT_15);
+			if (!isJDK50 && genFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_16);
+			}
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genFeature.getObjectType(genClass));
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genFeature.getUpperName());
+			stringBuffer.append(TEXT_18);
+			if (!isJDK50 && genFeature.isPrimitiveType()) {
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getPrimitiveValueFunction());
+				stringBuffer.append(TEXT_20);
+			}
+			stringBuffer.append(TEXT_21);
+		} else if (genFeature.isContainer()) {
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_24);
+		} else if (!genFeature.isVolatile()) {
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_14);
+			} else {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_21);
+			}
+		} else if (genFeature.hasDelegateFeature()) {
+			GenFeature delegateFeature = genFeature.getDelegateFeature();
+			if (delegateFeature.isWrappedFeatureMapType()) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_27);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_29);
+			} else {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_31);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_29);
+			}
+		} else if (genFeature.hasGetterBody()) {
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genFeature.getGetterBody(genModel.getIndentation(stringBuffer)));
+		} else {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xNBIGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicGetGenFeature.todo.override.javajetinc
+		}
+		stringBuffer.append(TEXT_33);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeaturepreinsert.java
new file mode 100644
index 0000000..213caac
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicGetGenFeaturepreinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicGetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized InterfacebasicGetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicGetGenFeaturepreinsert result = new InterfacebasicGetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacebasicGetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..606b413
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureTODOoverride.java
@@ -0,0 +1,329 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicSetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfacebasicSetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicSetGenFeatureTODOoverride result = new InterfacebasicSetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to set the contained '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL
+			+ "\t\t// -> this method is automatically invoked to keep the containment relationship in synch" + NL
+			+ "\t\t// -> do not modify other features" + NL
+			+ "\t\t// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)"
+			+ NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public InterfacebasicSetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..6af74b9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicSetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfacebasicSetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicSetGenFeatureannotationsinsert result = new InterfacebasicSetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacebasicSetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureoverride.java
new file mode 100644
index 0000000..b12f526
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeatureoverride.java
@@ -0,0 +1,812 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicSetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacebasicSetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicSetGenFeatureoverride result = new InterfacebasicSetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_2 = NL + "\t * ";
+	protected final String TEXT_3 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "\t@Deprecated";
+	protected final String TEXT_6 = NL + "\tpublic ";
+	protected final String TEXT_7 = " basicSet";
+	protected final String TEXT_8 = "(";
+	protected final String TEXT_9 = " new";
+	protected final String TEXT_10 = ", ";
+	protected final String TEXT_11 = " msgs)" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t\tmsgs = eBasicSetContainer(";
+	protected final String TEXT_13 = ", msgs);";
+	protected final String TEXT_14 = NL + "\t\treturn msgs;";
+	protected final String TEXT_15 = NL + "\t\tmsgs = eDynamicInverseAdd(";
+	protected final String TEXT_16 = NL + "\t\tObject old";
+	protected final String TEXT_17 = " = eVirtualSet(";
+	protected final String TEXT_18 = ", new";
+	protected final String TEXT_19 = ");";
+	protected final String TEXT_20 = NL + "\t\t";
+	protected final String TEXT_21 = " old";
+	protected final String TEXT_22 = " = ";
+	protected final String TEXT_23 = ";" + NL + "\t\t";
+	protected final String TEXT_24 = " = new";
+	protected final String TEXT_25 = ";";
+	protected final String TEXT_26 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_27 = " == EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_28 = NL + "\t\tboolean old";
+	protected final String TEXT_29 = "ESet = (";
+	protected final String TEXT_30 = " & ";
+	protected final String TEXT_31 = "_ESETFLAG) != 0;";
+	protected final String TEXT_32 = " |= ";
+	protected final String TEXT_33 = "_ESETFLAG;";
+	protected final String TEXT_34 = "ESet = ";
+	protected final String TEXT_35 = "ESet;";
+	protected final String TEXT_36 = "ESet = true;";
+	protected final String TEXT_37 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t{";
+	protected final String TEXT_38 = NL + "\t\t\t";
+	protected final String TEXT_39 = " notification = new ";
+	protected final String TEXT_40 = "(this, ";
+	protected final String TEXT_41 = ".SET, ";
+	protected final String TEXT_42 = "isSetChange ? null : old";
+	protected final String TEXT_43 = "old";
+	protected final String TEXT_44 = "isSetChange";
+	protected final String TEXT_45 = "!old";
+	protected final String TEXT_46 = "ESet";
+	protected final String TEXT_47 = " == EVIRTUAL_NO_VALUE ? null : old";
+	protected final String TEXT_48 = NL + "\t\t\tif (msgs == null) msgs = notification; else msgs.add(notification);"
+			+ NL + "\t\t}";
+	protected final String TEXT_49 = NL + "\t\treturn ((";
+	protected final String TEXT_50 = ".Internal)((";
+	protected final String TEXT_51 = ".Internal.Wrapper)get";
+	protected final String TEXT_52 = "()).featureMap()).basicAdd(";
+	protected final String TEXT_53 = ".Internal)get";
+	protected final String TEXT_54 = "()).basicAdd(";
+	protected final String TEXT_55 = NL + "\t}" + NL + NL;
+	protected final String TEXT_56 = NL;
+
+	public InterfacebasicSetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_56);
+		stringBuffer.append(TEXT_56);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_3);
+		if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xpGAGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genFeature.getImportedInternalType(genClass));
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(genFeature.getCapName());
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_11);
+		if (genFeature.isContainer()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xy3AGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0x8oAGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_14);
+		} else if (genModel.isDynamicDelegation()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xy3AGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0x8oAGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_14);
+		} else if (!genFeature.isVolatile()) {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xy3AGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_19);
+			} else {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_25);
+			}
+			if (genFeature.isUnsettable()) {
+				if (genModel.isVirtualDelegation()) {
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_27);
+					}
+				} else if (genClass.isESetFlag(genFeature)) {
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genClass.getESetFlagsField(genFeature));
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_31);
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genClass.getESetFlagsField(genFeature));
+						stringBuffer.append(TEXT_32);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_33);
+					}
+				} else {
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genFeature.getUncapName());
+						stringBuffer.append(TEXT_35);
+					}
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genFeature.getUncapName());
+					stringBuffer.append(TEXT_36);
+				}
+			}
+			if (!genModel.isSuppressNotification()) {
+				stringBuffer.append(TEXT_37);
+				if (genFeature.isUnsettable()) {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_10);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genFeature.getCapName());
+					} else {
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getCapName());
+					}
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_10);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_46);
+					}
+					stringBuffer.append(TEXT_19);
+				} else {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_10);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_47);
+						stringBuffer.append(genFeature.getCapName());
+					} else {
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getCapName());
+					}
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_19);
+				}
+				stringBuffer.append(TEXT_48);
+			}
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0x8oAGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			stringBuffer.append(TEXT_14);
+		} else if (genFeature.hasDelegateFeature()) {
+			GenFeature delegateFeature = genFeature.getDelegateFeature();
+			if (delegateFeature.isWrappedFeatureMapType()) {
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_50);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_51);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_52);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_13);
+			} else {
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+				stringBuffer.append(TEXT_53);
+				stringBuffer.append(delegateFeature.getAccessorName());
+				stringBuffer.append(TEXT_54);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_13);
+			}
+		} else {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0x8oFGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicSetGenFeature.todo.override.javajetinc
+		}
+		stringBuffer.append(TEXT_55);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeaturepostinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeaturepostinsert.java
new file mode 100644
index 0000000..f631b09
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeaturepostinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicSetGenFeaturepostinsert {
+	protected static String nl;
+
+	public static synchronized InterfacebasicSetGenFeaturepostinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicSetGenFeaturepostinsert result = new InterfacebasicSetGenFeaturepostinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacebasicSetGenFeaturepostinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeaturepreinsert.java
new file mode 100644
index 0000000..e4b26f2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicSetGenFeaturepreinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicSetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized InterfacebasicSetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicSetGenFeaturepreinsert result = new InterfacebasicSetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacebasicSetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..f8dfe61
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureTODOoverride.java
@@ -0,0 +1,329 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicUnsetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfacebasicUnsetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicUnsetGenFeatureTODOoverride result = new InterfacebasicUnsetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to unset the contained '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL
+			+ "\t\t// -> this method is automatically invoked to keep the containment relationship in synch" + NL
+			+ "\t\t// -> do not modify other features" + NL
+			+ "\t\t// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)"
+			+ NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public InterfacebasicUnsetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..9dc37df
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicUnsetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfacebasicUnsetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicUnsetGenFeatureannotationsinsert result = new InterfacebasicUnsetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacebasicUnsetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureoverride.java
new file mode 100644
index 0000000..dd6023b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacebasicUnsetGenFeatureoverride.java
@@ -0,0 +1,550 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacebasicUnsetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacebasicUnsetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacebasicUnsetGenFeatureoverride result = new InterfacebasicUnsetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_2 = NL + "\t * ";
+	protected final String TEXT_3 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL + "\t@Deprecated";
+	protected final String TEXT_6 = NL + "\tpublic ";
+	protected final String TEXT_7 = " basicUnset";
+	protected final String TEXT_8 = "(";
+	protected final String TEXT_9 = " msgs)" + NL + "\t{";
+	protected final String TEXT_10 = NL + "\t\treturn eDynamicInverseRemove(";
+	protected final String TEXT_11 = "basicGet";
+	protected final String TEXT_12 = "(), ";
+	protected final String TEXT_13 = ", msgs);";
+	protected final String TEXT_14 = "Object old";
+	protected final String TEXT_15 = " = ";
+	protected final String TEXT_16 = "eVirtualUnset(";
+	protected final String TEXT_17 = ");";
+	protected final String TEXT_18 = NL + "\t\t";
+	protected final String TEXT_19 = " old";
+	protected final String TEXT_20 = ";";
+	protected final String TEXT_21 = " = null;";
+	protected final String TEXT_22 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_23 = " != EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_24 = NL + "\t\tboolean old";
+	protected final String TEXT_25 = "ESet = (";
+	protected final String TEXT_26 = " & ";
+	protected final String TEXT_27 = "_ESETFLAG) != 0;";
+	protected final String TEXT_28 = " &= ~";
+	protected final String TEXT_29 = "_ESETFLAG;";
+	protected final String TEXT_30 = "ESet = ";
+	protected final String TEXT_31 = "ESet;";
+	protected final String TEXT_32 = "ESet = false;";
+	protected final String TEXT_33 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_34 = " notification = new ";
+	protected final String TEXT_35 = "(this, ";
+	protected final String TEXT_36 = ".UNSET, ";
+	protected final String TEXT_37 = ", ";
+	protected final String TEXT_38 = "isSetChange ? old";
+	protected final String TEXT_39 = " : null";
+	protected final String TEXT_40 = "old";
+	protected final String TEXT_41 = ", null, ";
+	protected final String TEXT_42 = "isSetChange";
+	protected final String TEXT_43 = "ESet";
+	protected final String TEXT_44 = ");" + NL
+			+ "\t\t\tif (msgs == null) msgs = notification; else msgs.add(notification);" + NL + "\t\t}" + NL
+			+ "\t\treturn msgs;";
+	protected final String TEXT_45 = NL + "\t}" + NL + NL;
+	protected final String TEXT_46 = NL;
+
+	public InterfacebasicUnsetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_46);
+		stringBuffer.append(TEXT_46);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_3);
+		if (isJDK50) { //Class/basicUnsetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0zb1wGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_5);
+		}
+		stringBuffer.append(TEXT_6);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+		stringBuffer.append(TEXT_9);
+		if (genModel.isDynamicDelegation()) {
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getAsInternalEObject("", false));
+			if (genFeature.isResolveProxies()) {
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getAccessorName());
+			} else {
+				stringBuffer.append(genFeature.getGetAccessor());
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(positiveOffsetCorrection);
+			stringBuffer.append(TEXT_13);
+		} else if (!genFeature.isVolatile()) {
+			if (genModel.isVirtualDelegation()) {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_15);
+				}
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_17);
+			} else {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_21);
+			}
+			if (genModel.isVirtualDelegation()) {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_23);
+				}
+			} else if (genClass.isESetFlag(genFeature)) {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genClass.getESetFlagsField(genFeature));
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_27);
+				}
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genClass.getESetFlagsField(genFeature));
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_29);
+			} else {
+				if (!genModel.isSuppressNotification()) {
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genFeature.getUncapName());
+					stringBuffer.append(TEXT_31);
+				}
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getUncapName());
+				stringBuffer.append(TEXT_32);
+			}
+			if (!genModel.isSuppressNotification()) {
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_37);
+				if (genModel.isVirtualDelegation()) {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_39);
+				} else {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genFeature.getCapName());
+				}
+				stringBuffer.append(TEXT_41);
+				if (genModel.isVirtualDelegation()) {
+					stringBuffer.append(TEXT_42);
+				} else {
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_43);
+				}
+				stringBuffer.append(TEXT_44);
+			}
+		} else {
+			stringBuffer.append(TEXT_4);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0zlmwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicUnsetGenFeature.todo.override.javajetinc
+		}
+		stringBuffer.append(TEXT_45);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedeclaredFieldGenFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedeclaredFieldGenFeatureinsert.java
new file mode 100644
index 0000000..1e81c1e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedeclaredFieldGenFeatureinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacedeclaredFieldGenFeatureinsert {
+	protected static String nl;
+
+	public static synchronized InterfacedeclaredFieldGenFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacedeclaredFieldGenFeatureinsert result = new InterfacedeclaredFieldGenFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacedeclaredFieldGenFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedeclaredFieldGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedeclaredFieldGenFeatureoverride.java
new file mode 100644
index 0000000..8da9b18
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedeclaredFieldGenFeatureoverride.java
@@ -0,0 +1,780 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacedeclaredFieldGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacedeclaredFieldGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacedeclaredFieldGenFeatureoverride result = new InterfacedeclaredFieldGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * The cached setting delegate for the '{@link #";
+	protected final String TEXT_3 = "() <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @see #";
+	protected final String TEXT_6 = "()";
+	protected final String TEXT_7 = NL + "\t * ";
+	protected final String TEXT_8 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_9 = NL + "\t@";
+	protected final String TEXT_10 = NL + "\t@Deprecated";
+	protected final String TEXT_11 = NL + "\tprotected ";
+	protected final String TEXT_12 = ".Internal.SettingDelegate ";
+	protected final String TEXT_13 = "__ESETTING_DELEGATE = ((";
+	protected final String TEXT_14 = ".Internal)";
+	protected final String TEXT_15 = ").getSettingDelegate();" + NL;
+	protected final String TEXT_16 = NL + "\t/**" + NL + "\t * The cached value of the '{@link #";
+	protected final String TEXT_17 = " ";
+	protected final String TEXT_18 = ";" + NL;
+	protected final String TEXT_19 = NL + "\t/**" + NL + "\t * The empty value for the '{@link #";
+	protected final String TEXT_20 = "</em>}' array accessor." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_21 = NL + "\t@SuppressWarnings(\"rawtypes\")";
+	protected final String TEXT_22 = NL + "\tprotected static final ";
+	protected final String TEXT_23 = "[] ";
+	protected final String TEXT_24 = "_EEMPTY_ARRAY = new ";
+	protected final String TEXT_25 = " [0]";
+	protected final String TEXT_26 = NL + "\t/**" + NL + "\t * The default value of the '{@link #";
+	protected final String TEXT_27 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_28 = "; // TODO The default value literal \"";
+	protected final String TEXT_29 = "\" is not valid.";
+	protected final String TEXT_30 = " = ";
+	protected final String TEXT_31 = ";";
+	protected final String TEXT_32 = NL;
+	protected final String TEXT_33 = NL + "\t/**" + NL
+			+ "\t * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set."
+			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
+			+ "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_34 = NL + "\tprotected int ";
+	protected final String TEXT_35 = " = 0;" + NL;
+	protected final String TEXT_36 = NL + "\t/**" + NL
+			+ "\t * The offset of the flags representing the value of the '{@link #";
+	protected final String TEXT_37 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_38 = NL + "\tprotected static final int ";
+	protected final String TEXT_39 = "_EFLAG_OFFSET = ";
+	protected final String TEXT_40 = ";" + NL + "" + NL + "\t/**" + NL
+			+ "\t * The flags representing the default value of the '{@link #";
+	protected final String TEXT_41 = "_EFLAG_DEFAULT = ";
+	protected final String TEXT_42 = ".ordinal()";
+	protected final String TEXT_43 = ".VALUES.indexOf(";
+	protected final String TEXT_44 = ")";
+	protected final String TEXT_45 = " << ";
+	protected final String TEXT_46 = "_EFLAG_OFFSET;" + NL + "" + NL + "\t/**" + NL
+			+ "\t * The array of enumeration values for '{@link ";
+	protected final String TEXT_47 = "}'" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_48 = NL + "\tprivate static final ";
+	protected final String TEXT_49 = "_EFLAG_VALUES = ";
+	protected final String TEXT_50 = ".values()";
+	protected final String TEXT_51 = "(";
+	protected final String TEXT_52 = "[])";
+	protected final String TEXT_53 = ".VALUES.toArray(new ";
+	protected final String TEXT_54 = "[";
+	protected final String TEXT_55 = ".VALUES.size()])";
+	protected final String TEXT_56 = NL + "\t/**" + NL + "\t * The flag";
+	protected final String TEXT_57 = " representing the value of the '{@link #";
+	protected final String TEXT_58 = "_EFLAG = ";
+	protected final String TEXT_59 = "_EFLAG_OFFSET";
+	protected final String TEXT_60 = NL + "\t/**" + NL + "\t * The flag representing whether the ";
+	protected final String TEXT_61 = " has been set." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_62 = "_ESETFLAG = 1 << ";
+	protected final String TEXT_63 = NL + "\t/**" + NL + "\t * This is true if the ";
+	protected final String TEXT_64 = NL + "\tprotected boolean ";
+	protected final String TEXT_65 = "ESet;" + NL;
+	protected final String TEXT_66 = NL;
+
+	public InterfacedeclaredFieldGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_66);
+		stringBuffer.append(TEXT_66);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.hasSettingDelegate()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genFeature.getFormattedName());
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genFeature.getFeatureKind());
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_6);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_8);
+			if (isGWT) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getUpperName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+			stringBuffer.append(TEXT_15);
+		} else if (genFeature.isListType() || genFeature.isReferenceType()) {
+			if (genClass.isField(genFeature)) {
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_6);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isGWT) {
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getImportedInternalType(genClass));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_18);
+			}
+			if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+					&& !genFeature.isMapType()) {
+				String rawListItemType = genFeature.getRawListItemType(genClass);
+				int index = rawListItemType.indexOf('[');
+				String head = rawListItemType;
+				String tail = "";
+				if (index != -1) {
+					head = rawListItemType.substring(0, index);
+					tail = rawListItemType.substring(index);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_6);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (genFeature.getQualifiedListItemType(genClass).contains("<")
+						|| genFeature.getArrayItemType(genClass).contains("<")) {
+					stringBuffer.append(TEXT_21);
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(rawListItemType);
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_24);
+				stringBuffer.append(head);
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(tail);
+				stringBuffer.append(TEXT_18);
+			}
+		} else {
+			if (genFeature.hasEDefault() && (!genFeature.isVolatile() || !genModel.isReflectiveDelegation()
+					&& (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable()))) {
+				String staticDefaultValue = genFeature.getStaticDefaultValue();
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_6);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (genModel.useGenerics() && genFeature.isListDataType() && genFeature.isSetDefaultValue()) {
+					stringBuffer.append(TEXT_27);
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getEDefault());
+				if ("".equals(staticDefaultValue)) {
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genFeature.getEcoreFeature().getDefaultValueLiteral());
+					stringBuffer.append(TEXT_29);
+				} else {
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(staticDefaultValue);
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genModel.getNonNLS(staticDefaultValue));
+				}
+				stringBuffer.append(TEXT_32);
+			}
+			if (genClass.isField(genFeature)) {
+				if (genClass.isFlag(genFeature)) {
+					int flagIndex = genClass.getFlagIndex(genFeature);
+					if (flagIndex > 31 && flagIndex % 32 == 0) {
+						stringBuffer.append(TEXT_33);
+						if (isGWT) {
+							stringBuffer.append(TEXT_9);
+							stringBuffer
+									.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+						}
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genClass.getFlagsField(genFeature));
+						stringBuffer.append(TEXT_35);
+					}
+					if (genFeature.isEnumType()) {
+						stringBuffer.append(TEXT_36);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_3);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_4);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_37);
+						if (genFeature.hasAPITags()) {
+							stringBuffer.append(TEXT_7);
+							stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_8);
+						if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_10);
+						}
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(flagIndex % 32);
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_3);
+						stringBuffer.append(genFeature.getFormattedName());
+						stringBuffer.append(TEXT_4);
+						stringBuffer.append(genFeature.getFeatureKind());
+						stringBuffer.append(TEXT_37);
+						if (genFeature.hasAPITags()) {
+							stringBuffer.append(TEXT_7);
+							stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_8);
+						if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_10);
+						}
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_41);
+						if (isJDK50) {
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_42);
+						} else {
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_43);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_44);
+						}
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(genFeature.getTypeGenClassifier().getFormattedName());
+						stringBuffer.append(TEXT_47);
+						if (genFeature.hasAPITags()) {
+							stringBuffer.append(TEXT_7);
+							stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+						}
+						stringBuffer.append(TEXT_8);
+						if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+							stringBuffer.append(TEXT_10);
+						}
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_49);
+						if (isJDK50) {
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_50);
+						} else {
+							stringBuffer.append(TEXT_51);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_52);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_53);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_54);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_55);
+						}
+						stringBuffer.append(TEXT_18);
+					}
+					stringBuffer.append(TEXT_56);
+					stringBuffer.append(genClass.getFlagSize(genFeature) > 1 ? "s" : "");
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_3);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_4);
+					stringBuffer.append(genFeature.getFeatureKind());
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_6);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_7);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_8);
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_10);
+					}
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_58);
+					stringBuffer.append(genClass.getFlagMask(genFeature));
+					stringBuffer.append(TEXT_45);
+					if (genFeature.isEnumType()) {
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_59);
+					} else {
+						stringBuffer.append(flagIndex % 32);
+					}
+					stringBuffer.append(TEXT_18);
+				} else {
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_3);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_4);
+					stringBuffer.append(genFeature.getFeatureKind());
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_6);
+					if (genFeature.hasAPITags()) {
+						stringBuffer.append(TEXT_7);
+						stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+					}
+					stringBuffer.append(TEXT_8);
+					if (isGWT) {
+						stringBuffer.append(TEXT_9);
+						stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+					}
+					if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+						stringBuffer.append(TEXT_10);
+					}
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(genFeature.getSafeName());
+					if (genFeature.hasEDefault()) {
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getEDefault());
+					}
+					stringBuffer.append(TEXT_18);
+				}
+			}
+		}
+		if (genClass.isESetField(genFeature)) {
+			if (genClass.isESetFlag(genFeature)) {
+				int flagIndex = genClass.getESetFlagIndex(genFeature);
+				if (flagIndex > 31 && flagIndex % 32 == 0) {
+					stringBuffer.append(TEXT_33);
+					if (isGWT) {
+						stringBuffer.append(TEXT_9);
+						stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+					}
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genClass.getESetFlagsField(genFeature));
+					stringBuffer.append(TEXT_35);
+				}
+				stringBuffer.append(TEXT_60);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_61);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_38);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_62);
+				stringBuffer.append(flagIndex % 32);
+				stringBuffer.append(TEXT_18);
+			} else {
+				stringBuffer.append(TEXT_63);
+				stringBuffer.append(genFeature.getFormattedName());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getFeatureKind());
+				stringBuffer.append(TEXT_61);
+				if (genFeature.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isGWT) {
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient"));
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_64);
+				stringBuffer.append(genFeature.getUncapName());
+				stringBuffer.append(TEXT_65);
+			}
+		}
+		stringBuffer.append(TEXT_32);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.declaredFieldGenFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0vHWcGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_32);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicDelegation.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicDelegation.java
new file mode 100644
index 0000000..b4736ce
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicDelegation.java
@@ -0,0 +1,304 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacedynamicDelegation {
+	protected static String nl;
+
+	public static synchronized InterfacedynamicDelegation create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacedynamicDelegation result = new InterfacedynamicDelegation();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacedynamicDelegation() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicSetGenFeaturepostinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicSetGenFeaturepostinsert.java
new file mode 100644
index 0000000..615e7bb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicSetGenFeaturepostinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacedynamicSetGenFeaturepostinsert {
+	protected static String nl;
+
+	public static synchronized InterfacedynamicSetGenFeaturepostinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacedynamicSetGenFeaturepostinsert result = new InterfacedynamicSetGenFeaturepostinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacedynamicSetGenFeaturepostinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicSetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicSetGenFeaturepreinsert.java
new file mode 100644
index 0000000..314fc58
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacedynamicSetGenFeaturepreinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacedynamicSetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized InterfacedynamicSetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacedynamicSetGenFeaturepreinsert result = new InterfacedynamicSetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacedynamicSetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceeIsSetoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceeIsSetoverride.java
new file mode 100644
index 0000000..837b3c7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceeIsSetoverride.java
@@ -0,0 +1,587 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceeIsSetoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceeIsSetoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceeIsSetoverride result = new InterfaceeIsSetoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_2 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_3 = NL + "\t@Override";
+	protected final String TEXT_4 = NL + "\tpublic boolean eIsSet(int featureID)" + NL + "\t{" + NL
+			+ "\t\tswitch (featureID";
+	protected final String TEXT_5 = ")" + NL + "\t\t{";
+	protected final String TEXT_6 = NL + "\t\t\tcase ";
+	protected final String TEXT_7 = ":";
+	protected final String TEXT_8 = NL + "\t\t\t\treturn isSet";
+	protected final String TEXT_9 = "();";
+	protected final String TEXT_10 = NL + "\t\t\t\treturn ";
+	protected final String TEXT_11 = "__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);";
+	protected final String TEXT_12 = NL + "\t\t\t\treturn !((";
+	protected final String TEXT_13 = ".Internal.Wrapper)";
+	protected final String TEXT_14 = "()).featureMap().isEmpty();";
+	protected final String TEXT_15 = " != null && !";
+	protected final String TEXT_16 = ".featureMap().isEmpty();";
+	protected final String TEXT_17 = ".isEmpty();";
+	protected final String TEXT_18 = NL + "\t\t\t\t";
+	protected final String TEXT_19 = " ";
+	protected final String TEXT_20 = " = (";
+	protected final String TEXT_21 = ")eVirtualGet(";
+	protected final String TEXT_22 = ");" + NL + "\t\t\t\treturn ";
+	protected final String TEXT_23 = NL + "\t\t\t\treturn !";
+	protected final String TEXT_24 = "().isEmpty();";
+	protected final String TEXT_25 = " != null;";
+	protected final String TEXT_26 = NL + "\t\t\t\treturn eVirtualGet(";
+	protected final String TEXT_27 = ") != null;";
+	protected final String TEXT_28 = NL + "\t\t\t\treturn basicGet";
+	protected final String TEXT_29 = "() != null;";
+	protected final String TEXT_30 = NL + "\t\t\t\treturn ((";
+	protected final String TEXT_31 = " & ";
+	protected final String TEXT_32 = "_EFLAG) != 0) != ";
+	protected final String TEXT_33 = ";";
+	protected final String TEXT_34 = NL + "\t\t\t\treturn (";
+	protected final String TEXT_35 = "_EFLAG) != ";
+	protected final String TEXT_36 = "_EFLAG_DEFAULT;";
+	protected final String TEXT_37 = " != ";
+	protected final String TEXT_38 = ", ";
+	protected final String TEXT_39 = ") != ";
+	protected final String TEXT_40 = "() != ";
+	protected final String TEXT_41 = " == null ? ";
+	protected final String TEXT_42 = " != null : !";
+	protected final String TEXT_43 = ".equals(";
+	protected final String TEXT_44 = ");";
+	protected final String TEXT_45 = "() != null : !";
+	protected final String TEXT_46 = "());";
+	protected final String TEXT_47 = NL + "\t\t\tdefault:";
+	protected final String TEXT_48 = NL + "\t\t}";
+	protected final String TEXT_49 = NL;
+	protected final String TEXT_50 = "\t\treturn super.eIsSet(featureID);";
+	protected final String TEXT_51 = "\t\treturn eDynamicIsSet(featureID);";
+	protected final String TEXT_52 = NL + "\t}" + NL + NL;
+	protected final String TEXT_53 = NL;
+
+	public InterfaceeIsSetoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_53);
+		stringBuffer.append(TEXT_53);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.useGenerics()) {
+			for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) {
+				if (genFeature.isListType() && !genFeature.isUnsettable() && !genFeature.isWrappedFeatureMapType()
+						&& !genClass.isField(genFeature) && genFeature.isField()
+						&& genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+					stringBuffer.append(TEXT_2);
+					break;
+				}
+			}
+		}
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_3);
+		}
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(negativeOffsetCorrection);
+		stringBuffer.append(TEXT_5);
+		for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) {
+			String safeNameAccessor = genFeature.getSafeName();
+			if ("featureID".equals(safeNameAccessor)) {
+				safeNameAccessor = "this." + safeNameAccessor;
+			}
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(TEXT_7);
+			if (genFeature.hasSettingDelegate()) {
+				if (genFeature.isUnsettable()) {
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_9);
+				} else {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_11);
+				}
+			} else if (genFeature.isListType() && !genFeature.isUnsettable()) {
+				if (genFeature.isWrappedFeatureMapType()) {
+					if (genFeature.isVolatile()) {
+						stringBuffer.append(TEXT_12);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+						stringBuffer.append(TEXT_13);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_14);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_16);
+					}
+				} else {
+					if (genClass.isField(genFeature)) {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_17);
+					} else {
+						if (genFeature.isField()
+								&& genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+							stringBuffer.append(TEXT_18);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(safeNameAccessor);
+							stringBuffer.append(TEXT_20);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_21);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_22);
+							stringBuffer.append(safeNameAccessor);
+							stringBuffer.append(TEXT_15);
+							stringBuffer.append(safeNameAccessor);
+							stringBuffer.append(TEXT_17);
+						} else {
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genFeature.getGetAccessor());
+							stringBuffer.append(TEXT_24);
+						}
+					}
+				}
+			} else if (genFeature.isUnsettable()) {
+				stringBuffer.append(TEXT_8);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_9);
+			} else if (genFeature.isResolveProxies()) {
+				if (genClass.isField(genFeature)) {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_25);
+				} else {
+					if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_27);
+					} else {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genFeature.getAccessorName());
+						stringBuffer.append(TEXT_29);
+					}
+				}
+			} else if (!genFeature.hasEDefault()) {
+				if (genClass.isField(genFeature)) {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_25);
+				} else {
+					if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_27);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_29);
+					}
+				}
+			} else if (genFeature.isPrimitiveType() || genFeature.isEnumType()) {
+				if (genClass.isField(genFeature)) {
+					if (genClass.isFlag(genFeature)) {
+						if (genFeature.isBooleanType()) {
+							stringBuffer.append(TEXT_30);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_31);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_32);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_33);
+						} else {
+							stringBuffer.append(TEXT_34);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_31);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_35);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_36);
+						}
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_37);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_33);
+					}
+				} else {
+					if (genFeature.isEnumType() && genFeature.isField()
+							&& genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_26);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_33);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_33);
+					}
+				}
+			} else {//datatype
+				if (genClass.isField(genFeature)) {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getEDefault());
+					stringBuffer.append(TEXT_41);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(genFeature.getEDefault());
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(safeNameAccessor);
+					stringBuffer.append(TEXT_44);
+				} else {
+					if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_19);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(safeNameAccessor);
+						stringBuffer.append(TEXT_44);
+					} else {
+						stringBuffer.append(TEXT_10);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getEDefault());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getGetAccessor());
+						stringBuffer.append(TEXT_46);
+					}
+				}
+			}
+		}
+		if (forceDefaultCase) {
+			stringBuffer.append(TEXT_47);
+		} else { // {
+			stringBuffer.append(TEXT_48);
+		}
+		if (genModel.isMinimalReflectiveMethods()) {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_50);
+		} else {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_51);
+		}
+		if (forceDefaultCase) { // {
+			stringBuffer.append(TEXT_48);
+		} // }
+		stringBuffer.append(TEXT_52);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceeUnsetoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceeUnsetoverride.java
new file mode 100644
index 0000000..8672fbb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceeUnsetoverride.java
@@ -0,0 +1,401 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceeUnsetoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceeUnsetoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceeUnsetoverride result = new InterfaceeUnsetoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_2 = NL + "\t@Override";
+	protected final String TEXT_3 = NL + "\tpublic void eUnset(int featureID)" + NL + "\t{" + NL
+			+ "\t\tswitch (featureID";
+	protected final String TEXT_4 = ")" + NL + "\t\t{";
+	protected final String TEXT_5 = NL + "\t\t\tcase ";
+	protected final String TEXT_6 = ":";
+	protected final String TEXT_7 = NL + "\t\t\t\t((";
+	protected final String TEXT_8 = ".Internal.Wrapper)";
+	protected final String TEXT_9 = "()).featureMap().clear();";
+	protected final String TEXT_10 = NL + "\t\t\t\t";
+	protected final String TEXT_11 = "().clear();";
+	protected final String TEXT_12 = NL + "\t\t\t\tunset";
+	protected final String TEXT_13 = "();";
+	protected final String TEXT_14 = NL + "\t\t\t\tset";
+	protected final String TEXT_15 = "((";
+	protected final String TEXT_16 = ")null);";
+	protected final String TEXT_17 = "__ESETTING_DELEGATE.dynamicUnset(this, null, 0);";
+	protected final String TEXT_18 = "(";
+	protected final String TEXT_19 = ");";
+	protected final String TEXT_20 = NL + "\t\t\t\treturn;";
+	protected final String TEXT_21 = NL + "\t\t\tdefault:";
+	protected final String TEXT_22 = NL + "\t\t}";
+	protected final String TEXT_23 = NL;
+	protected final String TEXT_24 = "\t\tsuper.eUnset(featureID);";
+	protected final String TEXT_25 = "\t\teDynamicUnset(featureID);";
+	protected final String TEXT_26 = NL + "\t}" + NL + NL;
+	protected final String TEXT_27 = NL;
+
+	public InterfaceeUnsetoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_2);
+		}
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(negativeOffsetCorrection);
+		stringBuffer.append(TEXT_4);
+		for (GenFeature genFeature : genClass.getEUnsetGenFeatures()) {
+			stringBuffer.append(TEXT_5);
+			stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+			stringBuffer.append(TEXT_6);
+			if (genFeature.isListType() && !genFeature.isUnsettable()) {
+				if (genFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_9);
+				} else {
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_11);
+				}
+			} else if (genFeature.isUnsettable()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_13);
+			} else if (!genFeature.hasEDefault()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_16);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_17);
+			} else {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getEDefault());
+				stringBuffer.append(TEXT_19);
+			}
+			stringBuffer.append(TEXT_20);
+		}
+		if (forceDefaultCase) {
+			stringBuffer.append(TEXT_21);
+		} else { // {
+			stringBuffer.append(TEXT_22);
+		}
+		if (genModel.isMinimalReflectiveMethods()) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_24);
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_20);
+			}
+		} else {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(indentDefaultCase);
+			stringBuffer.append(TEXT_25);
+			if (forceDefaultCase) {
+				stringBuffer.append(TEXT_20);
+			}
+		}
+		if (forceDefaultCase) { // {
+			stringBuffer.append(TEXT_22);
+		} // }
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceegfCustomconstructoroverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceegfCustomconstructoroverride.java
new file mode 100644
index 0000000..448b4bd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceegfCustomconstructoroverride.java
@@ -0,0 +1,305 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceegfCustomconstructoroverride {
+	protected static String nl;
+
+	public static synchronized InterfaceegfCustomconstructoroverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceegfCustomconstructoroverride result = new InterfaceegfCustomconstructoroverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\tsuper();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public InterfaceegfCustomconstructoroverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureReifiedoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureReifiedoverride.java
new file mode 100644
index 0000000..63a69ce
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureReifiedoverride.java
@@ -0,0 +1,715 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenFeatureReifiedoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegenFeatureReifiedoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenFeatureReifiedoverride result = new InterfacegenFeatureReifiedoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL
+			+ "\t * This is specialized for the more specific element type known in this context." + NL + "\t * @see #";
+	protected final String TEXT_3 = "()";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_7 = NL + "\t@Deprecated";
+	protected final String TEXT_8 = NL + "\t@Override";
+	protected final String TEXT_9 = NL + "\tpublic ";
+	protected final String TEXT_10 = "[] ";
+	protected final String TEXT_11 = "()" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t\t";
+	protected final String TEXT_13 = " list = (";
+	protected final String TEXT_14 = ")";
+	protected final String TEXT_15 = "();" + NL + "\t\tif (list.isEmpty()) return ";
+	protected final String TEXT_16 = "_EEMPTY_ARRAY;";
+	protected final String TEXT_17 = NL + "\t\tif (";
+	protected final String TEXT_18 = " == null || ";
+	protected final String TEXT_19 = ".isEmpty()) return ";
+	protected final String TEXT_20 = "_EEMPTY_ARRAY;" + NL + "\t\t";
+	protected final String TEXT_21 = ";";
+	protected final String TEXT_22 = NL + "\t\tlist.shrink();" + NL + "\t\treturn (";
+	protected final String TEXT_23 = "[])list.data();" + NL + "\t}" + NL;
+	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL
+			+ "\t * This is specialized for the more specific element type known in this context.";
+	protected final String TEXT_25 = NL;
+	protected final String TEXT_26 = " ";
+	protected final String TEXT_27 = "_";
+	protected final String TEXT_28 = " = (";
+	protected final String TEXT_29 = ")eVirtualGet(";
+	protected final String TEXT_30 = ");";
+	protected final String TEXT_31 = " == null)" + NL + "\t\t{";
+	protected final String TEXT_32 = NL + "\t\t\teVirtualSet(";
+	protected final String TEXT_33 = ", ";
+	protected final String TEXT_34 = " = new ";
+	protected final String TEXT_35 = NL + "\t\t\t";
+	protected final String TEXT_36 = NL + "\t\t}" + NL + "\t\treturn ";
+	protected final String TEXT_37 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_38 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL
+			+ "\t * This is specialized for the more specific type known in this context.";
+	protected final String TEXT_39 = " basicSet";
+	protected final String TEXT_40 = "(";
+	protected final String TEXT_41 = " new";
+	protected final String TEXT_42 = " msgs)" + NL + "\t{" + NL + "\t\treturn super.basicSet";
+	protected final String TEXT_43 = "(new";
+	protected final String TEXT_44 = ", msgs);" + NL + "\t}" + NL;
+	protected final String TEXT_45 = NL + "\tpublic void set";
+	protected final String TEXT_46 = ")" + NL + "\t{" + NL + "\t\tsuper.set";
+	protected final String TEXT_47 = ");" + NL + "\t}" + NL;
+	protected final String TEXT_48 = NL;
+
+	public InterfacegenFeatureReifiedoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> classExtendsGenClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> classExtendsAllGenFeaturesList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object classExtendsGenClassParameter : classExtendsGenClassList) {
+				for (Object classExtendsAllGenFeaturesParameter : classExtendsAllGenFeaturesList) {
+					for (Object genClassParameter : genClassList) {
+						for (Object genPackageParameter : genPackageList) {
+							for (Object genModelParameter : genModelList) {
+								for (Object isJDK50Parameter : isJDK50List) {
+									for (Object isInterfaceParameter : isInterfaceList) {
+										for (Object isImplementationParameter : isImplementationList) {
+											for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+												for (Object isGWTParameter : isGWTList) {
+													for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+														for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+															for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+																for (Object singleWildcardParameter : singleWildcardList) {
+																	for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																		for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																			for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																				for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																					this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																					this.classExtendsGenClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) classExtendsGenClassParameter;
+																					this.classExtendsAllGenFeatures = (java.util.List) classExtendsAllGenFeaturesParameter;
+																					this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																					this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																					this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																					this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																					this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																					this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																					this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																					this.isGWT = (java.lang.Boolean) isGWTParameter;
+																					this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																					this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																					this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																					this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																					this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																					this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																					this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																					this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																					if (preCondition(ctx)) {
+																						ctx.setNode(new Node.Container(
+																								currentNode,
+																								getClass()));
+																						orchestration(ctx);
+																					}
+
+																				}
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_48);
+		stringBuffer.append(TEXT_48);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("classExtendsGenClass", this.classExtendsGenClass);
+			parameterValues.put("classExtendsAllGenFeatures", this.classExtendsAllGenFeatures);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass classExtendsGenClass = null;
+
+	public void set_classExtendsGenClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.classExtendsGenClass = object;
+	}
+
+	protected java.util.List classExtendsAllGenFeatures = null;
+
+	public void set_classExtendsAllGenFeatures(java.util.List object) {
+		this.classExtendsAllGenFeatures = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("classExtendsGenClass", this.classExtendsGenClass);
+		parameters.put("classExtendsAllGenFeatures", this.classExtendsAllGenFeatures);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+				&& !genFeature.isMapType()) {
+			String arrayElementType = genFeature.getArrayItemType(genClass);
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {
+				stringBuffer.append(TEXT_6);
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_7);
+			}
+			if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(arrayElementType);
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getGetArrayAccessor());
+			stringBuffer.append(TEXT_11);
+			if (genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_16);
+			} else {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_21);
+			}
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(arrayElementType);
+			stringBuffer.append(TEXT_23);
+		}
+		if (genFeature.isGet() && genFeature.isListType()) {
+			stringBuffer.append(TEXT_24);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_25);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wTpQGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+			if (genFeature.isListType() && genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_6);
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_7);
+			}
+			if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genFeature.getGetAccessor());
+			if (genClass.hasCollidingGetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_27);
+			}
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(TEXT_25);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wczMGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_29);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_30);
+			}
+			stringBuffer.append(TEXT_17);
+			stringBuffer.append(genFeature.getSafeName());
+			stringBuffer.append(TEXT_31);
+			if (genModel.isVirtualDelegation()) {
+				stringBuffer.append(TEXT_32);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				stringBuffer.append(positiveOffsetCorrection);
+				stringBuffer.append(TEXT_33);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genClass.getListConstructor(genFeature));
+				stringBuffer.append(TEXT_30);
+			} else {
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(genFeature.getSafeName());
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(genClass.getListConstructor(genFeature));
+				stringBuffer.append(TEXT_21);
+			}
+			stringBuffer.append(TEXT_36);
+			stringBuffer.append(genFeature.getSafeName());
+			stringBuffer.append(genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : "");
+			stringBuffer.append(TEXT_37);
+		}
+		if (!genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {
+			stringBuffer.append(TEXT_38);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_25);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xpGAGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_7);
+			}
+			if (classExtendsAllGenFeatures.contains(genFeature)) {
+				stringBuffer.append(TEXT_8);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_39);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_40);
+			stringBuffer.append(genFeature.getImportedInternalType(genClass));
+			stringBuffer.append(TEXT_41);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_33);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+			stringBuffer.append(TEXT_42);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_43);
+			stringBuffer.append(genFeature.getCapName());
+			stringBuffer.append(TEXT_44);
+		}
+		if (genFeature.isSet() && !(!genModel.isReflectiveDelegation() && genFeature.isBasicSet())) {
+			stringBuffer.append(TEXT_38);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_25);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0ysO4GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+			{
+				GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_7);
+				}
+				if (classExtendsAllGenFeatures.contains(genFeature)) {
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genFeature.getAccessorName());
+				if (genClass.hasCollidingSetAccessorOperation(genFeature)) {
+					stringBuffer.append(TEXT_27);
+				}
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genFeature.getImportedType(genClass));
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(setAccessorOperation == null ? "new" + genFeature.getCapName()
+						: setAccessorOperation.getGenParameters().get(0).getName());
+				stringBuffer.append(TEXT_46);
+				stringBuffer.append(genFeature.getAccessorName());
+				if (genClass.hasCollidingSetAccessorOperation(genFeature)) {
+					stringBuffer.append(TEXT_27);
+				}
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(setAccessorOperation == null ? "new" + genFeature.getCapName()
+						: setAccessorOperation.getGenParameters().get(0).getName());
+				stringBuffer.append(TEXT_47);
+			}
+		}
+		stringBuffer.append(TEXT_25);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureinsert.java
new file mode 100644
index 0000000..4b39a8f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenFeatureinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegenFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenFeatureinsert result = new InterfacegenFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegenFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureoverride.java
new file mode 100644
index 0000000..3a83020
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenFeatureoverride.java
@@ -0,0 +1,841 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenFeatureoverride result = new InterfacegenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_3 = NL + "\t * ";
+	protected final String TEXT_4 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_5 = NL + "\t";
+	protected final String TEXT_6 = "[] ";
+	protected final String TEXT_7 = "();" + NL;
+	protected final String TEXT_8 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\t@Override";
+	protected final String TEXT_11 = NL + "\tpublic ";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t\t";
+	protected final String TEXT_14 = " list = (";
+	protected final String TEXT_15 = ")";
+	protected final String TEXT_16 = "();" + NL + "\t\tif (list.isEmpty()) return ";
+	protected final String TEXT_17 = "_EEMPTY_ARRAY;";
+	protected final String TEXT_18 = NL + "\t\tif (";
+	protected final String TEXT_19 = " == null || ";
+	protected final String TEXT_20 = ".isEmpty()) return ";
+	protected final String TEXT_21 = "_EEMPTY_ARRAY;" + NL + "\t\t";
+	protected final String TEXT_22 = ";";
+	protected final String TEXT_23 = NL + "\t\tlist.shrink();" + NL + "\t\treturn (";
+	protected final String TEXT_24 = "[])list.data();" + NL + "\t}" + NL;
+	protected final String TEXT_25 = " get";
+	protected final String TEXT_26 = "(int index);" + NL;
+	protected final String TEXT_27 = "(int index)" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_28 = "(";
+	protected final String TEXT_29 = "().get(index);" + NL + "\t}" + NL;
+	protected final String TEXT_30 = NL + "\tint get";
+	protected final String TEXT_31 = "Length();" + NL;
+	protected final String TEXT_32 = NL + "\tpublic int get";
+	protected final String TEXT_33 = "Length()" + NL + "\t{";
+	protected final String TEXT_34 = NL + "\t\treturn ";
+	protected final String TEXT_35 = "().size();";
+	protected final String TEXT_36 = " == null ? 0 : ";
+	protected final String TEXT_37 = ".size();";
+	protected final String TEXT_38 = NL + "\t}" + NL;
+	protected final String TEXT_39 = NL + "\tvoid set";
+	protected final String TEXT_40 = "[] new";
+	protected final String TEXT_41 = ");" + NL;
+	protected final String TEXT_42 = NL + "\tpublic void set";
+	protected final String TEXT_43 = ")" + NL + "\t{" + NL + "\t\t((";
+	protected final String TEXT_44 = "()).setData(new";
+	protected final String TEXT_45 = ".length, new";
+	protected final String TEXT_46 = ");" + NL + "\t}" + NL;
+	protected final String TEXT_47 = "(int index, ";
+	protected final String TEXT_48 = " element);" + NL;
+	protected final String TEXT_49 = " element)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_50 = "().set(index, element);" + NL + "\t}" + NL;
+	protected final String TEXT_51 = NL;
+	protected final String TEXT_52 = NL;
+
+	public InterfacegenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_52);
+		stringBuffer.append(TEXT_52);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType()
+				&& !genFeature.isMapType()) {
+			String arrayElementType = genFeature.getArrayItemType(genClass);
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(arrayElementType);
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_7);
+			} else {
+				if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {
+					stringBuffer.append(TEXT_8);
+				}
+				if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_9);
+				}
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(arrayElementType);
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(genFeature.getGetArrayAccessor());
+				stringBuffer.append(TEXT_12);
+				if (genFeature.isVolatile()) {
+					stringBuffer.append(TEXT_13);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_17);
+				} else {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_20);
+					stringBuffer.append(genFeature.getUpperName());
+					stringBuffer.append(TEXT_21);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_14);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+					stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_22);
+				}
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(arrayElementType);
+				stringBuffer.append(TEXT_24);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_26);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_27);
+				if (!genModel.useGenerics()) {
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genFeature.getListItemType(genClass));
+					stringBuffer.append(TEXT_15);
+				}
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_29);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_30);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_31);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_32);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_33);
+				if (genFeature.isVolatile()) {
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_35);
+				} else {
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_37);
+				}
+				stringBuffer.append(TEXT_38);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_41);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+				stringBuffer.append(genFeature.getListTemplateArguments(genClass));
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_44);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_45);
+				stringBuffer.append(genFeature.getCapName());
+				stringBuffer.append(TEXT_46);
+			}
+			stringBuffer.append(TEXT_2);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_4);
+			if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+				stringBuffer.append(TEXT_9);
+			}
+			if (!isImplementation) {
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_48);
+			} else {
+				if (useInterfaceOverrideAnnotation) {
+					stringBuffer.append(TEXT_10);
+				}
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_47);
+				stringBuffer.append(genFeature.getListItemType(genClass));
+				stringBuffer.append(TEXT_49);
+				stringBuffer.append(genFeature.getGetAccessor());
+				stringBuffer.append(TEXT_50);
+			}
+		}
+		if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0vkCYGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/getGenFeature.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet()) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wwVMGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicGetGenFeature.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0xWLEGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/basicSetGenFeature.override.javajetinc
+		}
+		if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0yPi8GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/setGenFeature.override.javajetinc
+		}
+		if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset()) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0zSEwGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class.basicUnsetGenFeature.override.javajetinc
+		}
+		if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0z4hsGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/unsetGenFeature.override.javajetinc
+		}
+		if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility())) {
+			stringBuffer.append(TEXT_51);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_00oIkGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/isSetGenFeature.override.javajetinc
+		}
+		stringBuffer.append(TEXT_51);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_010bYGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_51);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationannotationsinsert.java
new file mode 100644
index 0000000..e5acf12
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenOperationannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegenOperationannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenOperationannotationsinsert result = new InterfacegenOperationannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegenOperationannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationinsert.java
new file mode 100644
index 0000000..d9c12bc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenOperationinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegenOperationinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenOperationinsert result = new InterfacegenOperationinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegenOperationinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationjavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationjavadocinsert.java
new file mode 100644
index 0000000..0ef2e5b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationjavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenOperationjavadocinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegenOperationjavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenOperationjavadocinsert result = new InterfacegenOperationjavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegenOperationjavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationjavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationjavadocoverride.java
new file mode 100644
index 0000000..91961f2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationjavadocoverride.java
@@ -0,0 +1,406 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenOperationjavadocoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegenOperationjavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenOperationjavadocoverride result = new InterfacegenOperationjavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * <!-- begin-model-doc -->";
+	protected final String TEXT_5 = NL + "\t * ";
+	protected final String TEXT_6 = NL + "\t * @param ";
+	protected final String TEXT_7 = NL + "\t *   ";
+	protected final String TEXT_8 = " ";
+	protected final String TEXT_9 = NL + "\t * <!-- end-model-doc -->";
+	protected final String TEXT_10 = NL + "\t * @model ";
+	protected final String TEXT_11 = NL + "\t *        ";
+	protected final String TEXT_12 = NL + "\t * @model";
+	protected final String TEXT_13 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_14 = NL;
+
+	public InterfacegenOperationjavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_14);
+		stringBuffer.append(TEXT_14);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.javadoc.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genOperation", genOperation);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_02kCQGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_3);
+		if (genOperation.hasDocumentation() || genOperation.hasParameterDocumentation()) {
+			stringBuffer.append(TEXT_4);
+			if (genOperation.hasDocumentation()) {
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genOperation.getDocumentation(genModel.getIndentation(stringBuffer)));
+			}
+			for (GenParameter genParameter : genOperation.getGenParameters()) {
+				if (genParameter.hasDocumentation()) {
+					String documentation = genParameter.getDocumentation("");
+					if (documentation.contains("\n") || documentation.contains("\r")) {
+						stringBuffer.append(TEXT_6);
+						stringBuffer.append(genParameter.getName());
+						stringBuffer.append(TEXT_7);
+						stringBuffer.append(genParameter.getDocumentation(genModel.getIndentation(stringBuffer)));
+					} else {
+						stringBuffer.append(TEXT_6);
+						stringBuffer.append(genParameter.getName());
+						stringBuffer.append(TEXT_8);
+						stringBuffer.append(genParameter.getDocumentation(genModel.getIndentation(stringBuffer)));
+					}
+				}
+			}
+			stringBuffer.append(TEXT_9);
+		}
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genOperation.getModelInfo(),
+					"\n\r"); stringTokenizer.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_10);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_11);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_12);
+			}
+		}
+		stringBuffer.append(TEXT_13);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationoverride.java
new file mode 100644
index 0000000..b262027
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegenOperationoverride.java
@@ -0,0 +1,751 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegenOperationoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegenOperationoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegenOperationoverride result = new InterfacegenOperationoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * The cached validation expression for the '{@link #";
+	protected final String TEXT_3 = "(";
+	protected final String TEXT_4 = ") <em>";
+	protected final String TEXT_5 = "</em>}' invariant operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_6 = ")";
+	protected final String TEXT_7 = NL + "\t * ";
+	protected final String TEXT_8 = NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */";
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\tprotected static final ";
+	protected final String TEXT_11 = " ";
+	protected final String TEXT_12 = "__EEXPRESSION = \"";
+	protected final String TEXT_13 = "\";";
+	protected final String TEXT_14 = NL;
+	protected final String TEXT_15 = NL + "\t/**" + NL + "\t * The cached invocation delegate for the '{@link #";
+	protected final String TEXT_16 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see #";
+	protected final String TEXT_17 = ".Internal.InvocationDelegate ";
+	protected final String TEXT_18 = "__EINVOCATION_DELEGATE = ((";
+	protected final String TEXT_19 = ".Internal)";
+	protected final String TEXT_20 = ").getInvocationDelegate();" + NL;
+	protected final String TEXT_21 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_22 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_23 = NL + "\t";
+	protected final String TEXT_24 = ";" + NL;
+	protected final String TEXT_25 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_26 = NL + "\t@Override";
+	protected final String TEXT_27 = NL + "\tpublic ";
+	protected final String TEXT_28 = NL + "\t{";
+	protected final String TEXT_29 = NL + "\t\t";
+	protected final String TEXT_30 = NL + "\t\treturn" + NL + "\t\t\t";
+	protected final String TEXT_31 = ".validate" + NL + "\t\t\t\t(";
+	protected final String TEXT_32 = "," + NL + "\t\t\t\t this," + NL + "\t\t\t\t ";
+	protected final String TEXT_33 = "," + NL + "\t\t\t\t ";
+	protected final String TEXT_34 = "," + NL + "\t\t\t\t \"";
+	protected final String TEXT_35 = "\",";
+	protected final String TEXT_36 = NL + "\t\t\t\t ";
+	protected final String TEXT_37 = "__EEXPRESSION," + NL + "\t\t\t\t ";
+	protected final String TEXT_38 = ".ERROR," + NL + "\t\t\t\t ";
+	protected final String TEXT_39 = ".DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t ";
+	protected final String TEXT_40 = ".";
+	protected final String TEXT_41 = ");";
+	protected final String TEXT_42 = NL + "\t\t// TODO: implement this method" + NL
+			+ "\t\t// -> specify the condition that violates the invariant" + NL
+			+ "\t\t// -> verify the details of the diagnostic, including severity and message" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tif (false)" + NL
+			+ "\t\t{" + NL + "\t\t\tif (";
+	protected final String TEXT_43 = " != null)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
+	protected final String TEXT_44 = ".add" + NL + "\t\t\t\t\t(new ";
+	protected final String TEXT_45 = NL + "\t\t\t\t\t\t(";
+	protected final String TEXT_46 = ".ERROR," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_47 = ".DIAGNOSTIC_SOURCE," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_48 = "," + NL + "\t\t\t\t\t\t ";
+	protected final String TEXT_49 = ".INSTANCE.getString(\"_UI_GenericInvariant_diagnostic\", new Object[] { \"";
+	protected final String TEXT_50 = "\", ";
+	protected final String TEXT_51 = ".getObjectLabel(this, ";
+	protected final String TEXT_52 = ") }),";
+	protected final String TEXT_53 = NL + "\t\t\t\t\t\t new Object [] { this }));" + NL + "\t\t\t}" + NL
+			+ "\t\t\treturn false;" + NL + "\t\t}" + NL + "\t\treturn true;";
+	protected final String TEXT_54 = NL + "\t\ttry" + NL + "\t\t{";
+	protected final String TEXT_55 = NL + "\t\t\t";
+	protected final String TEXT_56 = "__EINVOCATION_DELEGATE.dynamicInvoke(this, ";
+	protected final String TEXT_57 = "new ";
+	protected final String TEXT_58 = ".UnmodifiableEList<Object>(";
+	protected final String TEXT_59 = ", ";
+	protected final String TEXT_60 = "null";
+	protected final String TEXT_61 = NL + "\t\t\treturn ";
+	protected final String TEXT_62 = ").";
+	protected final String TEXT_63 = "()";
+	protected final String TEXT_64 = ";";
+	protected final String TEXT_65 = NL + "\t\t}" + NL + "\t\tcatch (";
+	protected final String TEXT_66 = " ite)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
+	protected final String TEXT_67 = "(ite);" + NL + "\t\t}";
+	protected final String TEXT_68 = NL + "\t}" + NL;
+	protected final String TEXT_69 = NL;
+
+	public InterfacegenOperationoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_69);
+		stringBuffer.append(TEXT_69);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isImplementation) {
+			if (genOperation.isInvariant() && genOperation.hasInvariantExpression()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genOperation.getFormattedName());
+				stringBuffer.append(TEXT_5);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_6);
+				if (genOperation.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_9);
+				}
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genModel.getImportedName("java.lang.String"));
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genOperation.getInvariantExpression("\t\t"));
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genModel.getNonNLS());
+				stringBuffer.append(TEXT_14);
+			} else if (genOperation.hasInvocationDelegate()) {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genOperation.getFormattedName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_3);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_6);
+				if (genOperation.hasAPITags()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+				}
+				stringBuffer.append(TEXT_8);
+				if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+					stringBuffer.append(TEXT_9);
+				}
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genOperation.getQualifiedOperationAccessor());
+				stringBuffer.append(TEXT_20);
+			}
+		}
+		if (isInterface) {
+			stringBuffer.append(TEXT_14);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.javadoc.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genOperation", genOperation);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_02HWUGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/genOperation.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_21);
+			if (genOperation.hasAPITags()) {
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_22);
+			if (isJDK50) { //Class/genOperation.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_14);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.annotations.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genOperation", genOperation);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_02tzQGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_9);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genOperation.getTypeParameters(genClass));
+			stringBuffer.append(genOperation.getImportedType(genClass));
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genOperation.getName());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genOperation.getParameters(genClass));
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genOperation.getThrows(genClass));
+			stringBuffer.append(TEXT_24);
+		} else {
+			if (genModel.useGenerics() && !genOperation.hasBody() && !genOperation.isInvariant()
+					&& genOperation.hasInvocationDelegate() && genOperation.isUncheckedCast(genClass)) {
+				stringBuffer.append(TEXT_25);
+			}
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genOperation.isSuppressedVisibility()) {
+				stringBuffer.append(TEXT_26);
+			}
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genOperation.getTypeParameters(genClass));
+			stringBuffer.append(genOperation.getImportedType(genClass));
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genOperation.getName());
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genOperation.getParameters(isImplementation, genClass));
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genOperation.getThrows(genClass));
+			stringBuffer.append(TEXT_28);
+			if (genOperation.hasBody()) {
+				stringBuffer.append(TEXT_29);
+				stringBuffer.append(genOperation.getBody(genModel.getIndentation(stringBuffer)));
+			} else if (genOperation.isInvariant()) {
+				GenClass opClass = genOperation.getGenClass();
+				String diagnostics = genOperation.getGenParameters().get(0).getName();
+				String context = genOperation.getGenParameters().get(1).getName();
+				if (genOperation.hasInvariantExpression()) {
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(diagnostics);
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(context);
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genOperation.getValidationDelegate());
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genOperation.getQualifiedOperationAccessor());
+					stringBuffer.append(TEXT_33);
+					stringBuffer
+							.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(opClass.getOperationID(genOperation));
+					stringBuffer.append(TEXT_41);
+				} else {
+					stringBuffer.append(TEXT_42);
+					stringBuffer.append(diagnostics);
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(diagnostics);
+					stringBuffer.append(TEXT_44);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic"));
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic"));
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(opClass.getGenPackage().getImportedValidatorClassName());
+					stringBuffer.append(TEXT_40);
+					stringBuffer.append(opClass.getOperationID(genOperation));
+					stringBuffer.append(TEXT_48);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin"));
+					stringBuffer.append(TEXT_49);
+					stringBuffer.append(genOperation.getName());
+					stringBuffer.append(TEXT_50);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator"));
+					stringBuffer.append(TEXT_51);
+					stringBuffer.append(context);
+					stringBuffer.append(TEXT_52);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(genModel.getNonNLS(2));
+					stringBuffer.append(TEXT_53);
+				}
+			} else if (genOperation.hasInvocationDelegate()) {
+				int size = genOperation.getGenParameters().size();
+				stringBuffer.append(TEXT_54);
+				if (genOperation.isVoid()) {
+					stringBuffer.append(TEXT_55);
+					stringBuffer
+							.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+					stringBuffer.append(TEXT_56);
+					if (size > 0) {
+						stringBuffer.append(TEXT_57);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+						stringBuffer.append(TEXT_58);
+						stringBuffer.append(size);
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genOperation.getParametersArray(genClass));
+						stringBuffer.append(TEXT_6);
+					} else {
+						stringBuffer.append(TEXT_60);
+					}
+					stringBuffer.append(TEXT_41);
+				} else {
+					stringBuffer.append(TEXT_61);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_3);
+					}
+					stringBuffer.append(TEXT_3);
+					stringBuffer.append(genOperation.getObjectType(genClass));
+					stringBuffer.append(TEXT_6);
+					stringBuffer
+							.append(CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale()));
+					stringBuffer.append(TEXT_56);
+					if (size > 0) {
+						stringBuffer.append(TEXT_57);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.BasicEList"));
+						stringBuffer.append(TEXT_58);
+						stringBuffer.append(size);
+						stringBuffer.append(TEXT_59);
+						stringBuffer.append(genOperation.getParametersArray(genClass));
+						stringBuffer.append(TEXT_6);
+					} else {
+						stringBuffer.append(TEXT_60);
+					}
+					stringBuffer.append(TEXT_6);
+					if (!isJDK50 && genOperation.isPrimitiveType()) {
+						stringBuffer.append(TEXT_62);
+						stringBuffer.append(genOperation.getPrimitiveValueFunction());
+						stringBuffer.append(TEXT_63);
+					}
+					stringBuffer.append(TEXT_64);
+				}
+				stringBuffer.append(TEXT_65);
+				stringBuffer
+						.append(genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException"
+								: "java.lang.reflect.InvocationTargetException"));
+				stringBuffer.append(TEXT_66);
+				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
+				stringBuffer.append(TEXT_67);
+			} else {
+				stringBuffer.append(TEXT_14);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.implementedGenOperation.TODO.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genOperation", genOperation);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0229MGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/implementedGenOperation.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_68);
+		}
+		stringBuffer.append(TEXT_14);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genOperation", genOperation);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_03AuMGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_14);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..f9d2674
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureTODOoverride.java
@@ -0,0 +1,344 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegetGenFeatureTODOoverride result = new InterfacegetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to return the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT";
+	protected final String TEXT_4 = NL
+			+ "\t\t// The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting"
+			+ NL + "\t\t// so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.";
+	protected final String TEXT_5 = "EcoreEMap";
+	protected final String TEXT_6 = "BasicFeatureMap";
+	protected final String TEXT_7 = "EcoreEList";
+	protected final String TEXT_8 = " should be used.";
+	protected final String TEXT_9 = NL + "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_10 = NL;
+
+	public InterfacegetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(TEXT_10);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		if (genFeature.isListType()) {
+			stringBuffer.append(TEXT_4);
+			if (genFeature.isMapType()) {
+				stringBuffer.append(TEXT_5);
+			} else if (genFeature.isFeatureMapType()) {
+				stringBuffer.append(TEXT_6);
+			} else {
+				stringBuffer.append(TEXT_7);
+			}
+			stringBuffer.append(TEXT_8);
+		}
+		stringBuffer.append(TEXT_9);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..b5ae97a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegetGenFeatureannotationsinsert result = new InterfacegetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..c99929d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegetGenFeaturejavadocinsert result = new InterfacegetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..f69eccd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturejavadocoverride.java
@@ -0,0 +1,525 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegetGenFeaturejavadocoverride result = new InterfacegetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Returns the value of the '<em><b>";
+	protected final String TEXT_2 = "</b></em>' ";
+	protected final String TEXT_3 = ".";
+	protected final String TEXT_4 = NL + "\t * The key is of type ";
+	protected final String TEXT_5 = "list of {@link ";
+	protected final String TEXT_6 = "}";
+	protected final String TEXT_7 = "{@link ";
+	protected final String TEXT_8 = "," + NL + "\t * and the value is of type ";
+	protected final String TEXT_9 = ",";
+	protected final String TEXT_10 = NL + "\t * The list contents are of type {@link ";
+	protected final String TEXT_11 = NL + "\t * The default value is <code>";
+	protected final String TEXT_12 = "</code>.";
+	protected final String TEXT_13 = NL + "\t * The literals are from the enumeration {@link ";
+	protected final String TEXT_14 = "}.";
+	protected final String TEXT_15 = NL + "\t * It is bidirectional and its opposite is '{@link ";
+	protected final String TEXT_16 = "#";
+	protected final String TEXT_17 = " <em>";
+	protected final String TEXT_18 = "</em>}'.";
+	protected final String TEXT_19 = NL;
+	protected final String TEXT_20 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_21 = NL + "\t * <!-- begin-model-doc -->" + NL + "\t * ";
+	protected final String TEXT_22 = NL + "\t * <!-- end-model-doc -->";
+	protected final String TEXT_23 = NL + "\t * @return the value of the '<em>";
+	protected final String TEXT_24 = "</em>' ";
+	protected final String TEXT_25 = NL + "\t * @see ";
+	protected final String TEXT_26 = NL + "\t * @see #isSet";
+	protected final String TEXT_27 = "()";
+	protected final String TEXT_28 = NL + "\t * @see #unset";
+	protected final String TEXT_29 = NL + "\t * @see #set";
+	protected final String TEXT_30 = "(";
+	protected final String TEXT_31 = ")";
+	protected final String TEXT_32 = "#get";
+	protected final String TEXT_33 = NL + "\t * @model ";
+	protected final String TEXT_34 = NL + "\t *        ";
+	protected final String TEXT_35 = NL + "\t * @model";
+	protected final String TEXT_36 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_37 = NL;
+
+	public InterfacegetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_37);
+		stringBuffer.append(TEXT_37);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		if (genFeature.isListType() && genFeature.getEcoreFeature().getEGenericType().getETypeParameter() == null) {
+			if (genFeature.isMapType()) {
+				GenFeature keyFeature = genFeature.getMapEntryTypeGenClass().getMapEntryKeyFeature();
+				GenFeature valueFeature = genFeature.getMapEntryTypeGenClass().getMapEntryValueFeature();
+				stringBuffer.append(TEXT_4);
+				if (keyFeature.isListType()) {
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(keyFeature.getQualifiedListItemType(genClass));
+					stringBuffer.append(TEXT_6);
+				} else {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(keyFeature.getType(genClass));
+					stringBuffer.append(TEXT_6);
+				}
+				stringBuffer.append(TEXT_8);
+				if (valueFeature.isListType()) {
+					stringBuffer.append(TEXT_5);
+					stringBuffer.append(valueFeature.getQualifiedListItemType(genClass));
+					stringBuffer.append(TEXT_6);
+				} else {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(valueFeature.getType(genClass));
+					stringBuffer.append(TEXT_6);
+				}
+				stringBuffer.append(TEXT_9);
+			} else if (!genFeature.isWrappedFeatureMapType() && !(genModel.isSuppressEMFMetaData()
+					&& "org.eclipse.emf.ecore.EObject".equals(genFeature.getQualifiedListItemType(genClass)))) {
+				String typeName = genFeature.getQualifiedListItemType(genClass);
+				String head = typeName;
+				String tail = "";
+				int index = typeName.indexOf('<');
+				if (index == -1) {
+					index = typeName.indexOf('[');
+				}
+				if (index != -1) {
+					head = typeName.substring(0, index);
+					tail = "<code>" + CodeGenUtil.xmlEscapeEncode(typeName.substring(index)) + "</code>";
+				}
+
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(head);
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(tail);
+				stringBuffer.append(TEXT_3);
+			}
+		} else if (genFeature.isSetDefaultValue()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getDefaultValue());
+			stringBuffer.append(TEXT_12);
+		}
+		if (genFeature.getTypeGenEnum() != null) {
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genFeature.getTypeGenEnum().getQualifiedName());
+			stringBuffer.append(TEXT_14);
+		}
+		if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) {
+			GenFeature reverseGenFeature = genFeature.getReverse();
+			if (!reverseGenFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(reverseGenFeature.getGenClass().getRawQualifiedInterfaceName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(reverseGenFeature.getGetAccessor());
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(reverseGenFeature.getFormattedName());
+				stringBuffer.append(TEXT_18);
+			}
+		}
+		stringBuffer.append(TEXT_19);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wJ4QGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_20);
+		if (genFeature.hasDocumentation()) {
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genFeature.getDocumentation(genModel.getIndentation(stringBuffer)));
+			stringBuffer.append(TEXT_22);
+		}
+		stringBuffer.append(TEXT_23);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		if (genFeature.getTypeGenEnum() != null) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genFeature.getTypeGenEnum().getQualifiedName());
+		}
+		if (genFeature.isUnsettable()) {
+			if (!genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_26);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_27);
+			}
+			if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_28);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_27);
+			}
+		}
+		if (genFeature.isChangeable() && !genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_30);
+			stringBuffer.append(genFeature.getRawImportedBoundType());
+			stringBuffer.append(TEXT_31);
+		}
+		if (!genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genFeature.getFeatureAccessorName());
+			stringBuffer.append(TEXT_27);
+		}
+		if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) {
+			GenFeature reverseGenFeature = genFeature.getReverse();
+			if (!reverseGenFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_25);
+				stringBuffer.append(reverseGenFeature.getGenClass().getRawQualifiedInterfaceName());
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(reverseGenFeature.getGetAccessor());
+			}
+		}
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genFeature.getModelInfo(),
+					"\n\r"); stringTokenizer.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_35);
+			}
+		}
+		stringBuffer.append(TEXT_36);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureoverride.java
new file mode 100644
index 0000000..be68411
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeatureoverride.java
@@ -0,0 +1,994 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacegetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegetGenFeatureoverride result = new InterfacegetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\t";
+	protected final String TEXT_8 = " ";
+	protected final String TEXT_9 = "();" + NL;
+	protected final String TEXT_10 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_11 = NL + "\t@Override";
+	protected final String TEXT_12 = NL + "\tpublic ";
+	protected final String TEXT_13 = "_";
+	protected final String TEXT_14 = "()" + NL + "\t{";
+	protected final String TEXT_15 = NL + "\t\treturn ";
+	protected final String TEXT_16 = "(";
+	protected final String TEXT_17 = ")eDynamicGet(";
+	protected final String TEXT_18 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_19 = ", ";
+	protected final String TEXT_20 = ", true, ";
+	protected final String TEXT_21 = ")";
+	protected final String TEXT_22 = ").";
+	protected final String TEXT_23 = "()";
+	protected final String TEXT_24 = ";";
+	protected final String TEXT_25 = NL + "\t\t";
+	protected final String TEXT_26 = ")eGet(";
+	protected final String TEXT_27 = ", true)";
+	protected final String TEXT_28 = "__ESETTING_DELEGATE.dynamicGet(this, null, 0, true, false)";
+	protected final String TEXT_29 = " = (";
+	protected final String TEXT_30 = ")eVirtualGet(";
+	protected final String TEXT_31 = ");";
+	protected final String TEXT_32 = NL + "\t\tif (";
+	protected final String TEXT_33 = " == null)" + NL + "\t\t{";
+	protected final String TEXT_34 = NL + "\t\t\teVirtualSet(";
+	protected final String TEXT_35 = " = new ";
+	protected final String TEXT_36 = NL + "\t\t\t";
+	protected final String TEXT_37 = NL + "\t\t}" + NL + "\t\treturn ";
+	protected final String TEXT_38 = NL + "\t\tif (eContainerFeatureID() != ";
+	protected final String TEXT_39 = ") return null;" + NL + "\t\treturn (";
+	protected final String TEXT_40 = "eContainer";
+	protected final String TEXT_41 = "eInternalContainer";
+	protected final String TEXT_42 = "();";
+	protected final String TEXT_43 = " != null && ";
+	protected final String TEXT_44 = ".eIsProxy())" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_45 = " old";
+	protected final String TEXT_46 = " = ";
+	protected final String TEXT_47 = ";" + NL + "\t\t\t";
+	protected final String TEXT_48 = "eResolveProxy(old";
+	protected final String TEXT_49 = ");" + NL + "\t\t\tif (";
+	protected final String TEXT_50 = " != old";
+	protected final String TEXT_51 = ")" + NL + "\t\t\t{";
+	protected final String TEXT_52 = NL + "\t\t\t\t";
+	protected final String TEXT_53 = " new";
+	protected final String TEXT_54 = " msgs = old";
+	protected final String TEXT_55 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_56 = ", null, null);";
+	protected final String TEXT_57 = " msgs =  old";
+	protected final String TEXT_58 = ".eInverseRemove(this, ";
+	protected final String TEXT_59 = ".class, null);";
+	protected final String TEXT_60 = NL + "\t\t\t\tif (new";
+	protected final String TEXT_61 = ".eInternalContainer() == null)" + NL + "\t\t\t\t{";
+	protected final String TEXT_62 = NL + "\t\t\t\t\tmsgs = new";
+	protected final String TEXT_63 = ".eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_64 = ", null, msgs);";
+	protected final String TEXT_65 = NL + "\t\t\t\t\tmsgs =  new";
+	protected final String TEXT_66 = ".eInverseAdd(this, ";
+	protected final String TEXT_67 = ".class, msgs);";
+	protected final String TEXT_68 = NL + "\t\t\t\t}" + NL + "\t\t\t\tif (msgs != null) msgs.dispatch();";
+	protected final String TEXT_69 = NL + "\t\t\t\teVirtualSet(";
+	protected final String TEXT_70 = NL + "\t\t\t\tif (eNotificationRequired())" + NL + "\t\t\t\t\teNotify(new ";
+	protected final String TEXT_71 = "(this, ";
+	protected final String TEXT_72 = ".RESOLVE, ";
+	protected final String TEXT_73 = ", old";
+	protected final String TEXT_74 = "));";
+	protected final String TEXT_75 = NL + "\t\t\t}" + NL + "\t\t}";
+	protected final String TEXT_76 = NL + "\t\treturn (";
+	protected final String TEXT_77 = " & ";
+	protected final String TEXT_78 = "_EFLAG) != 0;";
+	protected final String TEXT_79 = "_EFLAG_VALUES[(";
+	protected final String TEXT_80 = "_EFLAG) >>> ";
+	protected final String TEXT_81 = "_EFLAG_OFFSET];";
+	protected final String TEXT_82 = " = basicGet";
+	protected final String TEXT_83 = "();" + NL + "\t\treturn ";
+	protected final String TEXT_84 = ".eIsProxy() ? ";
+	protected final String TEXT_85 = "eResolveProxy(";
+	protected final String TEXT_86 = ") : ";
+	protected final String TEXT_87 = NL + "\t\treturn new ";
+	protected final String TEXT_88 = "((";
+	protected final String TEXT_89 = ".Internal)((";
+	protected final String TEXT_90 = ".Internal.Wrapper)get";
+	protected final String TEXT_91 = "()).featureMap().";
+	protected final String TEXT_92 = "list(";
+	protected final String TEXT_93 = ")get";
+	protected final String TEXT_94 = "().";
+	protected final String TEXT_95 = NL + "\t\treturn ((";
+	protected final String TEXT_96 = "()).featureMap().list(";
+	protected final String TEXT_97 = NL + "\t\treturn get";
+	protected final String TEXT_98 = "().list(";
+	protected final String TEXT_99 = "()).featureMap().get(";
+	protected final String TEXT_100 = "get";
+	protected final String TEXT_101 = "().get(";
+	protected final String TEXT_102 = NL + "\t}" + NL;
+	protected final String TEXT_103 = NL;
+
+	public InterfacegetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_103);
+		stringBuffer.append(TEXT_103);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0vtMUGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/getGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wTpQGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getGetAccessor());
+			stringBuffer.append(TEXT_9);
+		} else {
+			if (genModel.useGenerics() && ((genFeature.isContainer() || genFeature.isResolveProxies())
+					&& !genFeature.isListType() && genFeature.isUncheckedCast(genClass)
+					|| genFeature.isListType() && !genFeature.isFeatureMapType()
+							&& (genModel.isReflectiveDelegation() || genModel.isVirtualDelegation()
+									|| (genModel.isDynamicDelegation() && !genFeature.isVolatile()))
+					|| genFeature.isListDataType() && genFeature.hasDelegateFeature()
+					|| genFeature.isListType() && genFeature.hasSettingDelegate())) {
+				stringBuffer.append(TEXT_10);
+			}
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingGetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getGetAccessor());
+			if (genClass.hasCollidingGetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_13);
+			}
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wczMGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_15);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_16);
+				}
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_18);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(!genFeature.isEffectiveSuppressEMFTypes());
+				stringBuffer.append(TEXT_21);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genFeature.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_23);
+				}
+				stringBuffer.append(TEXT_24);
+			} else if (genModel.isReflectiveDelegation()) {
+				if (genFeature.hasGetterBody()) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getGetterBody(genModel.getIndentation(stringBuffer)));
+				} else {
+					stringBuffer.append(TEXT_15);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_27);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genFeature.getPrimitiveValueFunction());
+						stringBuffer.append(TEXT_23);
+					}
+					stringBuffer.append(TEXT_24);
+				}
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_15);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_16);
+				}
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(genFeature.getObjectType(genClass));
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_28);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(genFeature.getPrimitiveValueFunction());
+					stringBuffer.append(TEXT_23);
+				}
+				stringBuffer.append(TEXT_24);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isListType()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_25);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_8);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_31);
+					}
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_33);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_19);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_35);
+						stringBuffer.append(genClass.getListConstructor(genFeature));
+						stringBuffer.append(TEXT_31);
+					} else {
+						stringBuffer.append(TEXT_36);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_35);
+						stringBuffer.append(genClass.getListConstructor(genFeature));
+						stringBuffer.append(TEXT_24);
+					}
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer
+							.append(genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : "");
+					stringBuffer.append(TEXT_24);
+				} else if (genFeature.isContainer()) {
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_39);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_21);
+					if (genFeature.isResolveProxies()) {
+						stringBuffer.append(TEXT_40);
+					} else {
+						stringBuffer.append(TEXT_41);
+					}
+					stringBuffer.append(TEXT_42);
+				} else {
+					if (genFeature.isResolveProxies()) {
+						if (genModel.isVirtualDelegation()) {
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_8);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_29);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_30);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							if (genFeature.hasEDefault()) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getEDefault());
+							}
+							stringBuffer.append(TEXT_31);
+						}
+						stringBuffer.append(TEXT_32);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getSafeNameAsEObject());
+						stringBuffer.append(TEXT_44);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+						stringBuffer.append(TEXT_45);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), false));
+						stringBuffer.append(TEXT_47);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_46);
+						stringBuffer.append(genFeature.getNonEObjectInternalTypeCast(genClass));
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_51);
+						if (genFeature.isEffectiveContains()) {
+							stringBuffer.append(TEXT_52);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject"));
+							stringBuffer.append(TEXT_53);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_46);
+							stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), false));
+							stringBuffer.append(TEXT_24);
+							if (!genFeature.isBidirectional()) {
+								stringBuffer.append(TEXT_52);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+								stringBuffer.append(TEXT_54);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_55);
+								stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+								stringBuffer.append(negativeOffsetCorrection);
+								stringBuffer.append(TEXT_56);
+							} else {
+								GenFeature reverseFeature = genFeature.getReverse();
+								GenClass targetClass = reverseFeature.getGenClass();
+								String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+										? " + " + genClass.getOffsetCorrectionField(genFeature)
+										: "";
+								stringBuffer.append(TEXT_52);
+								stringBuffer.append(
+										genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+								stringBuffer.append(TEXT_57);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_58);
+								stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+								stringBuffer.append(reverseOffsetCorrection);
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(targetClass.getRawImportedInterfaceName());
+								stringBuffer.append(TEXT_59);
+							}
+							stringBuffer.append(TEXT_60);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_61);
+							if (!genFeature.isBidirectional()) {
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_63);
+								stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+								stringBuffer.append(negativeOffsetCorrection);
+								stringBuffer.append(TEXT_64);
+							} else {
+								GenFeature reverseFeature = genFeature.getReverse();
+								GenClass targetClass = reverseFeature.getGenClass();
+								String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+										? " + " + genClass.getOffsetCorrectionField(genFeature)
+										: "";
+								stringBuffer.append(TEXT_65);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+								stringBuffer.append(reverseOffsetCorrection);
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(targetClass.getRawImportedInterfaceName());
+								stringBuffer.append(TEXT_67);
+							}
+							stringBuffer.append(TEXT_68);
+						} else if (genModel.isVirtualDelegation()) {
+							stringBuffer.append(TEXT_69);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_31);
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_70);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_71);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_72);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_73);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_74);
+						}
+						stringBuffer.append(TEXT_75);
+					}
+					if (!genFeature.isResolveProxies() && genModel.isVirtualDelegation()
+							&& !genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_76);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						if (genFeature.hasEDefault()) {
+							stringBuffer.append(TEXT_19);
+							stringBuffer.append(genFeature.getEDefault());
+						}
+						stringBuffer.append(TEXT_31);
+					} else if (genClass.isFlag(genFeature)) {
+						if (genFeature.isBooleanType()) {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_78);
+						} else {
+							stringBuffer.append(TEXT_15);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_79);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_77);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_80);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_81);
+						}
+					} else {
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_24);
+					}
+				}
+			} else {//volatile
+				if (genFeature.isResolveProxies() && !genFeature.isListType()) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getImportedType(genClass));
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_82);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_43);
+					stringBuffer.append(genFeature.getSafeNameAsEObject());
+					stringBuffer.append(TEXT_84);
+					stringBuffer.append(genFeature.getNonEObjectInternalTypeCast(genClass));
+					stringBuffer.append(TEXT_85);
+					stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), false));
+					stringBuffer.append(TEXT_86);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_24);
+				} else if (genFeature.hasDelegateFeature()) {
+					GenFeature delegateFeature = genFeature.getDelegateFeature();
+					if (genFeature.isFeatureMapType()) {
+						String featureMapEntryTemplateArgument = isJDK50
+								? "<" + genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap") + ".Entry>"
+								: "";
+						if (delegateFeature.isWrappedFeatureMapType()) {
+							stringBuffer.append(TEXT_87);
+							stringBuffer.append(genFeature.getImportedEffectiveFeatureMapWrapperClass());
+							stringBuffer.append(TEXT_88);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_90);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_91);
+							stringBuffer.append(featureMapEntryTemplateArgument);
+							stringBuffer.append(TEXT_92);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_74);
+						} else {
+							stringBuffer.append(TEXT_76);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_93);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_94);
+							stringBuffer.append(featureMapEntryTemplateArgument);
+							stringBuffer.append(TEXT_92);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_31);
+						}
+					} else if (genFeature.isListType()) {
+						if (delegateFeature.isWrappedFeatureMapType()) {
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_90);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_96);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_31);
+						} else {
+							stringBuffer.append(TEXT_97);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_98);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_31);
+						}
+					} else {
+						if (delegateFeature.isWrappedFeatureMapType()) {
+							stringBuffer.append(TEXT_15);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_16);
+							}
+							if (genFeature.getTypeGenDataType() == null
+									|| !genFeature.getTypeGenDataType().isObjectType()) {
+								stringBuffer.append(TEXT_16);
+								stringBuffer.append(genFeature.getObjectType(genClass));
+								stringBuffer.append(TEXT_21);
+							}
+							stringBuffer.append(TEXT_88);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+							stringBuffer.append(TEXT_90);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_99);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_27);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_22);
+								stringBuffer.append(genFeature.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_23);
+							}
+							stringBuffer.append(TEXT_24);
+						} else {
+							stringBuffer.append(TEXT_15);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_16);
+							}
+							if (genFeature.getTypeGenDataType() == null
+									|| !genFeature.getTypeGenDataType().isObjectType()) {
+								stringBuffer.append(TEXT_16);
+								stringBuffer.append(genFeature.getObjectType(genClass));
+								stringBuffer.append(TEXT_21);
+							}
+							stringBuffer.append(TEXT_100);
+							stringBuffer.append(delegateFeature.getAccessorName());
+							stringBuffer.append(TEXT_101);
+							stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+							stringBuffer.append(TEXT_27);
+							if (!isJDK50 && genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_22);
+								stringBuffer.append(genFeature.getPrimitiveValueFunction());
+								stringBuffer.append(TEXT_23);
+							}
+							stringBuffer.append(TEXT_24);
+						}
+					}
+				} else if (genClass.getGetAccessorOperation(genFeature) != null) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genClass.getGetAccessorOperation(genFeature)
+							.getBody(genModel.getIndentation(stringBuffer)));
+				} else if (genFeature.hasGetterBody()) {
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getGetterBody(genModel.getIndentation(stringBuffer)));
+				} else {
+					stringBuffer.append(TEXT_2);
+					{
+						//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+						InternalPatternContext ictx = (InternalPatternContext) ctx;
+						new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+						stringBuffer.setLength(0);
+
+						final Map<String, Object> callParameters = new HashMap<String, Object>();
+						callParameters.put("genFeature", genFeature);
+						callParameters.put("genClass", genClass);
+						callParameters.put("genPackage", genPackage);
+						callParameters.put("genModel", genModel);
+						callParameters.put("isJDK50", isJDK50);
+						callParameters.put("isInterface", isInterface);
+						callParameters.put("isImplementation", isImplementation);
+						callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+						callParameters.put("isGWT", isGWT);
+						callParameters.put("forceDefaultCase", forceDefaultCase);
+						callParameters.put("indentDefaultCase", indentDefaultCase);
+						callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+						callParameters.put("singleWildcard", singleWildcard);
+						callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+						callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+						callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+						callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+						CallHelper.executeWithParameterInjection(
+								"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0wmkMGJ-Ed-FqczH3ESmRw",
+								new ExecutionContext((InternalPatternContext) ctx), callParameters);
+						stringBuffer.setLength(0);
+					}
+
+					//Class/getGenFeature.todo.override.javajetinc
+				}
+			}
+			stringBuffer.append(TEXT_102);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturepreinsert.java
new file mode 100644
index 0000000..cb8217d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacegetGenFeaturepreinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacegetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized InterfacegetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacegetGenFeaturepreinsert result = new InterfacegetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacegetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceimplementedGenOperationTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceimplementedGenOperationTODOoverride.java
new file mode 100644
index 0000000..dc362f0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceimplementedGenOperationTODOoverride.java
@@ -0,0 +1,320 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceimplementedGenOperationTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceimplementedGenOperationTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceimplementedGenOperationTODOoverride result = new InterfaceimplementedGenOperationTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public InterfaceimplementedGenOperationTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/Interfaceinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/Interfaceinsert.java
new file mode 100644
index 0000000..1442576
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/Interfaceinsert.java
@@ -0,0 +1,304 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Interfaceinsert {
+	protected static String nl;
+
+	public static synchronized Interfaceinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		Interfaceinsert result = new Interfaceinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public Interfaceinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/Interfaceinterfacejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/Interfaceinterfacejavadocoverride.java
new file mode 100644
index 0000000..5d84f11
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/Interfaceinterfacejavadocoverride.java
@@ -0,0 +1,384 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class Interfaceinterfacejavadocoverride {
+	protected static String nl;
+
+	public static synchronized Interfaceinterfacejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		Interfaceinterfacejavadocoverride result = new Interfaceinterfacejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A representation of the model object '<em><b>";
+	protected final String TEXT_2 = "</b></em>'." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_3 = NL + " *" + NL + " * <!-- begin-model-doc -->" + NL + " * ";
+	protected final String TEXT_4 = NL + " * <!-- end-model-doc -->";
+	protected final String TEXT_5 = NL + " *";
+	protected final String TEXT_6 = NL + " * <p>" + NL + " * The following features are supported:" + NL + " * </p>"
+			+ NL + " * <ul>";
+	protected final String TEXT_7 = NL + " *   <li>{@link ";
+	protected final String TEXT_8 = "#";
+	protected final String TEXT_9 = " <em>";
+	protected final String TEXT_10 = "</em>}</li>";
+	protected final String TEXT_11 = NL + " * </ul>";
+	protected final String TEXT_12 = NL + " * @see ";
+	protected final String TEXT_13 = "#get";
+	protected final String TEXT_14 = "()";
+	protected final String TEXT_15 = NL + " * @model ";
+	protected final String TEXT_16 = NL + " *        ";
+	protected final String TEXT_17 = NL + " * @model";
+	protected final String TEXT_18 = NL + " * @extends ";
+	protected final String TEXT_19 = NL + " * ";
+	protected final String TEXT_20 = NL + " * @generated" + NL + " */" + NL;
+	protected final String TEXT_21 = NL;
+
+	public Interfaceinterfacejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(TEXT_21);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		if (genClass.hasDocumentation()) {
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genClass.getDocumentation(genModel.getIndentation(stringBuffer)));
+			stringBuffer.append(TEXT_4);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genClass.getGenFeatures().isEmpty()) {
+			stringBuffer.append(TEXT_6);
+			for (GenFeature genFeature : genClass.getGenFeatures()) {
+				if (!genFeature.isSuppressedGetVisibility()) {
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_10);
+				}
+			}
+			stringBuffer.append(TEXT_11);
+		}
+		stringBuffer.append(TEXT_5);
+		if (!genModel.isSuppressEMFMetaData()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genClass.getClassifierAccessorName());
+			stringBuffer.append(TEXT_14);
+		}
+		if (!genModel.isSuppressEMFModelTags()) {
+			boolean first = true;
+			for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer
+					.hasMoreTokens();) {
+				String modelInfo = stringTokenizer.nextToken();
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_15);
+					stringBuffer.append(modelInfo);
+				} else {
+					stringBuffer.append(TEXT_16);
+					stringBuffer.append(modelInfo);
+				}
+			}
+			if (first) {
+				stringBuffer.append(TEXT_17);
+			}
+		}
+		if (genClass.needsRootExtendsInterfaceExtendsTag()) {
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genModel.getImportedName(genModel.getRootExtendsInterface()));
+		}
+		if (genClass.hasImplicitAPITags(true)) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer), true));
+		}
+		stringBuffer.append(TEXT_20);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..351110e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureTODOoverride.java
@@ -0,0 +1,326 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceisSetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceisSetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceisSetGenFeatureTODOoverride result = new InterfaceisSetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to return whether the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = " is set" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public InterfaceisSetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..9f304f4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceisSetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfaceisSetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceisSetGenFeatureannotationsinsert result = new InterfaceisSetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfaceisSetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..426d4b9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceisSetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized InterfaceisSetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceisSetGenFeaturejavadocinsert result = new InterfaceisSetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfaceisSetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..3093bb1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeaturejavadocoverride.java
@@ -0,0 +1,399 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceisSetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceisSetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceisSetGenFeaturejavadocoverride result = new InterfaceisSetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Returns whether the value of the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = " <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = " is set.";
+	protected final String TEXT_6 = NL;
+	protected final String TEXT_7 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @return whether the value of the '<em>";
+	protected final String TEXT_8 = "</em>' ";
+	protected final String TEXT_9 = NL + "\t * @see #unset";
+	protected final String TEXT_10 = "()";
+	protected final String TEXT_11 = NL + "\t * @see #";
+	protected final String TEXT_12 = NL + "\t * @see #set";
+	protected final String TEXT_13 = "(";
+	protected final String TEXT_14 = ")";
+	protected final String TEXT_15 = NL + "\t * ";
+	protected final String TEXT_16 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_17 = NL;
+
+	public InterfaceisSetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(TEXT_17);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_6);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_01N-cGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_10);
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_10);
+		if (!genFeature.isListType() && genFeature.isChangeable() && !genFeature.isSuppressedSetVisibility()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genFeature.getRawImportedBoundType());
+			stringBuffer.append(TEXT_14);
+		}
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_16);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureoverride.java
new file mode 100644
index 0000000..9ddd3ec
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceisSetGenFeatureoverride.java
@@ -0,0 +1,573 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceisSetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceisSetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceisSetGenFeatureoverride result = new InterfaceisSetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\tboolean isSet";
+	protected final String TEXT_8 = "();" + NL;
+	protected final String TEXT_9 = NL + "\t@Override";
+	protected final String TEXT_10 = NL + "\tpublic boolean isSet";
+	protected final String TEXT_11 = "_";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t\treturn eDynamicIsSet(";
+	protected final String TEXT_14 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_15 = ", ";
+	protected final String TEXT_16 = ");";
+	protected final String TEXT_17 = NL + "\t\treturn eIsSet(";
+	protected final String TEXT_18 = NL + "\t\treturn ";
+	protected final String TEXT_19 = "__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);";
+	protected final String TEXT_20 = NL + "\t\t";
+	protected final String TEXT_21 = " ";
+	protected final String TEXT_22 = " = (";
+	protected final String TEXT_23 = ")eVirtualGet(";
+	protected final String TEXT_24 = " != null && ((";
+	protected final String TEXT_25 = ".Unsettable";
+	protected final String TEXT_26 = ")";
+	protected final String TEXT_27 = ").isSet();";
+	protected final String TEXT_28 = NL + "\t\treturn eVirtualIsSet(";
+	protected final String TEXT_29 = NL + "\t\treturn (";
+	protected final String TEXT_30 = " & ";
+	protected final String TEXT_31 = "_ESETFLAG) != 0;";
+	protected final String TEXT_32 = "ESet;";
+	protected final String TEXT_33 = NL + "\t\treturn !((";
+	protected final String TEXT_34 = ".Internal)((";
+	protected final String TEXT_35 = ".Internal.Wrapper)get";
+	protected final String TEXT_36 = "()).featureMap()).isEmpty(";
+	protected final String TEXT_37 = ".Internal)get";
+	protected final String TEXT_38 = "()).isEmpty(";
+	protected final String TEXT_39 = NL + "\t}" + NL;
+	protected final String TEXT_40 = NL;
+
+	public InterfaceisSetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_40);
+		stringBuffer.append(TEXT_40);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_00x5kGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/isSetGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/isSetGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_01hgcGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_8);
+		} else {
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingIsSetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getAccessorName());
+			if (genClass.hasCollidingIsSetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_14);
+				}
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genModel.isReflectiveDelegation()) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_19);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isListType()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(singleWildcard);
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_27);
+				} else {
+					if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_28);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					} else if (genClass.isESetFlag(genFeature)) {
+						stringBuffer.append(TEXT_29);
+						stringBuffer.append(genClass.getESetFlagsField(genFeature));
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_31);
+					} else {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getUncapName());
+						stringBuffer.append(TEXT_32);
+					}
+				}
+			} else if (genFeature.hasDelegateFeature()) {
+				GenFeature delegateFeature = genFeature.getDelegateFeature();
+				if (delegateFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				} else {
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_37);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_38);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				}
+			} else if (genClass.getIsSetAccessorOperation(genFeature) != null) {
+				stringBuffer.append(TEXT_20);
+				stringBuffer.append(
+						genClass.getIsSetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer)));
+			} else {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_01qqYGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/isSetGenFeature.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_39);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacereflectiveDelegationoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacereflectiveDelegationoverride.java
new file mode 100644
index 0000000..4c0be33
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacereflectiveDelegationoverride.java
@@ -0,0 +1,338 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacereflectiveDelegationoverride {
+	protected static String nl;
+
+	public static synchronized InterfacereflectiveDelegationoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacereflectiveDelegationoverride result = new InterfacereflectiveDelegationoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected static final int ESTATIC_FEATURE_COUNT = ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_5 = NL + "\t@Override";
+	protected final String TEXT_6 = NL + "\tprotected int eStaticFeatureCount()" + NL + "\t{" + NL + "\t\treturn ";
+	protected final String TEXT_7 = ";" + NL + "\t}" + NL;
+	protected final String TEXT_8 = NL;
+	protected final String TEXT_9 = NL;
+
+	public InterfacereflectiveDelegationoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+						for (Object isInterfaceParameter : isInterfaceList) {
+							for (Object isImplementationParameter : isImplementationList) {
+								for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+									for (Object isGWTParameter : isGWTList) {
+										for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+											for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+												for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+													for (Object singleWildcardParameter : singleWildcardList) {
+														for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+															for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																	for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																		this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																		this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																		this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																		this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																		this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																		this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																		this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																		this.isGWT = (java.lang.Boolean) isGWTParameter;
+																		this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																		this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																		this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																		this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																		this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																		this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																		this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																		this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																		if (preCondition(ctx)) {
+																			ctx.setNode(new Node.Container(currentNode,
+																					getClass()));
+																			orchestration(ctx);
+																		}
+
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_9);
+		stringBuffer.append(TEXT_9);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isImplementation
+				&& (genModel.getFeatureDelegation() == GenDelegationKind.REFLECTIVE_LITERAL
+						|| genModel.isDynamicDelegation())
+				&& (genClass.getClassExtendsGenClass() == null || (genClass.getClassExtendsGenClass().getGenModel()
+						.getFeatureDelegation() != GenDelegationKind.REFLECTIVE_LITERAL
+						&& !genClass.getClassExtendsGenClass().getGenModel().isDynamicDelegation()))) {
+			if (genClass.hasStaticFeatures()) {
+				stringBuffer.append(TEXT_2);
+				stringBuffer.append(genClass.getClassExtendsGenClass() == null ? 0
+						: genClass.getClassExtendsGenClass().getAllGenFeatures().size());
+				stringBuffer.append(TEXT_3);
+			}
+			stringBuffer.append(TEXT_4);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_5);
+			}
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genClass.getClassExtendsGenClass() == null ? "0"
+					: genClass.hasStaticFeatures() ? "ESTATIC_FEATURE_COUNT"
+							: Integer.toString(genClass.getClassExtendsGenClass().getAllGenFeatures().size()));
+			stringBuffer.append(TEXT_7);
+		}
+		stringBuffer.append(TEXT_8);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..9ad2007
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureTODOoverride.java
@@ -0,0 +1,338 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeatureTODOoverride result = new InterfacesetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to set the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public InterfacesetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..d38198e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeatureannotationsinsert result = new InterfacesetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacesetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..c5b45b8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeaturejavadocinsert result = new InterfacesetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacesetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..0458515
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturejavadocoverride.java
@@ -0,0 +1,402 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeaturejavadocoverride result = new InterfacesetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Sets the value of the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = " <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = ".";
+	protected final String TEXT_6 = NL;
+	protected final String TEXT_7 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param value the new value of the '<em>";
+	protected final String TEXT_8 = "</em>' ";
+	protected final String TEXT_9 = NL + "\t * @see ";
+	protected final String TEXT_10 = NL + "\t * @see #isSet";
+	protected final String TEXT_11 = "()";
+	protected final String TEXT_12 = NL + "\t * @see #unset";
+	protected final String TEXT_13 = NL + "\t * @see #";
+	protected final String TEXT_14 = NL + "\t * ";
+	protected final String TEXT_15 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_16 = NL;
+
+	public InterfacesetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(TEXT_16);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_6);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0yid4GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.isEnumType()) {
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genFeature.getTypeGenEnum().getQualifiedName());
+		}
+		if (genFeature.isUnsettable()) {
+			if (!genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_11);
+			}
+			if (!genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_12);
+				stringBuffer.append(genFeature.getAccessorName());
+				stringBuffer.append(TEXT_11);
+			}
+		}
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_11);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureoverride.java
new file mode 100644
index 0000000..fd23c00
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeatureoverride.java
@@ -0,0 +1,1235 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeatureoverride result = new InterfacesetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\tvoid set";
+	protected final String TEXT_8 = "(";
+	protected final String TEXT_9 = " value);" + NL;
+	protected final String TEXT_10 = NL + "\t@Override";
+	protected final String TEXT_11 = NL + "\tpublic void set";
+	protected final String TEXT_12 = "_";
+	protected final String TEXT_13 = " ";
+	protected final String TEXT_14 = ")" + NL + "\t{";
+	protected final String TEXT_15 = NL + "\t\teDynamicSet(";
+	protected final String TEXT_16 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_17 = ", ";
+	protected final String TEXT_18 = "new ";
+	protected final String TEXT_19 = "new";
+	protected final String TEXT_20 = ")";
+	protected final String TEXT_21 = ");";
+	protected final String TEXT_22 = NL + "\t\teSet(";
+	protected final String TEXT_23 = NL + "\t\t";
+	protected final String TEXT_24 = "__ESETTING_DELEGATE.dynamicSet(this, null, 0, ";
+	protected final String TEXT_25 = NL + "\t\tif (new";
+	protected final String TEXT_26 = " != eInternalContainer() || (eContainerFeatureID() != ";
+	protected final String TEXT_27 = " && new";
+	protected final String TEXT_28 = " != null))" + NL + "\t\t{" + NL + "\t\t\tif (";
+	protected final String TEXT_29 = ".isAncestor(this, ";
+	protected final String TEXT_30 = "))" + NL + "\t\t\t\tthrow new ";
+	protected final String TEXT_31 = "(\"Recursive containment not allowed for \" + toString());";
+	protected final String TEXT_32 = NL + "\t\t\t";
+	protected final String TEXT_33 = " msgs = null;" + NL + "\t\t\tif (eInternalContainer() != null)" + NL
+			+ "\t\t\t\tmsgs = eBasicRemoveFromContainer(msgs);" + NL + "\t\t\tif (new";
+	protected final String TEXT_34 = " != null)" + NL + "\t\t\t\tmsgs = ";
+	protected final String TEXT_35 = ".eInverseAdd(this, ";
+	protected final String TEXT_36 = ".class, msgs);" + NL + "\t\t\tmsgs = basicSet";
+	protected final String TEXT_37 = ", msgs);" + NL + "\t\t\tif (msgs != null) msgs.dispatch();" + NL + "\t\t}";
+	protected final String TEXT_38 = NL + "\t\telse if (eNotificationRequired())" + NL + "\t\t\teNotify(new ";
+	protected final String TEXT_39 = "(this, ";
+	protected final String TEXT_40 = ".SET, ";
+	protected final String TEXT_41 = ", new";
+	protected final String TEXT_42 = "));";
+	protected final String TEXT_43 = " = (";
+	protected final String TEXT_44 = ")eVirtualGet(";
+	protected final String TEXT_45 = " != ";
+	protected final String TEXT_46 = ")" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_47 = " msgs = null;" + NL + "\t\t\tif (";
+	protected final String TEXT_48 = " != null)";
+	protected final String TEXT_49 = NL + "\t\t\t\tmsgs = ";
+	protected final String TEXT_50 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_51 = ", null, msgs);" + NL + "\t\t\tif (new";
+	protected final String TEXT_52 = ".eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_53 = ", null, msgs);";
+	protected final String TEXT_54 = ".eInverseRemove(this, ";
+	protected final String TEXT_55 = ".class, msgs);" + NL + "\t\t\tif (new";
+	protected final String TEXT_56 = ".class, msgs);";
+	protected final String TEXT_57 = NL + "\t\t\tmsgs = basicSet";
+	protected final String TEXT_58 = NL + "\t\telse" + NL + "\t\t{";
+	protected final String TEXT_59 = NL + "\t\t\tboolean old";
+	protected final String TEXT_60 = "ESet = eVirtualIsSet(";
+	protected final String TEXT_61 = "ESet = (";
+	protected final String TEXT_62 = " & ";
+	protected final String TEXT_63 = "_ESETFLAG) != 0;";
+	protected final String TEXT_64 = " |= ";
+	protected final String TEXT_65 = "_ESETFLAG;";
+	protected final String TEXT_66 = "ESet = ";
+	protected final String TEXT_67 = "ESet;";
+	protected final String TEXT_68 = "ESet = true;";
+	protected final String TEXT_69 = NL + "\t\t\tif (eNotificationRequired())" + NL + "\t\t\t\teNotify(new ";
+	protected final String TEXT_70 = ", !old";
+	protected final String TEXT_71 = "ESet));";
+	protected final String TEXT_72 = NL + "\t\t}";
+	protected final String TEXT_73 = " old";
+	protected final String TEXT_74 = "_EFLAG) != 0;";
+	protected final String TEXT_75 = " = ";
+	protected final String TEXT_76 = "_EFLAG_VALUES[(";
+	protected final String TEXT_77 = "_EFLAG) >>> ";
+	protected final String TEXT_78 = "_EFLAG_OFFSET];";
+	protected final String TEXT_79 = ") ";
+	protected final String TEXT_80 = "_EFLAG; else ";
+	protected final String TEXT_81 = " &= ~";
+	protected final String TEXT_82 = "_EFLAG;";
+	protected final String TEXT_83 = " == null) new";
+	protected final String TEXT_84 = "_EDEFAULT;" + NL + "\t\t";
+	protected final String TEXT_85 = " & ~";
+	protected final String TEXT_86 = "_EFLAG | ";
+	protected final String TEXT_87 = ".ordinal()";
+	protected final String TEXT_88 = ".VALUES.indexOf(new";
+	protected final String TEXT_89 = " << ";
+	protected final String TEXT_90 = "_EFLAG_OFFSET;";
+	protected final String TEXT_91 = ";";
+	protected final String TEXT_92 = " = new";
+	protected final String TEXT_93 = " == null ? ";
+	protected final String TEXT_94 = " : new";
+	protected final String TEXT_95 = NL + "\t\tObject old";
+	protected final String TEXT_96 = " = eVirtualSet(";
+	protected final String TEXT_97 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_98 = " == EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_99 = NL + "\t\tboolean old";
+	protected final String TEXT_100 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t\teNotify(new ";
+	protected final String TEXT_101 = "isSetChange ? ";
+	protected final String TEXT_102 = " : old";
+	protected final String TEXT_103 = "old";
+	protected final String TEXT_104 = "isSetChange";
+	protected final String TEXT_105 = "!old";
+	protected final String TEXT_106 = "ESet";
+	protected final String TEXT_107 = " == EVIRTUAL_NO_VALUE ? ";
+	protected final String TEXT_108 = NL + "\t\t((";
+	protected final String TEXT_109 = ".Internal)((";
+	protected final String TEXT_110 = ".Internal.Wrapper)get";
+	protected final String TEXT_111 = "()).featureMap()).set(";
+	protected final String TEXT_112 = ".Internal)get";
+	protected final String TEXT_113 = "()).set(";
+	protected final String TEXT_114 = NL + "\t}" + NL;
+	protected final String TEXT_115 = NL;
+
+	public InterfacesetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_115);
+		stringBuffer.append(TEXT_115);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0yZT8GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/setGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0ysO4GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_9);
+		} else {
+			GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingSetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedSetVisibility()) {
+				stringBuffer.append(TEXT_10);
+			}
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getAccessorName());
+			if (genClass.hasCollidingSetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_12);
+			}
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getImportedType(genClass));
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(setAccessorOperation == null ? "new" + genFeature.getCapName()
+					: setAccessorOperation.getGenParameters().get(0).getName());
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("setAccessorOperation", setAccessorOperation);
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0y1Y0GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicSetGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_eTdDcCSWEemxeP6B0lLOpA",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_16);
+				}
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_17);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getCapName());
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_21);
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicSetGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_eZahgCSWEemxeP6B0lLOpA",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			} else if (genModel.isReflectiveDelegation()) {
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_17);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getCapName());
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_21);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_24);
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_18);
+					stringBuffer.append(genFeature.getObjectType(genClass));
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_19);
+				stringBuffer.append(genFeature.getCapName());
+				if (!isJDK50 && genFeature.isPrimitiveType()) {
+					stringBuffer.append(TEXT_20);
+				}
+				stringBuffer.append(TEXT_21);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isContainer()) {
+					GenFeature reverseFeature = genFeature.getReverse();
+					GenClass targetClass = reverseFeature.getGenClass();
+					String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+							? " + " + genClass.getOffsetCorrectionField(genFeature)
+							: "";
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+					stringBuffer.append(positiveOffsetCorrection);
+					stringBuffer.append(TEXT_27);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil"));
+					stringBuffer.append(TEXT_29);
+					stringBuffer.append(genFeature.getEObjectCast());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_30);
+					stringBuffer.append(genModel.getImportedName("java.lang.IllegalArgumentException"));
+					stringBuffer.append(TEXT_31);
+					stringBuffer.append(genModel.getNonNLS());
+					stringBuffer.append(TEXT_32);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+					stringBuffer.append(TEXT_33);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_34);
+					stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true));
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+					stringBuffer.append(reverseOffsetCorrection);
+					stringBuffer.append(TEXT_17);
+					stringBuffer.append(targetClass.getRawImportedInterfaceName());
+					stringBuffer.append(TEXT_36);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getInternalTypeCast());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_37);
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+						stringBuffer.append(TEXT_39);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+						stringBuffer.append(TEXT_40);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_41);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_42);
+					}
+				} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_23);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_13);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_44);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_21);
+					}
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_46);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_48);
+					if (!genFeature.isBidirectional()) {
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true));
+						stringBuffer.append(TEXT_52);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_53);
+					} else {
+						GenFeature reverseFeature = genFeature.getReverse();
+						GenClass targetClass = reverseFeature.getGenClass();
+						String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+								? " + " + genClass.getOffsetCorrectionField(genFeature)
+								: "";
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_54);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_55);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_34);
+						stringBuffer.append(genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true));
+						stringBuffer.append(TEXT_35);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_17);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_56);
+					}
+					stringBuffer.append(TEXT_57);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getInternalTypeCast());
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					stringBuffer.append(TEXT_37);
+					if (genFeature.isUnsettable()) {
+						stringBuffer.append(TEXT_58);
+						if (genModel.isVirtualDelegation()) {
+							stringBuffer.append(TEXT_59);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_60);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_21);
+						} else if (genClass.isESetFlag(genFeature)) {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_59);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_61);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_63);
+							}
+							stringBuffer.append(TEXT_32);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_64);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_65);
+						} else {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_59);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_67);
+							}
+							stringBuffer.append(TEXT_32);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_68);
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_69);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_70);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_71);
+						}
+						stringBuffer.append(TEXT_72);
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_38);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_41);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_42);
+						}
+					}
+				} else {
+					if (genClass.isFlag(genFeature)) {
+						if (!genModel.isSuppressNotification()) {
+							if (genFeature.isBooleanType()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_74);
+							} else {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_78);
+							}
+						}
+						if (genFeature.isBooleanType()) {
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_79);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_64);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_80);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_81);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_82);
+						} else {
+							stringBuffer.append(TEXT_25);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_83);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_75);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_84);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_75);
+							stringBuffer.append(genClass.getFlagsField(genFeature));
+							stringBuffer.append(TEXT_85);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_86);
+							if (isJDK50) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_87);
+							} else {
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_88);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_20);
+							}
+							stringBuffer.append(TEXT_89);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_90);
+						}
+					} else {
+						if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_73);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_91);
+							}
+						}
+						if (genFeature.isEnumType()) {
+							if (genModel.isVirtualDelegation()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_13);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_93);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_94);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							} else {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_92);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_93);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_94);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							}
+						} else {
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_13);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getInternalTypeCast());
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							} else {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getSafeName());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genFeature.getInternalTypeCast());
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_91);
+							}
+						}
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_95);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_96);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_17);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_21);
+						}
+					}
+					if (genFeature.isUnsettable()) {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_97);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_98);
+						} else if (genClass.isESetFlag(genFeature)) {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_61);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_62);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_63);
+							}
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_64);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_65);
+						} else {
+							if (!genModel.isSuppressNotification()) {
+								stringBuffer.append(TEXT_99);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_66);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_67);
+							}
+							stringBuffer.append(TEXT_23);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_68);
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_100);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_17);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_101);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_102);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(TEXT_103);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_17);
+							if (genClass.isFlag(genFeature)) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(genFeature.getSafeName());
+							}
+							stringBuffer.append(TEXT_17);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_104);
+							} else {
+								stringBuffer.append(TEXT_105);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_106);
+							}
+							stringBuffer.append(TEXT_42);
+						}
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_100);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_17);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_103);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_107);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_102);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(TEXT_103);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_17);
+							if (genClass.isFlag(genFeature)) {
+								stringBuffer.append(TEXT_19);
+								stringBuffer.append(genFeature.getCapName());
+							} else {
+								stringBuffer.append(genFeature.getSafeName());
+							}
+							stringBuffer.append(TEXT_42);
+						}
+					}
+				}
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0y_J0GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			} else if (genFeature.hasDelegateFeature()) {
+				GenFeature delegateFeature = genFeature.getDelegateFeature();
+				if (delegateFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_108);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_109);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_110);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_111);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_17);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_8);
+					}
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_20);
+					}
+					stringBuffer.append(TEXT_21);
+				} else {
+					stringBuffer.append(TEXT_108);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_112);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_113);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_17);
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getObjectType(genClass));
+						stringBuffer.append(TEXT_8);
+					}
+					stringBuffer.append(TEXT_19);
+					stringBuffer.append(genFeature.getCapName());
+					if (!isJDK50 && genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_20);
+					}
+					stringBuffer.append(TEXT_21);
+				}
+			} else if (setAccessorOperation != null) {
+				stringBuffer.append(TEXT_23);
+				stringBuffer.append(setAccessorOperation.getBody(genModel.getIndentation(stringBuffer)));
+			} else {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.TODO.override" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("setAccessorOperation", setAccessorOperation);
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0y_J5WJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/setGenFeature.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_114);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturepostinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturepostinsert.java
new file mode 100644
index 0000000..90bd053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturepostinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeaturepostinsert {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeaturepostinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeaturepostinsert result = new InterfacesetGenFeaturepostinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacesetGenFeaturepostinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturepreinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturepreinsert.java
new file mode 100644
index 0000000..a35b5df
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfacesetGenFeaturepreinsert.java
@@ -0,0 +1,330 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfacesetGenFeaturepreinsert {
+	protected static String nl;
+
+	public static synchronized InterfacesetGenFeaturepreinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfacesetGenFeaturepreinsert result = new InterfacesetGenFeaturepreinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfacesetGenFeaturepreinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> setAccessorOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object setAccessorOperationParameter : setAccessorOperationList) {
+			for (Object genFeatureParameter : genFeatureList) {
+				for (Object genClassParameter : genClassList) {
+					for (Object genPackageParameter : genPackageList) {
+						for (Object genModelParameter : genModelList) {
+							for (Object isJDK50Parameter : isJDK50List) {
+								for (Object isInterfaceParameter : isInterfaceList) {
+									for (Object isImplementationParameter : isImplementationList) {
+										for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+											for (Object isGWTParameter : isGWTList) {
+												for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+													for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+														for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+															for (Object singleWildcardParameter : singleWildcardList) {
+																for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																	for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																		for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																			for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																				this.setAccessorOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) setAccessorOperationParameter;
+																				this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																				this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																				this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																				this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																				this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																				this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																				this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																				this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																				this.isGWT = (java.lang.Boolean) isGWTParameter;
+																				this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																				this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																				this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																				this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																				this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																				this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																				this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																				this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																				if (preCondition(ctx)) {
+																					ctx.setNode(new Node.Container(
+																							currentNode, getClass()));
+																					orchestration(ctx);
+																				}
+
+																			}
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("setAccessorOperation", this.setAccessorOperation);
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation setAccessorOperation = null;
+
+	public void set_setAccessorOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.setAccessorOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("setAccessorOperation", this.setAccessorOperation);
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..99fb894
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureTODOoverride.java
@@ -0,0 +1,325 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceunsetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceunsetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceunsetGenFeatureTODOoverride result = new InterfaceunsetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this method to unset the '";
+	protected final String TEXT_2 = "' ";
+	protected final String TEXT_3 = NL + "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL
+			+ "\t\tthrow new UnsupportedOperationException();" + NL;
+	protected final String TEXT_4 = NL;
+
+	public InterfaceunsetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(TEXT_4);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_3);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..172072a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureannotationsinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceunsetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized InterfaceunsetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceunsetGenFeatureannotationsinsert result = new InterfaceunsetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfaceunsetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeaturejavadocinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeaturejavadocinsert.java
new file mode 100644
index 0000000..0fa17fd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeaturejavadocinsert.java
@@ -0,0 +1,317 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceunsetGenFeaturejavadocinsert {
+	protected static String nl;
+
+	public static synchronized InterfaceunsetGenFeaturejavadocinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceunsetGenFeaturejavadocinsert result = new InterfaceunsetGenFeaturejavadocinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public InterfaceunsetGenFeaturejavadocinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeaturejavadocoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeaturejavadocoverride.java
new file mode 100644
index 0000000..79ebe96
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeaturejavadocoverride.java
@@ -0,0 +1,393 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceunsetGenFeaturejavadocoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceunsetGenFeaturejavadocoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceunsetGenFeaturejavadocoverride result = new InterfaceunsetGenFeaturejavadocoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t/**" + NL + "\t * Unsets the value of the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = " <em>";
+	protected final String TEXT_4 = "</em>}' ";
+	protected final String TEXT_5 = ".";
+	protected final String TEXT_6 = NL;
+	protected final String TEXT_7 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
+	protected final String TEXT_8 = NL + "\t * @see #isSet";
+	protected final String TEXT_9 = "()";
+	protected final String TEXT_10 = NL + "\t * @see #";
+	protected final String TEXT_11 = NL + "\t * @see #set";
+	protected final String TEXT_12 = "(";
+	protected final String TEXT_13 = ")";
+	protected final String TEXT_14 = NL + "\t * ";
+	protected final String TEXT_15 = NL + "\t * @generated" + NL + "\t */" + NL;
+	protected final String TEXT_16 = NL;
+
+	public InterfaceunsetGenFeaturejavadocoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(TEXT_16);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genClass.getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFeatureKind());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_6);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			callParameters.put("isInterface", isInterface);
+			callParameters.put("isImplementation", isImplementation);
+			callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+			callParameters.put("isGWT", isGWT);
+			callParameters.put("forceDefaultCase", forceDefaultCase);
+			callParameters.put("indentDefaultCase", indentDefaultCase);
+			callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+			callParameters.put("singleWildcard", singleWildcard);
+			callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+			callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+			callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+			callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_00LcoGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_7);
+		if (!genFeature.isSuppressedIsSetVisibility()) {
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_9);
+		if (!genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genFeature.getRawImportedBoundType());
+			stringBuffer.append(TEXT_13);
+		}
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureoverride.java
new file mode 100644
index 0000000..c063832
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/Interface/InterfaceunsetGenFeatureoverride.java
@@ -0,0 +1,887 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.Interface;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class InterfaceunsetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized InterfaceunsetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		InterfaceunsetGenFeatureoverride result = new InterfaceunsetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->";
+	protected final String TEXT_4 = NL + "\t * ";
+	protected final String TEXT_5 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_6 = NL + "\t@Deprecated";
+	protected final String TEXT_7 = NL + "\tvoid unset";
+	protected final String TEXT_8 = "();" + NL;
+	protected final String TEXT_9 = NL + "\t@Override";
+	protected final String TEXT_10 = NL + "\tpublic void unset";
+	protected final String TEXT_11 = "_";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t\teDynamicUnset(";
+	protected final String TEXT_14 = " - ESTATIC_FEATURE_COUNT";
+	protected final String TEXT_15 = ", ";
+	protected final String TEXT_16 = ");";
+	protected final String TEXT_17 = NL + "\t\teUnset(";
+	protected final String TEXT_18 = NL + "\t\t";
+	protected final String TEXT_19 = "__ESETTING_DELEGATE.dynamicUnset(this, null, 0);";
+	protected final String TEXT_20 = " ";
+	protected final String TEXT_21 = " = (";
+	protected final String TEXT_22 = ")eVirtualGet(";
+	protected final String TEXT_23 = NL + "\t\tif (";
+	protected final String TEXT_24 = " != null) ((";
+	protected final String TEXT_25 = ".Unsettable";
+	protected final String TEXT_26 = ")";
+	protected final String TEXT_27 = ").unset();";
+	protected final String TEXT_28 = " != null)" + NL + "\t\t{" + NL + "\t\t\t";
+	protected final String TEXT_29 = " msgs = null;";
+	protected final String TEXT_30 = NL + "\t\t\tmsgs = ";
+	protected final String TEXT_31 = ".eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ";
+	protected final String TEXT_32 = ", null, msgs);";
+	protected final String TEXT_33 = ".eInverseRemove(this, ";
+	protected final String TEXT_34 = ".class, msgs);";
+	protected final String TEXT_35 = NL + "\t\t\tmsgs = basicUnset";
+	protected final String TEXT_36 = "(msgs);" + NL + "\t\t\tif (msgs != null) msgs.dispatch();" + NL + "\t\t}" + NL
+			+ "\t\telse" + NL + "\t\t{";
+	protected final String TEXT_37 = NL + "\t\t\tboolean old";
+	protected final String TEXT_38 = "ESet = eVirtualIsSet(";
+	protected final String TEXT_39 = "ESet = (";
+	protected final String TEXT_40 = " & ";
+	protected final String TEXT_41 = "_ESETFLAG) != 0;";
+	protected final String TEXT_42 = NL + "\t\t\t";
+	protected final String TEXT_43 = " &= ~";
+	protected final String TEXT_44 = "_ESETFLAG;";
+	protected final String TEXT_45 = "ESet = ";
+	protected final String TEXT_46 = "ESet;";
+	protected final String TEXT_47 = "ESet = false;";
+	protected final String TEXT_48 = NL + "\t\t\tif (eNotificationRequired())" + NL + "\t\t\t\teNotify(new ";
+	protected final String TEXT_49 = "(this, ";
+	protected final String TEXT_50 = ".UNSET, ";
+	protected final String TEXT_51 = ", null, null, old";
+	protected final String TEXT_52 = "ESet));";
+	protected final String TEXT_53 = NL + "\t\t}";
+	protected final String TEXT_54 = " old";
+	protected final String TEXT_55 = "_EFLAG) != 0;";
+	protected final String TEXT_56 = " = ";
+	protected final String TEXT_57 = "_EFLAG_VALUES[(";
+	protected final String TEXT_58 = "_EFLAG) >>> ";
+	protected final String TEXT_59 = "_EFLAG_OFFSET];";
+	protected final String TEXT_60 = NL + "\t\tObject old";
+	protected final String TEXT_61 = " = eVirtualUnset(";
+	protected final String TEXT_62 = ";";
+	protected final String TEXT_63 = NL + "\t\tboolean isSetChange = old";
+	protected final String TEXT_64 = " != EVIRTUAL_NO_VALUE;";
+	protected final String TEXT_65 = NL + "\t\tboolean old";
+	protected final String TEXT_66 = " = null;";
+	protected final String TEXT_67 = NL + "\t\tif (eNotificationRequired())" + NL + "\t\t\teNotify(new ";
+	protected final String TEXT_68 = "isSetChange ? old";
+	protected final String TEXT_69 = " : null";
+	protected final String TEXT_70 = "old";
+	protected final String TEXT_71 = ", null, ";
+	protected final String TEXT_72 = "isSetChange";
+	protected final String TEXT_73 = "ESet";
+	protected final String TEXT_74 = "));";
+	protected final String TEXT_75 = ") ";
+	protected final String TEXT_76 = " |= ";
+	protected final String TEXT_77 = "_EFLAG; else ";
+	protected final String TEXT_78 = "_EFLAG;";
+	protected final String TEXT_79 = " & ~";
+	protected final String TEXT_80 = "_EFLAG | ";
+	protected final String TEXT_81 = "_EFLAG_DEFAULT;";
+	protected final String TEXT_82 = " : ";
+	protected final String TEXT_83 = NL + "\t\t((";
+	protected final String TEXT_84 = ".Internal)((";
+	protected final String TEXT_85 = ".Internal.Wrapper)get";
+	protected final String TEXT_86 = "()).featureMap()).clear(";
+	protected final String TEXT_87 = ".Internal)get";
+	protected final String TEXT_88 = "()).clear(";
+	protected final String TEXT_89 = NL + "\t}" + NL;
+	protected final String TEXT_90 = NL;
+
+	public InterfaceunsetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isInterfaceList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isImplementationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> useInterfaceOverrideAnnotationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isGWTList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> forceDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> indentDefaultCaseList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> publicStaticFinalFlagList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> negativeOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> positiveOperationOffsetCorrectionList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+							for (Object isInterfaceParameter : isInterfaceList) {
+								for (Object isImplementationParameter : isImplementationList) {
+									for (Object useInterfaceOverrideAnnotationParameter : useInterfaceOverrideAnnotationList) {
+										for (Object isGWTParameter : isGWTList) {
+											for (Object forceDefaultCaseParameter : forceDefaultCaseList) {
+												for (Object indentDefaultCaseParameter : indentDefaultCaseList) {
+													for (Object publicStaticFinalFlagParameter : publicStaticFinalFlagList) {
+														for (Object singleWildcardParameter : singleWildcardList) {
+															for (Object negativeOffsetCorrectionParameter : negativeOffsetCorrectionList) {
+																for (Object positiveOffsetCorrectionParameter : positiveOffsetCorrectionList) {
+																	for (Object negativeOperationOffsetCorrectionParameter : negativeOperationOffsetCorrectionList) {
+																		for (Object positiveOperationOffsetCorrectionParameter : positiveOperationOffsetCorrectionList) {
+
+																			this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+																			this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+																			this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+																			this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+																			this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+																			this.isInterface = (java.lang.Boolean) isInterfaceParameter;
+																			this.isImplementation = (java.lang.Boolean) isImplementationParameter;
+																			this.useInterfaceOverrideAnnotation = (java.lang.Boolean) useInterfaceOverrideAnnotationParameter;
+																			this.isGWT = (java.lang.Boolean) isGWTParameter;
+																			this.forceDefaultCase = (java.lang.Boolean) forceDefaultCaseParameter;
+																			this.indentDefaultCase = (java.lang.String) indentDefaultCaseParameter;
+																			this.publicStaticFinalFlag = (java.lang.String) publicStaticFinalFlagParameter;
+																			this.singleWildcard = (java.lang.String) singleWildcardParameter;
+																			this.negativeOffsetCorrection = (java.lang.String) negativeOffsetCorrectionParameter;
+																			this.positiveOffsetCorrection = (java.lang.String) positiveOffsetCorrectionParameter;
+																			this.negativeOperationOffsetCorrection = (java.lang.String) negativeOperationOffsetCorrectionParameter;
+																			this.positiveOperationOffsetCorrection = (java.lang.String) positiveOperationOffsetCorrectionParameter;
+
+																			if (preCondition(ctx)) {
+																				ctx.setNode(new Node.Container(
+																						currentNode, getClass()));
+																				orchestration(ctx);
+																			}
+
+																		}
+																	}
+																}
+															}
+														}
+													}
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_90);
+		stringBuffer.append(TEXT_90);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("isInterface", this.isInterface);
+			parameterValues.put("isImplementation", this.isImplementation);
+			parameterValues.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+			parameterValues.put("isGWT", this.isGWT);
+			parameterValues.put("forceDefaultCase", this.forceDefaultCase);
+			parameterValues.put("indentDefaultCase", this.indentDefaultCase);
+			parameterValues.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+			parameterValues.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+			parameterValues.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+			parameterValues.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.Boolean isInterface = null;
+
+	public void set_isInterface(java.lang.Boolean object) {
+		this.isInterface = object;
+	}
+
+	protected java.lang.Boolean isImplementation = null;
+
+	public void set_isImplementation(java.lang.Boolean object) {
+		this.isImplementation = object;
+	}
+
+	protected java.lang.Boolean useInterfaceOverrideAnnotation = null;
+
+	public void set_useInterfaceOverrideAnnotation(java.lang.Boolean object) {
+		this.useInterfaceOverrideAnnotation = object;
+	}
+
+	protected java.lang.Boolean isGWT = null;
+
+	public void set_isGWT(java.lang.Boolean object) {
+		this.isGWT = object;
+	}
+
+	protected java.lang.Boolean forceDefaultCase = null;
+
+	public void set_forceDefaultCase(java.lang.Boolean object) {
+		this.forceDefaultCase = object;
+	}
+
+	protected java.lang.String indentDefaultCase = null;
+
+	public void set_indentDefaultCase(java.lang.String object) {
+		this.indentDefaultCase = object;
+	}
+
+	protected java.lang.String publicStaticFinalFlag = null;
+
+	public void set_publicStaticFinalFlag(java.lang.String object) {
+		this.publicStaticFinalFlag = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String negativeOffsetCorrection = null;
+
+	public void set_negativeOffsetCorrection(java.lang.String object) {
+		this.negativeOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOffsetCorrection = null;
+
+	public void set_positiveOffsetCorrection(java.lang.String object) {
+		this.positiveOffsetCorrection = object;
+	}
+
+	protected java.lang.String negativeOperationOffsetCorrection = null;
+
+	public void set_negativeOperationOffsetCorrection(java.lang.String object) {
+		this.negativeOperationOffsetCorrection = object;
+	}
+
+	protected java.lang.String positiveOperationOffsetCorrection = null;
+
+	public void set_positiveOperationOffsetCorrection(java.lang.String object) {
+		this.positiveOperationOffsetCorrection = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("isInterface", this.isInterface);
+		parameters.put("isImplementation", this.isImplementation);
+		parameters.put("useInterfaceOverrideAnnotation", this.useInterfaceOverrideAnnotation);
+		parameters.put("isGWT", this.isGWT);
+		parameters.put("forceDefaultCase", this.forceDefaultCase);
+		parameters.put("indentDefaultCase", this.indentDefaultCase);
+		parameters.put("publicStaticFinalFlag", this.publicStaticFinalFlag);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("negativeOffsetCorrection", this.negativeOffsetCorrection);
+		parameters.put("positiveOffsetCorrection", this.positiveOffsetCorrection);
+		parameters.put("negativeOperationOffsetCorrection", this.negativeOperationOffsetCorrection);
+		parameters.put("positiveOperationOffsetCorrection", this.positiveOperationOffsetCorrection);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (isInterface) {
+			stringBuffer.append(TEXT_2);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				callParameters.put("isInterface", isInterface);
+				callParameters.put("isImplementation", isImplementation);
+				callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+				callParameters.put("isGWT", isGWT);
+				callParameters.put("forceDefaultCase", forceDefaultCase);
+				callParameters.put("indentDefaultCase", indentDefaultCase);
+				callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+				callParameters.put("singleWildcard", singleWildcard);
+				callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+				callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+				callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+				callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_00BroGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//Class/unsetGenFeature.javadoc.override.javajetinc
+		} else {
+			stringBuffer.append(TEXT_3);
+			if (genFeature.hasAPITags()) {
+				stringBuffer.append(TEXT_4);
+				stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+			}
+			stringBuffer.append(TEXT_5);
+			if (isJDK50) { //Class/unsetGenFeature.annotations.insert.javajetinc
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_00VNoGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+			}
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_6);
+		}
+		if (!isImplementation) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAccessorName());
+			stringBuffer.append(TEXT_8);
+		} else {
+			if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()
+					&& !genClass.hasCollidingUnsetAccessorOperation(genFeature)
+					&& !genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genFeature.getAccessorName());
+			if (genClass.hasCollidingUnsetAccessorOperation(genFeature)) {
+				stringBuffer.append(TEXT_11);
+			}
+			stringBuffer.append(TEXT_12);
+			if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+				if (genClass.hasStaticFeatures()) {
+					stringBuffer.append(TEXT_14);
+				}
+				stringBuffer.append(TEXT_15);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genModel.isReflectiveDelegation()) {
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+				stringBuffer.append(TEXT_16);
+			} else if (genFeature.hasSettingDelegate()) {
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(genFeature.getUpperName());
+				stringBuffer.append(TEXT_19);
+			} else if (!genFeature.isVolatile()) {
+				if (genFeature.isListType()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_23);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_24);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList"));
+					stringBuffer.append(TEXT_25);
+					stringBuffer.append(singleWildcard);
+					stringBuffer.append(TEXT_26);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_27);
+				} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_20);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_21);
+						stringBuffer.append(genFeature.getImportedType(genClass));
+						stringBuffer.append(TEXT_22);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					}
+					stringBuffer.append(TEXT_23);
+					stringBuffer.append(genFeature.getSafeName());
+					stringBuffer.append(TEXT_28);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain"));
+					stringBuffer.append(TEXT_29);
+					if (!genFeature.isBidirectional()) {
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_31);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(negativeOffsetCorrection);
+						stringBuffer.append(TEXT_32);
+					} else {
+						GenFeature reverseFeature = genFeature.getReverse();
+						GenClass targetClass = reverseFeature.getGenClass();
+						String reverseOffsetCorrection = targetClass.hasOffsetCorrection()
+								? " + " + genClass.getOffsetCorrectionField(genFeature)
+								: "";
+						stringBuffer.append(TEXT_30);
+						stringBuffer.append(genFeature.getAsInternalEObject(genFeature.getSafeName(), true));
+						stringBuffer.append(TEXT_33);
+						stringBuffer.append(targetClass.getQualifiedFeatureID(reverseFeature));
+						stringBuffer.append(reverseOffsetCorrection);
+						stringBuffer.append(TEXT_15);
+						stringBuffer.append(targetClass.getRawImportedInterfaceName());
+						stringBuffer.append(TEXT_34);
+					}
+					stringBuffer.append(TEXT_35);
+					stringBuffer.append(genFeature.getAccessorName());
+					stringBuffer.append(TEXT_36);
+					if (genModel.isVirtualDelegation()) {
+						stringBuffer.append(TEXT_37);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_38);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					} else if (genClass.isESetFlag(genFeature)) {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_37);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_41);
+						}
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genClass.getESetFlagsField(genFeature));
+						stringBuffer.append(TEXT_43);
+						stringBuffer.append(genFeature.getUpperName());
+						stringBuffer.append(TEXT_44);
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_37);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_45);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_46);
+						}
+						stringBuffer.append(TEXT_42);
+						stringBuffer.append(genFeature.getUncapName());
+						stringBuffer.append(TEXT_47);
+					}
+					if (!genModel.isSuppressNotification()) {
+						stringBuffer.append(TEXT_48);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+						stringBuffer.append(TEXT_49);
+						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+						stringBuffer.append(TEXT_50);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_51);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_52);
+					}
+					stringBuffer.append(TEXT_53);
+				} else {
+					if (genClass.isFlag(genFeature)) {
+						if (!genModel.isSuppressNotification()) {
+							if (genFeature.isBooleanType()) {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_54);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_21);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_40);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_55);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getImportedType(genClass));
+								stringBuffer.append(TEXT_54);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_56);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_57);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_40);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_58);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_59);
+							}
+						}
+					} else if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+						stringBuffer.append(TEXT_60);
+						stringBuffer.append(genFeature.getCapName());
+						stringBuffer.append(TEXT_61);
+						stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+						stringBuffer.append(positiveOffsetCorrection);
+						stringBuffer.append(TEXT_16);
+					} else {
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_18);
+							stringBuffer.append(genFeature.getImportedType(genClass));
+							stringBuffer.append(TEXT_54);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_56);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_62);
+						}
+					}
+					if (!genModel.isSuppressNotification()) {
+						if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_63);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_64);
+						} else if (genClass.isESetFlag(genFeature)) {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_39);
+							stringBuffer.append(genClass.getESetFlagsField(genFeature));
+							stringBuffer.append(TEXT_40);
+							stringBuffer.append(genFeature.getUpperName());
+							stringBuffer.append(TEXT_41);
+						} else {
+							stringBuffer.append(TEXT_65);
+							stringBuffer.append(genFeature.getCapName());
+							stringBuffer.append(TEXT_45);
+							stringBuffer.append(genFeature.getUncapName());
+							stringBuffer.append(TEXT_46);
+						}
+					}
+					if (genFeature.isReferenceType()) {
+						stringBuffer.append(TEXT_18);
+						stringBuffer.append(genFeature.getSafeName());
+						stringBuffer.append(TEXT_66);
+						if (!genModel.isVirtualDelegation()) {
+							if (genClass.isESetFlag(genFeature)) {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_44);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_47);
+							}
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_67);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_49);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_50);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_15);
+							if (genModel.isVirtualDelegation()) {
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_69);
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_71);
+							if (genModel.isVirtualDelegation()) {
+								stringBuffer.append(TEXT_72);
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_74);
+						}
+					} else {
+						if (genClass.isFlag(genFeature)) {
+							if (genFeature.isBooleanType()) {
+								stringBuffer.append(TEXT_23);
+								stringBuffer.append(genFeature.getEDefault());
+								stringBuffer.append(TEXT_75);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_76);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_77);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_78);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_56);
+								stringBuffer.append(genClass.getFlagsField(genFeature));
+								stringBuffer.append(TEXT_79);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_80);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_81);
+							}
+						} else if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {
+							stringBuffer.append(TEXT_18);
+							stringBuffer.append(genFeature.getSafeName());
+							stringBuffer.append(TEXT_56);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_62);
+						}
+						if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {
+							if (genClass.isESetFlag(genFeature)) {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genClass.getESetFlagsField(genFeature));
+								stringBuffer.append(TEXT_43);
+								stringBuffer.append(genFeature.getUpperName());
+								stringBuffer.append(TEXT_44);
+							} else {
+								stringBuffer.append(TEXT_18);
+								stringBuffer.append(genFeature.getUncapName());
+								stringBuffer.append(TEXT_47);
+							}
+						}
+						if (!genModel.isSuppressNotification()) {
+							stringBuffer.append(TEXT_67);
+							stringBuffer
+									.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl"));
+							stringBuffer.append(TEXT_49);
+							stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.Notification"));
+							stringBuffer.append(TEXT_50);
+							stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
+							stringBuffer.append(positiveOffsetCorrection);
+							stringBuffer.append(TEXT_15);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_68);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_82);
+								stringBuffer.append(genFeature.getEDefault());
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+							}
+							stringBuffer.append(TEXT_15);
+							stringBuffer.append(genFeature.getEDefault());
+							stringBuffer.append(TEXT_15);
+							if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {
+								stringBuffer.append(TEXT_72);
+							} else {
+								stringBuffer.append(TEXT_70);
+								stringBuffer.append(genFeature.getCapName());
+								stringBuffer.append(TEXT_73);
+							}
+							stringBuffer.append(TEXT_74);
+						}
+					}
+				}
+			} else if (genFeature.hasDelegateFeature()) {
+				GenFeature delegateFeature = genFeature.getDelegateFeature();
+				if (delegateFeature.isWrappedFeatureMapType()) {
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_84);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_85);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_86);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				} else {
+					stringBuffer.append(TEXT_83);
+					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
+					stringBuffer.append(TEXT_87);
+					stringBuffer.append(delegateFeature.getAccessorName());
+					stringBuffer.append(TEXT_88);
+					stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_16);
+				}
+			} else if (genClass.getUnsetAccessorOperation(genFeature) != null) {
+				stringBuffer.append(TEXT_18);
+				stringBuffer.append(
+						genClass.getUnsetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer)));
+			} else {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					callParameters.put("isInterface", isInterface);
+					callParameters.put("isImplementation", isImplementation);
+					callParameters.put("useInterfaceOverrideAnnotation", useInterfaceOverrideAnnotation);
+					callParameters.put("isGWT", isGWT);
+					callParameters.put("forceDefaultCase", forceDefaultCase);
+					callParameters.put("indentDefaultCase", indentDefaultCase);
+					callParameters.put("publicStaticFinalFlag", publicStaticFinalFlag);
+					callParameters.put("singleWildcard", singleWildcard);
+					callParameters.put("negativeOffsetCorrection", negativeOffsetCorrection);
+					callParameters.put("positiveOffsetCorrection", positiveOffsetCorrection);
+					callParameters.put("negativeOperationOffsetCorrection", negativeOperationOffsetCorrection);
+					callParameters.put("positiveOperationOffsetCorrection", positiveOperationOffsetCorrection);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_00eXkGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//Class/unsetGenFeature.todo.override.javajetinc
+			}
+			stringBuffer.append(TEXT_89);
+		}
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/ResourceFactoryClass/ResourceFactoryClasscreateResourceoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/ResourceFactoryClass/ResourceFactoryClasscreateResourceoverride.java
new file mode 100644
index 0000000..ae9553f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/ResourceFactoryClass/ResourceFactoryClasscreateResourceoverride.java
@@ -0,0 +1,208 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.ResourceFactoryClass;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ResourceFactoryClasscreateResourceoverride {
+	protected static String nl;
+
+	public static synchronized ResourceFactoryClasscreateResourceoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		ResourceFactoryClasscreateResourceoverride result = new ResourceFactoryClasscreateResourceoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "\t\t";
+	protected final String TEXT_3 = " result = new ";
+	protected final String TEXT_4 = "(uri);" + NL + "\t\tresult.getDefaultSaveOptions().put(";
+	protected final String TEXT_5 = ".OPTION_EXTENDED_META_DATA, ";
+	protected final String TEXT_6 = "Boolean.TRUE";
+	protected final String TEXT_7 = "extendedMetaData";
+	protected final String TEXT_8 = ");" + NL + "\t\tresult.getDefaultLoadOptions().put(";
+	protected final String TEXT_9 = ");" + NL + "" + NL + "\t\tresult.getDefaultSaveOptions().put(";
+	protected final String TEXT_10 = ".OPTION_SCHEMA_LOCATION, Boolean.TRUE);" + NL + "" + NL
+			+ "\t\tresult.getDefaultLoadOptions().put(";
+	protected final String TEXT_11 = ".OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);" + NL
+			+ "\t\tresult.getDefaultSaveOptions().put(";
+	protected final String TEXT_12 = ".OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);" + NL + "" + NL
+			+ "\t\tresult.getDefaultLoadOptions().put(";
+	protected final String TEXT_13 = ".OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);";
+	protected final String TEXT_14 = NL + "\t\tresult.getDefaultLoadOptions().put(";
+	protected final String TEXT_15 = ".OPTION_USE_DATA_CONVERTER, Boolean.TRUE);";
+	protected final String TEXT_16 = ".OPTION_XML_MAP, xmlMap);" + NL + "\t\tresult.getDefaultLoadOptions().put(";
+	protected final String TEXT_17 = ".OPTION_XML_MAP, xmlMap);";
+	protected final String TEXT_18 = NL + "\t\tResource result = new ";
+	protected final String TEXT_19 = "(uri);";
+	protected final String TEXT_20 = NL + "\t\treturn result;" + NL;
+	protected final String TEXT_21 = NL;
+
+	public ResourceFactoryClasscreateResourceoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genPackageParameter : genPackageList) {
+			for (Object genModelParameter : genModelList) {
+				for (Object isJDK50Parameter : isJDK50List) {
+
+					this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+					this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+					this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+					if (preCondition(ctx)) {
+						ctx.setNode(new Node.Container(currentNode, getClass()));
+						orchestration(ctx);
+					}
+
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(TEXT_21);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genPackage.hasExtendedMetaData()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genPackage.getResourceClassName());
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_5);
+			if (genPackage.hasTargetNamespace()) {
+				stringBuffer.append(TEXT_6);
+			} else {
+				stringBuffer.append(TEXT_7);
+			}
+			stringBuffer.append(TEXT_8);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_5);
+			if (genPackage.hasTargetNamespace()) {
+				stringBuffer.append(TEXT_6);
+			} else {
+				stringBuffer.append(TEXT_7);
+			}
+			stringBuffer.append(TEXT_9);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_10);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_11);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_13);
+			if (genPackage.isDataTypeConverters() && genPackage.hasDocumentRoot()) {
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genPackage.getResourceClassName());
+				stringBuffer.append(TEXT_15);
+			}
+		} else if (genPackage.hasXMLMap()) {
+			stringBuffer.append(TEXT_2);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_3);
+			stringBuffer.append(genPackage.getResourceClassName());
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_16);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource"));
+			stringBuffer.append(TEXT_17);
+		} else {
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(genPackage.getResourceClassName());
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_20);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/ValidatorClass/ValidatorClassinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/ValidatorClass/ValidatorClassinsert.java
new file mode 100644
index 0000000..c4cb50c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/model/call/ValidatorClass/ValidatorClassinsert.java
@@ -0,0 +1,186 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.model.call.ValidatorClass;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ValidatorClassinsert {
+	protected static String nl;
+
+	public static synchronized ValidatorClassinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		ValidatorClassinsert result = new ValidatorClassinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public ValidatorClassinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> singleWildcardList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> _MapList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> objectArgumentList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> countList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genPackageParameter : genPackageList) {
+			for (Object genModelParameter : genModelList) {
+				for (Object isJDK50Parameter : isJDK50List) {
+					for (Object singleWildcardParameter : singleWildcardList) {
+						for (Object _MapParameter : _MapList) {
+							for (Object objectArgumentParameter : objectArgumentList) {
+								for (Object countParameter : countList) {
+
+									this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+									this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+									this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+									this.singleWildcard = (java.lang.String) singleWildcardParameter;
+									this._Map = (java.lang.String) _MapParameter;
+									this.objectArgument = (java.lang.String) objectArgumentParameter;
+									this.count = (java.lang.Integer) countParameter;
+
+									if (preCondition(ctx)) {
+										ctx.setNode(new Node.Container(currentNode, getClass()));
+										orchestration(ctx);
+									}
+
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			parameterValues.put("singleWildcard", this.singleWildcard);
+			parameterValues.put("_Map", this._Map);
+			parameterValues.put("objectArgument", this.objectArgument);
+			parameterValues.put("count", this.count);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	protected java.lang.String singleWildcard = null;
+
+	public void set_singleWildcard(java.lang.String object) {
+		this.singleWildcard = object;
+	}
+
+	protected java.lang.String _Map = null;
+
+	public void set__Map(java.lang.String object) {
+		this._Map = object;
+	}
+
+	protected java.lang.String objectArgument = null;
+
+	public void set_objectArgument(java.lang.String object) {
+		this.objectArgument = object;
+	}
+
+	protected java.lang.Integer count = null;
+
+	public void set_count(java.lang.Integer object) {
+		this.count = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		parameters.put("singleWildcard", this.singleWildcard);
+		parameters.put("_Map", this._Map);
+		parameters.put("objectArgument", this.objectArgument);
+		parameters.put("count", this.count);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/BuildProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/BuildProperties.java
new file mode 100644
index 0000000..3f925e9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/BuildProperties.java
@@ -0,0 +1,229 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class BuildProperties extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "bin.includes = ";
+	protected final String TEXT_3 = ",\\";
+	protected final String TEXT_4 = NL + "               META-INF/,\\";
+	protected final String TEXT_5 = NL + "               plugin.xml,\\";
+	protected final String TEXT_6 = NL + "               ";
+	protected final String TEXT_7 = ".properties";
+	protected final String TEXT_8 = NL + "jars.compile.order = ";
+	protected final String TEXT_9 = NL + "source.";
+	protected final String TEXT_10 = " = ";
+	protected final String TEXT_11 = NL + "output.";
+	protected final String TEXT_12 = " = bin/" + NL;
+	protected final String TEXT_13 = NL;
+
+	public BuildProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(TEXT_13);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getTestsProjectDirectory() + "/build.properties";
+		overwrite = false;
+		encoding = "ISO-8859-1";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005-2008 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getTestsPluginID() + ".jar" : ".";
+		List<String> sourceFolders = genModel.getTestsSourceFolders();
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_3);
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_4);
+		} else {
+			stringBuffer.append(TEXT_5);
+		}
+		String testsBundleLocalization = genModel.getTestsBundleLocalization();
+		int index = testsBundleLocalization.indexOf("/");
+		if (index == -1) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(testsBundleLocalization);
+			stringBuffer.append(TEXT_7);
+		} else {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(testsBundleLocalization.substring(0, index + 1));
+		}
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(pluginClassesLocation);
+		boolean first = true;
+		for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) {
+			String sourceFolder = i.next();
+			if (i.hasNext()) {
+				sourceFolder += ",\\";
+			}
+			if (first) {
+				stringBuffer.append(TEXT_9);
+				stringBuffer.append(pluginClassesLocation);
+				stringBuffer.append(TEXT_10);
+				stringBuffer.append(sourceFolder);
+				first = false;
+			} else {
+				stringBuffer.append(sourceFolder);
+			}
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(pluginClassesLocation);
+		stringBuffer.append(TEXT_12);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (!genModel.sameModelTestsProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/ManifestMF.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/ManifestMF.java
new file mode 100644
index 0000000..90cf50d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/ManifestMF.java
@@ -0,0 +1,247 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ManifestMF extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized ManifestMF create(String lineSeparator) {
+		nl = lineSeparator;
+		ManifestMF result = new ManifestMF();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "Manifest-Version: 1.0" + NL + "Bundle-ManifestVersion: 2" + NL + "Bundle-Name: ";
+	protected final String TEXT_2 = NL + "Bundle-SymbolicName: ";
+	protected final String TEXT_3 = ";singleton:=true" + NL + "Automatic-Module-Name: ";
+	protected final String TEXT_4 = NL + "Bundle-Version: 1.0.0.qualifier" + NL + "Bundle-ClassPath: ";
+	protected final String TEXT_5 = ".jar";
+	protected final String TEXT_6 = ".";
+	protected final String TEXT_7 = NL + "Bundle-Vendor: ";
+	protected final String TEXT_8 = NL + "Bundle-Localization: ";
+	protected final String TEXT_9 = NL + "Bundle-RequiredExecutionEnvironment: J2SE-1.5";
+	protected final String TEXT_10 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.6";
+	protected final String TEXT_11 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.7";
+	protected final String TEXT_12 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-1.8";
+	protected final String TEXT_13 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-9";
+	protected final String TEXT_14 = NL + "Bundle-RequiredExecutionEnvironment: JavaSE-10";
+	protected final String TEXT_15 = NL + "Export-Package: ";
+	protected final String TEXT_16 = ",";
+	protected final String TEXT_17 = NL + " ";
+	protected final String TEXT_18 = NL + "Require-Bundle: ";
+	protected final String TEXT_19 = ";visibility:=reexport";
+	protected final String TEXT_20 = NL + "Eclipse-LazyStart: true";
+	protected final String TEXT_21 = NL + "Bundle-ActivationPolicy: lazy" + NL;
+	protected final String TEXT_22 = NL;
+
+	public ManifestMF() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_22);
+		stringBuffer.append(TEXT_22);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getTestsProjectDirectory() + "/META-INF/MANIFEST.MF";
+		overwrite = genModel.isUpdateClasspath();
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genModel.getTestsBundleNameKey());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getTestsPluginID());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getTestsPluginID());
+		stringBuffer.append(TEXT_4);
+		if (genModel.isRuntimeJar()) {
+			stringBuffer.append(genModel.getTestsPluginID());
+			stringBuffer.append(TEXT_5);
+		} else {
+			stringBuffer.append(TEXT_6);
+		}
+		stringBuffer.append(TEXT_7);
+		stringBuffer.append(genModel.getTestsBundleVendorKey());
+		stringBuffer.append(TEXT_8);
+		stringBuffer.append(genModel.getTestsBundleLocalization());
+		if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {
+			stringBuffer.append(TEXT_9);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {
+			stringBuffer.append(TEXT_10);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {
+			stringBuffer.append(TEXT_11);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {
+			stringBuffer.append(TEXT_12);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {
+			stringBuffer.append(TEXT_13);
+		} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {
+			stringBuffer.append(TEXT_14);
+		}
+		Iterator<String> packagesIterator = genModel.getTestsQualifiedPackageNames().iterator();
+		if (packagesIterator.hasNext()) {
+			String pack = packagesIterator.next();
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(pack);
+			while (packagesIterator.hasNext()) {
+				pack = packagesIterator.next();
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(pack);
+			}
+		}
+		Iterator<String> requiredPluginIterator = genModel.getTestsRequiredPlugins().iterator();
+		if (requiredPluginIterator.hasNext()) {
+			String pluginID = requiredPluginIterator.next();
+			stringBuffer.append(TEXT_18);
+			stringBuffer.append(pluginID);
+			if (!pluginID.startsWith("org.eclipse.core.runtime")) {
+				stringBuffer.append(TEXT_19);
+			}
+			while (requiredPluginIterator.hasNext()) {
+				pluginID = requiredPluginIterator.next();
+				stringBuffer.append(TEXT_16);
+				stringBuffer.append(TEXT_17);
+				stringBuffer.append(pluginID);
+				if (!pluginID.startsWith("org.eclipse.core.runtime") && !pluginID.equals("org.eclipse.xtext.xbase.lib")
+						&& !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {
+					stringBuffer.append(TEXT_19);
+				}
+			}
+		}
+		if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22
+				|| genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {
+			stringBuffer.append(TEXT_20);
+		}
+		stringBuffer.append(TEXT_21);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (genModel.isBundleManifest()) && (!genModel.sameModelTestsProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/ModelTestSuite.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/ModelTestSuite.java
new file mode 100644
index 0000000..e063b4d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/ModelTestSuite.java
@@ -0,0 +1,282 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class ModelTestSuite extends org.eclipse.egf.emf.pattern.base.GenModelJava {
+	protected static String nl;
+
+	public static synchronized ModelTestSuite create(String lineSeparator) {
+		nl = lineSeparator;
+		ModelTestSuite result = new ModelTestSuite();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A test suite for the '<em><b>";
+	protected final String TEXT_5 = "</b></em>' model." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_10 = NL + "public class ";
+	protected final String TEXT_11 = " extends ";
+	protected final String TEXT_12 = NL + "{";
+	protected final String TEXT_13 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_14 = " copyright = ";
+	protected final String TEXT_15 = ";";
+	protected final String TEXT_16 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static void main(String[] args)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_17 = ".run(suite());" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static ";
+	protected final String TEXT_18 = " suite()" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_19 = " suite = new ";
+	protected final String TEXT_20 = "(\"";
+	protected final String TEXT_21 = " Tests\");";
+	protected final String TEXT_22 = NL + "\t\tsuite.addTest(";
+	protected final String TEXT_23 = ".suite());";
+	protected final String TEXT_24 = NL + "\t\treturn suite;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_25 = "(String name)" + NL + "\t{" + NL + "\t\tsuper(name);" + NL + "\t}" + NL + "" + NL
+			+ "} //";
+	protected final String TEXT_26 = NL;
+	protected final String TEXT_27 = NL;
+
+	public ModelTestSuite() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPath = genModel.getTestsDirectory();
+		packageName = genModel.getTestSuitePackageName();
+		className = genModel.getTestSuiteClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getTestSuitePackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_5);
+		if (genModel.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genModel.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genModel.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		} else if (isJDK50) {
+			boolean needsSuppressDeprecation = false;
+			LOOP: for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+				if (genPackage.hasTests()) {
+					for (GenClass genClass : genPackage.getGenClasses()) {
+						if (!genClass.isExternalInterface() && !genClass.isAbstract() && genClass.hasTests()
+								&& genClass.hasImplicitAPIDeprecatedTag()) {
+							needsSuppressDeprecation = true;
+							break LOOP;
+						}
+					}
+				}
+			}
+			if (needsSuppressDeprecation) {
+				stringBuffer.append(TEXT_9);
+			}
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.getTestSuiteClassName());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genModel.getImportedName("junit.framework.TestSuite"));
+		stringBuffer.append(TEXT_12);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genModel.getImportedName("junit.textui.TestRunner"));
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(genModel.getImportedName("junit.framework.Test"));
+		stringBuffer.append(TEXT_18);
+		stringBuffer.append(genModel.getImportedName("junit.framework.TestSuite"));
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genModel.getTestSuiteClassName());
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(genModel.getModelName());
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(genModel.getNonNLS());
+		for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
+			if (genPackage.hasTests()) {
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genModel.getImportedName(genPackage.getImportedTestSuiteClassName()));
+				stringBuffer.append(TEXT_23);
+			}
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(genModel.getTestSuiteClassName());
+		stringBuffer.append(TEXT_25);
+		stringBuffer.append(genModel.getTestSuiteClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (genModel.hasTestSuiteClass());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PackageExample.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PackageExample.java
new file mode 100644
index 0000000..b96350f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PackageExample.java
@@ -0,0 +1,514 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PackageExample extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized PackageExample create(String lineSeparator) {
+		nl = lineSeparator;
+		PackageExample result = new PackageExample();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A sample utility for the '<em><b>";
+	protected final String TEXT_5 = "</b></em>' package." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_10 = NL + "public class ";
+	protected final String TEXT_11 = NL + "{";
+	protected final String TEXT_12 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_13 = " copyright = ";
+	protected final String TEXT_14 = ";";
+	protected final String TEXT_15 = NL + "\t";
+	protected final String TEXT_16 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * Load all the argument file paths or URIs as instances of the model." + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @param args the file paths or URIs." + NL + "\t * @generated"
+			+ NL + "\t */" + NL + "\tpublic static void main(String[] args)" + NL + "\t{" + NL
+			+ "\t\t// Create a resource set to hold the resources." + NL + "\t\t//" + NL + "\t\t";
+	protected final String TEXT_17 = " resourceSet = new ";
+	protected final String TEXT_18 = "();" + NL + "\t\t";
+	protected final String TEXT_19 = NL + "\t\t// Register the appropriate resource factory to handle the content type."
+			+ NL + "\t\t//" + NL + "\t\tresourceSet.getResourceFactoryRegistry().getContentTypeToFactoryMap().put" + NL
+			+ "\t\t\t(";
+	protected final String TEXT_20 = ".eCONTENT_TYPE," + NL + "\t\t\t new ";
+	protected final String TEXT_21 = "());" + NL + "\t\t" + NL
+			+ "\t\t// Register the appropriate content handler for all file extensions and any element from the package's namespace."
+			+ NL + "\t\t//" + NL + "\t\tresourceSet.getURIConverter().getContentHandlers().add" + NL + "\t\t\t(new ";
+	protected final String TEXT_22 = "(";
+	protected final String TEXT_23 = ".eCONTENT_TYPE, null, null, ";
+	protected final String TEXT_24 = ".eNS_URI";
+	protected final String TEXT_25 = ")null";
+	protected final String TEXT_26 = ", null));";
+	protected final String TEXT_27 = NL
+			+ "\t\t// Register the appropriate resource factory to handle all file extensions." + NL + "\t\t//" + NL
+			+ "\t\tresourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put" + NL
+			+ "\t\t\t(Resource.Factory.Registry.DEFAULT_EXTENSION, " + NL + "\t\t\t new ";
+	protected final String TEXT_28 = "());";
+	protected final String TEXT_29 = NL + NL + "\t\t// Register the package to ensure it is available during loading."
+			+ NL + "\t\t//" + NL + "\t\tresourceSet.getPackageRegistry().put" + NL + "\t\t\t(";
+	protected final String TEXT_30 = ".eNS_URI, " + NL + "\t\t\t ";
+	protected final String TEXT_31 = ".eINSTANCE);" + NL + "        " + NL
+			+ "\t\t// If there are no arguments, emit an appropriate usage message." + NL + "\t\t//" + NL
+			+ "\t\tif (args.length == 0)" + NL + "\t\t{";
+	protected final String TEXT_32 = NL
+			+ "\t\t\tSystem.out.println(\"Enter a list of file paths or URIs that have content like this:\");";
+	protected final String TEXT_33 = NL + "\t\t\ttry" + NL + "\t\t\t{";
+	protected final String TEXT_34 = NL + "\t\t\t\t";
+	protected final String TEXT_35 = " resource = resourceSet.createResource(";
+	protected final String TEXT_36 = ".createURI(\"http:///My.";
+	protected final String TEXT_37 = "\"), ";
+	protected final String TEXT_38 = ".eCONTENT_TYPE);";
+	protected final String TEXT_39 = "\"));";
+	protected final String TEXT_40 = " documentRoot = ";
+	protected final String TEXT_41 = ".create";
+	protected final String TEXT_42 = "();" + NL + "\t\t\t\t";
+	protected final String TEXT_43 = " root = ";
+	protected final String TEXT_44 = "();";
+	protected final String TEXT_45 = NL + "\t\t\t\tdocumentRoot.eSet(";
+	protected final String TEXT_46 = ", root);";
+	protected final String TEXT_47 = NL + "\t\t\t\tdocumentRoot.set";
+	protected final String TEXT_48 = "(root);";
+	protected final String TEXT_49 = NL + "\t\t\t\tresource.getContents().add(";
+	protected final String TEXT_50 = ")";
+	protected final String TEXT_51 = "documentRoot);";
+	protected final String TEXT_52 = "();" + NL + "\t\t\t\tresource.getContents().add(";
+	protected final String TEXT_53 = "root);";
+	protected final String TEXT_54 = NL + "\t\t\t\tresource.save(";
+	protected final String TEXT_55 = ".out, null);" + NL + "\t\t\t}" + NL + "\t\t\tcatch (";
+	protected final String TEXT_56 = " exception) " + NL + "\t\t\t{" + NL + "\t\t\t\texception.printStackTrace();" + NL
+			+ "\t\t\t}";
+	protected final String TEXT_57 = NL + "\t\t\tSystem.out.println(\"Enter a list of file paths or URIs\");";
+	protected final String TEXT_58 = NL + "\t\t}" + NL + "\t\telse" + NL + "\t\t{" + NL
+			+ "\t\t\t// Iterate over all the arguments." + NL + "\t\t\t//" + NL
+			+ "\t\t\tfor (int i = 0; i < args.length; ++i)" + NL + "\t\t\t{" + NL
+			+ "\t\t\t\t// Construct the URI for the instance file." + NL
+			+ "\t\t\t\t// The argument is treated as a file path only if it denotes an existing file." + NL
+			+ "\t\t\t\t// Otherwise, it's directly treated as a URL." + NL + "\t\t\t\t//" + NL + "\t\t\t\t";
+	protected final String TEXT_59 = " file = new ";
+	protected final String TEXT_60 = "(args[i]);" + NL + "\t\t\t\t";
+	protected final String TEXT_61 = " uri = file.isFile() ? ";
+	protected final String TEXT_62 = ".createFileURI(file.getAbsolutePath()): URI.createURI(args[i]);" + NL + "" + NL
+			+ "\t\t\t\ttry" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t// Demand load resource for this file." + NL
+			+ "\t\t\t\t\t//" + NL + "\t\t\t\t\t";
+	protected final String TEXT_63 = " resource = resourceSet.getResource(uri, true);" + NL
+			+ "\t\t\t\t\tSystem.out.println(\"Loaded \" + uri);";
+	protected final String TEXT_64 = NL + NL + "\t\t\t\t\t// Validate the contents of the loaded resource." + NL
+			+ "\t\t\t\t\t//";
+	protected final String TEXT_65 = NL + "\t\t\t\t\tfor (";
+	protected final String TEXT_66 = " eObject : resource.getContents())";
+	protected final String TEXT_67 = " j = resource.getContents().iterator(); j.hasNext(); )";
+	protected final String TEXT_68 = NL + "\t\t\t\t\t{";
+	protected final String TEXT_69 = NL + "\t\t\t\t\t\t";
+	protected final String TEXT_70 = " eObject = (";
+	protected final String TEXT_71 = ")j.next();";
+	protected final String TEXT_72 = " diagnostic = ";
+	protected final String TEXT_73 = ".INSTANCE.validate(eObject);" + NL
+			+ "\t\t\t\t\t\tif (diagnostic.getSeverity() != Diagnostic.OK)" + NL + "\t\t\t\t\t\t{" + NL
+			+ "\t\t\t\t\t\t\tprintDiagnostic(diagnostic, \"\");";
+	protected final String TEXT_74 = NL + "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL
+			+ "\t\t\t\tcatch (";
+	protected final String TEXT_75 = " exception) " + NL + "\t\t\t\t{" + NL
+			+ "\t\t\t\t\tSystem.out.println(\"Problem loading \" + uri);";
+	protected final String TEXT_76 = NL + "\t\t\t\t\texception.printStackTrace();" + NL + "\t\t\t\t}" + NL + "\t\t\t}"
+			+ NL + "\t\t}" + NL + "\t}" + NL + "\t" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * Prints diagnostics with indentation." + NL + "\t * <!-- end-user-doc -->" + NL
+			+ "\t * @param diagnostic the diagnostic to print." + NL
+			+ "\t * @param indent the indentation for printing." + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected static void printDiagnostic(Diagnostic diagnostic, String indent)" + NL + "\t{" + NL
+			+ "\t\tSystem.out.print(indent);" + NL + "\t\tSystem.out.println(diagnostic.getMessage());";
+	protected final String TEXT_77 = NL + "\t\tfor (Diagnostic child : diagnostic.getChildren())" + NL + "\t\t{" + NL
+			+ "\t\t\tprintDiagnostic(child, indent + \"  \");";
+	protected final String TEXT_78 = NL + "\t\t}";
+	protected final String TEXT_79 = NL + "\t\tfor (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); )"
+			+ NL + "\t\t{" + NL + "\t\t\tprintDiagnostic((Diagnostic)i.next(), indent + \"  \");";
+	protected final String TEXT_80 = NL + "\t}" + NL + "" + NL + "} //";
+	protected final String TEXT_81 = NL;
+	protected final String TEXT_82 = NL;
+
+	public PackageExample() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_82);
+		stringBuffer.append(TEXT_82);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getTestsDirectory();
+		packageName = genPackage.getTestsPackageName();
+		className = genPackage.getExampleClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005-2007 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+
+		String _System = genModel.getImportedName("java.lang.System");
+		String _String = genModel.getImportedName("java.lang.String");
+		String _RuntimeException = genModel.getImportedName("java.lang.RuntimeException");
+		String _File = genModel.getImportedName("java.io.File");
+		String _Iterator = null;
+		if (!genModel.useGenerics()) {
+			_Iterator = genModel.getImportedName("java.util.Iterator");
+		}
+		String _Diagnostic = genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic");
+		String _URI = genModel.getImportedName("org.eclipse.emf.common.util.URI");
+		String _EObject = genModel.getImportedName("org.eclipse.emf.ecore.EObject");
+		String _Diagnostician = genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician");
+		String _Resource = genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource");
+		String _ResourceSet = genModel.getImportedName("org.eclipse.emf.ecore.resource.ResourceSet");
+		String _ResourceSetImpl = genModel.getImportedName("org.eclipse.emf.ecore.resource.impl.ResourceSetImpl");
+
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getTestsPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getPackageName());
+		stringBuffer.append(TEXT_5);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		} else if (isJDK50 && genPackage.getRootClass() != null && genPackage.getRootClass().hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genPackage.getExampleClassName());
+		stringBuffer.append(TEXT_11);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_12);
+			stringBuffer.append(_String);
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_15);
+		}
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(_ResourceSet);
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(_ResourceSetImpl);
+		stringBuffer.append(TEXT_18);
+		if (genPackage.isContentType()) {
+			stringBuffer.append(TEXT_19);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_20);
+			stringBuffer.append(genModel.getImportedName(genPackage.getQualifiedEffectiveResourceFactoryClassName()));
+			stringBuffer.append(TEXT_21);
+			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl"));
+			stringBuffer.append(TEXT_22);
+			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+			stringBuffer.append(TEXT_23);
+			if (genPackage.hasTargetNamespace()) {
+				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+				stringBuffer.append(TEXT_24);
+			} else {
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(_String);
+				stringBuffer.append(TEXT_25);
+			}
+			stringBuffer.append(TEXT_26);
+		} else {
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genModel.getImportedName(genPackage.getQualifiedEffectiveResourceFactoryClassName()));
+			stringBuffer.append(TEXT_28);
+		}
+		stringBuffer.append(TEXT_29);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_30);
+		stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+		stringBuffer.append(TEXT_31);
+		if (genPackage.getRootClass() != null) {
+			GenClass rootClass = genPackage.getRootClass();
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_33);
+			if (genPackage.isContentType()) {
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(_Resource);
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(_URI);
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genPackage.getFileExtension());
+				stringBuffer.append(TEXT_37);
+				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
+				stringBuffer.append(TEXT_38);
+				stringBuffer.append(genModel.getNonNLS());
+			} else {
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(_Resource);
+				stringBuffer.append(TEXT_35);
+				stringBuffer.append(_URI);
+				stringBuffer.append(TEXT_36);
+				stringBuffer.append(genPackage.getFileExtension());
+				stringBuffer.append(TEXT_39);
+				stringBuffer.append(genModel.getNonNLS());
+			}
+			if (genPackage.getRootFeature() != null) {
+				GenFeature rootFeature = genPackage.getRootFeature();
+				GenClass documentRoot = rootFeature.getGenClass();
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(documentRoot.getImportedInterfaceName());
+				stringBuffer.append(TEXT_40);
+				stringBuffer.append(genPackage.getQualifiedEFactoryInternalInstanceAccessor());
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(documentRoot.getName());
+				stringBuffer.append(TEXT_42);
+				stringBuffer.append(rootClass.getImportedInterfaceName());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(rootClass.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(rootClass.getName());
+				stringBuffer.append(TEXT_44);
+				if (documentRoot.isDynamic()) {
+					stringBuffer.append(TEXT_45);
+					stringBuffer.append(rootFeature.getQualifiedFeatureAccessor());
+					stringBuffer.append(TEXT_46);
+				} else {
+					stringBuffer.append(TEXT_47);
+					stringBuffer.append(rootFeature.getCapName());
+					stringBuffer.append(TEXT_48);
+				}
+				stringBuffer.append(TEXT_49);
+				if (!documentRoot.isEObjectExtension()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(_EObject);
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_51);
+			} else {
+				stringBuffer.append(TEXT_34);
+				stringBuffer.append(rootClass.getImportedInterfaceName());
+				stringBuffer.append(rootClass.getInterfaceWildTypeArguments());
+				stringBuffer.append(TEXT_43);
+				stringBuffer.append(rootClass.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor());
+				stringBuffer.append(TEXT_41);
+				stringBuffer.append(rootClass.getName());
+				stringBuffer.append(TEXT_52);
+				if (!rootClass.isEObjectExtension()) {
+					stringBuffer.append(TEXT_22);
+					stringBuffer.append(_EObject);
+					stringBuffer.append(TEXT_50);
+				}
+				stringBuffer.append(TEXT_53);
+			}
+			stringBuffer.append(TEXT_54);
+			stringBuffer.append(_System);
+			stringBuffer.append(TEXT_55);
+			stringBuffer.append(genModel.getImportedName("java.io.IOException"));
+			stringBuffer.append(TEXT_56);
+		} else {
+			stringBuffer.append(TEXT_57);
+		}
+		stringBuffer.append(TEXT_58);
+		stringBuffer.append(_File);
+		stringBuffer.append(TEXT_59);
+		stringBuffer.append(_File);
+		stringBuffer.append(TEXT_60);
+		stringBuffer.append(_URI);
+		stringBuffer.append(TEXT_61);
+		stringBuffer.append(_URI);
+		stringBuffer.append(TEXT_62);
+		stringBuffer.append(_Resource);
+		stringBuffer.append(TEXT_63);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_64);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(_EObject);
+			stringBuffer.append(TEXT_66);
+		} else {
+			stringBuffer.append(TEXT_65);
+			stringBuffer.append(_Iterator);
+			stringBuffer.append(TEXT_67);
+		}
+		stringBuffer.append(TEXT_68);
+		if (!genModel.useGenerics()) {
+			stringBuffer.append(TEXT_69);
+			stringBuffer.append(_EObject);
+			stringBuffer.append(TEXT_70);
+			stringBuffer.append(_EObject);
+			stringBuffer.append(TEXT_71);
+		}
+		stringBuffer.append(TEXT_69);
+		stringBuffer.append(_Diagnostic);
+		stringBuffer.append(TEXT_72);
+		stringBuffer.append(_Diagnostician);
+		stringBuffer.append(TEXT_73);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_74);
+		stringBuffer.append(_RuntimeException);
+		stringBuffer.append(TEXT_75);
+		stringBuffer.append(genModel.getNonNLS());
+		stringBuffer.append(TEXT_76);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_77);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_78);
+		} else {
+			stringBuffer.append(TEXT_79);
+			stringBuffer.append(genModel.getNonNLS());
+			stringBuffer.append(TEXT_78);
+		}
+		stringBuffer.append(TEXT_80);
+		stringBuffer.append(genPackage.getExampleClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_81);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.isGenerateExampleClass());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PackageTestSuite.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PackageTestSuite.java
new file mode 100644
index 0000000..37d969c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PackageTestSuite.java
@@ -0,0 +1,279 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PackageTestSuite extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
+	protected static String nl;
+
+	public static synchronized PackageTestSuite create(String lineSeparator) {
+		nl = lineSeparator;
+		PackageTestSuite result = new PackageTestSuite();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A test suite for the '<em><b>";
+	protected final String TEXT_5 = "</b></em>' package." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * ";
+	protected final String TEXT_7 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_8 = NL + "@Deprecated";
+	protected final String TEXT_9 = NL + "@SuppressWarnings(\"deprecation\")";
+	protected final String TEXT_10 = NL + "public class ";
+	protected final String TEXT_11 = " extends ";
+	protected final String TEXT_12 = NL + "{";
+	protected final String TEXT_13 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_14 = " copyright = ";
+	protected final String TEXT_15 = ";";
+	protected final String TEXT_16 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static void main(String[] args)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_17 = ".run(suite());" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic static ";
+	protected final String TEXT_18 = " suite()" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_19 = " suite = new ";
+	protected final String TEXT_20 = "(\"";
+	protected final String TEXT_21 = " Tests\");";
+	protected final String TEXT_22 = NL + "\t\tsuite.addTestSuite(";
+	protected final String TEXT_23 = ".class);";
+	protected final String TEXT_24 = NL + "\t\treturn suite;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
+			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
+			+ NL + "\tpublic ";
+	protected final String TEXT_25 = "(String name)" + NL + "\t{" + NL + "\t\tsuper(name);" + NL + "\t}" + NL + "" + NL
+			+ "} //";
+	protected final String TEXT_26 = NL;
+	protected final String TEXT_27 = NL;
+
+	public PackageTestSuite() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_27);
+		stringBuffer.append(TEXT_27);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenPackage genPackage = parameter;
+		targetPath = genPackage.getGenModel().getTestsDirectory();
+		packageName = genPackage.getTestsPackageName();
+		className = genPackage.getTestSuiteClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenPackage genPackage = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenPackage genPackage = (GenPackage) argument;
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getTestsPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genPackage.getPackageName());
+		stringBuffer.append(TEXT_5);
+		if (genPackage.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_8);
+		} else if (isJDK50) {
+			boolean needsSuppressDeprecation = false;
+			for (GenClass genClass : genPackage.getGenClasses()) {
+				if (!genClass.isExternalInterface() && !genClass.isAbstract() && genClass.hasTests()
+						&& genClass.hasImplicitAPIDeprecatedTag()) {
+					needsSuppressDeprecation = true;
+					break;
+				}
+			}
+			if (needsSuppressDeprecation) {
+				stringBuffer.append(TEXT_9);
+			}
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genPackage.getTestSuiteClassName());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genModel.getImportedName("junit.framework.TestSuite"));
+		stringBuffer.append(TEXT_12);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_13);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_14);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(genModel.getImportedName("junit.textui.TestRunner"));
+		stringBuffer.append(TEXT_17);
+		stringBuffer.append(genModel.getImportedName("junit.framework.Test"));
+		stringBuffer.append(TEXT_18);
+		stringBuffer.append(genModel.getImportedName("junit.framework.TestSuite"));
+		stringBuffer.append(TEXT_19);
+		stringBuffer.append(genPackage.getTestSuiteClassName());
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(genPackage.getPackageName());
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(genModel.getNonNLS());
+		for (GenClass genClass : genPackage.getGenClasses()) {
+			if (!genClass.isExternalInterface() && !genClass.isAbstract() && genClass.hasTests()) {
+				stringBuffer.append(TEXT_22);
+				stringBuffer.append(genClass.getImportedTestCaseClassName());
+				stringBuffer.append(TEXT_23);
+			}
+		}
+		stringBuffer.append(TEXT_24);
+		stringBuffer.append(genPackage.getTestSuiteClassName());
+		stringBuffer.append(TEXT_25);
+		stringBuffer.append(genPackage.getTestSuiteClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_26);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenPackage genPackage = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (genPackage.hasClassifiers());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PluginProperties.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PluginProperties.java
new file mode 100644
index 0000000..37b8b13
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PluginProperties.java
@@ -0,0 +1,184 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginProperties extends org.eclipse.egf.emf.pattern.base.GenModelProperties {
+	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 final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + NL + "pluginName = ";
+	protected final String TEXT_3 = NL + "providerName = ";
+	protected final String TEXT_4 = NL;
+	protected final String TEXT_5 = NL;
+
+	public PluginProperties() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(TEXT_5);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getTestsProjectDirectory() + "/" + genModel.getTestsBundleLocalization()
+				+ ".properties";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_FEoPwCwuEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genModel.getTestsBundleName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genModel.getTestsBundleVendorName());
+		stringBuffer.append(TEXT_4);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (!genModel.sameModelTestsProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PluginXML.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PluginXML.java
new file mode 100644
index 0000000..ebc4854
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/PluginXML.java
@@ -0,0 +1,224 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class PluginXML extends org.eclipse.egf.emf.pattern.base.GenModelText {
+	protected static String nl;
+
+	public static synchronized PluginXML create(String lineSeparator) {
+		nl = lineSeparator;
+		PluginXML result = new PluginXML();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + NL + "<?eclipse version=\"3.0\"?>"
+			+ NL;
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL + "<plugin>";
+	protected final String TEXT_4 = NL + "<plugin" + NL + "      name=\"%pluginName\"" + NL + "      id=\"";
+	protected final String TEXT_5 = "\"" + NL + "      version=\"1.0.0\"" + NL
+			+ "      provider-name=\"%providerName\">" + NL + "" + NL + "   <requires>";
+	protected final String TEXT_6 = NL + "      <import plugin=\"";
+	protected final String TEXT_7 = "\"";
+	protected final String TEXT_8 = " export=\"true\"";
+	protected final String TEXT_9 = "/>";
+	protected final String TEXT_10 = NL + "   </requires>" + NL + "" + NL + "   <runtime>";
+	protected final String TEXT_11 = NL + "      <library name=\"";
+	protected final String TEXT_12 = ".jar\">";
+	protected final String TEXT_13 = NL + "      <library name=\".\">";
+	protected final String TEXT_14 = NL + "         <export name=\"*\"/>" + NL + "      </library>" + NL
+			+ "   </runtime>" + NL;
+	protected final String TEXT_15 = NL + "</plugin>" + NL;
+	protected final String TEXT_16 = NL;
+
+	public PluginXML() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_16);
+		stringBuffer.append(TEXT_16);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenModel genModel = parameter;
+		targetPathName = genModel.getTestsProjectDirectory() + "/plugin.xml";
+		overwrite = true;
+		encoding = "UTF-8";
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenModel genModel = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 * 
+		 * Contributors: 
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenModel genModel = (GenModel) argument;
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#__h1VkCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		if (genModel.isBundleManifest()) {
+			stringBuffer.append(TEXT_3);
+		} else {
+			stringBuffer.append(TEXT_4);
+			stringBuffer.append(genModel.getTestsPluginID());
+			stringBuffer.append(TEXT_5);
+			for (String pluginID : genModel.getTestsRequiredPlugins()) {
+				stringBuffer.append(TEXT_6);
+				stringBuffer.append(pluginID);
+				stringBuffer.append(TEXT_7);
+				if (!pluginID.startsWith("org.eclipse.core.runtime")) {
+					stringBuffer.append(TEXT_8);
+				}
+				stringBuffer.append(TEXT_9);
+			}
+			stringBuffer.append(TEXT_10);
+			if (genModel.isRuntimeJar()) {
+				stringBuffer.append(TEXT_11);
+				stringBuffer.append(genModel.getTestsPluginID());
+				stringBuffer.append(TEXT_12);
+			} else {
+				stringBuffer.append(TEXT_13);
+			}
+			stringBuffer.append(TEXT_14);
+		}
+		stringBuffer.append(TEXT_15);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenModel genModel = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT)
+				&& (!(genModel.isBundleManifest())) && (!genModel.sameModelTestsProject());
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/TestCase.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/TestCase.java
new file mode 100644
index 0000000..78aedc0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/TestCase.java
@@ -0,0 +1,496 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCase extends org.eclipse.egf.emf.pattern.base.GenClassJava {
+	protected static String nl;
+
+	public static synchronized TestCase create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCase result = new TestCase();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL + "package ";
+	protected final String TEXT_3 = ";" + NL;
+	protected final String TEXT_4 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
+			+ " * A test case for the model object '<em><b>";
+	protected final String TEXT_5 = "</b></em>'." + NL + " * <!-- end-user-doc -->";
+	protected final String TEXT_6 = NL + " * <p>" + NL + " * The following features are tested:" + NL + " * <ul>";
+	protected final String TEXT_7 = NL + " *   <li>{@link ";
+	protected final String TEXT_8 = "#";
+	protected final String TEXT_9 = "() <em>";
+	protected final String TEXT_10 = "</em>}</li>";
+	protected final String TEXT_11 = NL + " * </ul>" + NL + " * </p>";
+	protected final String TEXT_12 = NL + " * <p>" + NL + " * The following operations are tested:" + NL + " * <ul>";
+	protected final String TEXT_13 = "(";
+	protected final String TEXT_14 = ") <em>";
+	protected final String TEXT_15 = NL + " * ";
+	protected final String TEXT_16 = NL + " * @generated" + NL + " */";
+	protected final String TEXT_17 = NL + "@Deprecated";
+	protected final String TEXT_18 = NL + "public";
+	protected final String TEXT_19 = " abstract";
+	protected final String TEXT_20 = " class ";
+	protected final String TEXT_21 = " extends ";
+	protected final String TEXT_22 = NL + "{";
+	protected final String TEXT_23 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
+	protected final String TEXT_24 = " copyright = ";
+	protected final String TEXT_25 = ";";
+	protected final String TEXT_26 = " mofDriverNumber = \"";
+	protected final String TEXT_27 = "\";";
+	protected final String TEXT_28 = NL + NL + "\t/**" + NL + "\t * The fixture for this ";
+	protected final String TEXT_29 = " test case." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+	protected final String TEXT_30 = " fixture = null;";
+	protected final String TEXT_31 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tpublic static void main(String[] args)" + NL + "\t{" + NL + "\t\t";
+	protected final String TEXT_32 = ".run(";
+	protected final String TEXT_33 = ".class);" + NL + "\t}";
+	protected final String TEXT_34 = NL + NL + "\t/**" + NL + "\t * Constructs a new ";
+	protected final String TEXT_35 = " test case with the given name." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
+	protected final String TEXT_36 = "(String name)" + NL + "\t{" + NL + "\t\tsuper(name);" + NL + "\t}";
+	protected final String TEXT_37 = NL + NL + "\t/**" + NL + "\t * Sets the fixture for this ";
+	protected final String TEXT_38 = " test case." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
+			+ "\tprotected void setFixture(";
+	protected final String TEXT_39 = " fixture)" + NL + "\t{" + NL + "\t\tthis.fixture = fixture;" + NL + "\t}";
+	protected final String TEXT_40 = NL + NL + "\t/**" + NL + "\t * Returns the fixture for this ";
+	protected final String TEXT_41 = " test case." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_42 = NL + "\t@Override";
+	protected final String TEXT_43 = NL + "\t";
+	protected final String TEXT_44 = "protected";
+	protected final String TEXT_45 = "private";
+	protected final String TEXT_46 = " ";
+	protected final String TEXT_47 = " getFixture()" + NL + "\t{";
+	protected final String TEXT_48 = NL + "\t\treturn fixture;";
+	protected final String TEXT_49 = NL + "\t\treturn (";
+	protected final String TEXT_50 = ")fixture;";
+	protected final String TEXT_51 = NL + "\t}";
+	protected final String TEXT_52 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see junit.framework.TestCase#setUp()" + NL + "\t * @generated"
+			+ NL + "\t */";
+	protected final String TEXT_53 = NL + "\t@SuppressWarnings(\"unchecked\")";
+	protected final String TEXT_54 = NL + "\tprotected void setUp() throws Exception" + NL + "\t{";
+	protected final String TEXT_55 = NL + "\t\tsetFixture((";
+	protected final String TEXT_56 = ")";
+	protected final String TEXT_57 = ".create(";
+	protected final String TEXT_58 = "));";
+	protected final String TEXT_59 = NL + "\t\tsetFixture(";
+	protected final String TEXT_60 = ".create";
+	protected final String TEXT_61 = "());";
+	protected final String TEXT_62 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see junit.framework.TestCase#tearDown()" + NL
+			+ "\t * @generated" + NL + "\t */";
+	protected final String TEXT_63 = NL + "\tprotected void tearDown() throws Exception" + NL + "\t{" + NL
+			+ "\t\tsetFixture(null);" + NL + "\t}";
+	protected final String TEXT_64 = NL;
+	protected final String TEXT_65 = NL + "} //";
+	protected final String TEXT_66 = NL;
+
+	public TestCase() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> parameterList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object parameterParameter : parameterList) {
+
+			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) parameterParameter;
+
+			if (preCondition(ctx)) {
+				ctx.setNode(new Node.Container(currentNode, getClass()));
+				orchestration(ctx);
+			}
+
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_66);
+		stringBuffer.append(TEXT_66);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		super.orchestration(new SuperOrchestrationContext(ictx));
+
+		method_preGenerate(new StringBuffer(), ictx);
+
+		method_doGenerate(new StringBuffer(), ictx);
+		{
+			final Map<String, Object> parameters = getParameters();
+			CallbackContext ctx_callback = new CallbackContext(ictx);
+			CallHelper.callBack(ctx_callback, parameters);
+		}
+
+		method_postGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("parameter", this.parameter);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("parameter", this.parameter);
+		return parameters;
+	}
+
+	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		GenClass genClass = parameter;
+		targetPath = genClass.getGenModel().getTestsDirectory();
+		packageName = genClass.getGenPackage().getTestsPackageName();
+		className = genClass.getTestCaseClassName();
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
+	}
+
+	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		GenClass genClass = parameter;
+		argument = parameter;
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
+	}
+
+	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
+			throws Exception {
+
+		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel,
+				GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		/**
+		 * Copyright (c) 2005, 2007 IBM Corporation and others.
+		 * All rights reserved.   This program and the accompanying materials
+		 * are made available under the terms of the Eclipse Public License v2.0
+		 * which accompanies this distribution, and is available at
+		 * http://www.eclipse.org/legal/epl-v20.html
+		 *
+		 * Contributors:
+		 *   IBM - Initial API and implementation
+		 */
+
+		GenClass genClass = (GenClass) argument;
+		GenPackage genPackage = genClass.getGenPackage();
+		GenModel genModel = genPackage.getGenModel();
+		/* Trick to import java.util.* without warnings */Iterator.class.getName();
+		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
+		stringBuffer.append(TEXT_1);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("argument", parameter);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genPackage.getTestsPackageName());
+		stringBuffer.append(TEXT_3);
+		genModel.markImportLocation(stringBuffer);
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genClass.getFormattedName());
+		stringBuffer.append(TEXT_5);
+		if (!genClass.getImplementedGenFeatures().isEmpty()) {
+			boolean first = true;
+			for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {
+				if (genFeature.isTested() && !genFeature.isSuppressedGetVisibility()) {
+					if (first) {
+						first = false;
+						stringBuffer.append(TEXT_6);
+					}
+					stringBuffer.append(TEXT_7);
+					stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+					stringBuffer.append(TEXT_8);
+					stringBuffer.append(genFeature.getGetAccessor());
+					stringBuffer.append(TEXT_9);
+					stringBuffer.append(genFeature.getFormattedName());
+					stringBuffer.append(TEXT_10);
+				}
+			}
+			if (!first) {
+				stringBuffer.append(TEXT_11);
+			}
+		}
+		if (!genClass.getImplementedGenOperations().isEmpty()) {
+			boolean first = true;
+			for (GenOperation genOperation : genClass.getImplementedGenOperations()) {
+				if (first) {
+					first = false;
+					stringBuffer.append(TEXT_12);
+				}
+				stringBuffer.append(TEXT_7);
+				stringBuffer.append(genOperation.getGenClass().getRawQualifiedInterfaceName());
+				stringBuffer.append(TEXT_8);
+				stringBuffer.append(genOperation.getName());
+				stringBuffer.append(TEXT_13);
+				stringBuffer.append(genOperation.getParameterTypes(", "));
+				stringBuffer.append(TEXT_14);
+				stringBuffer.append(genOperation.getFormattedName());
+				stringBuffer.append(TEXT_10);
+			}
+			if (!first) {
+				stringBuffer.append(TEXT_11);
+			}
+		}
+		if (genClass.hasImplicitAPITags()) {
+			stringBuffer.append(TEXT_15);
+			stringBuffer.append(genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_16);
+		if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_17);
+		}
+		stringBuffer.append(TEXT_18);
+		if (genClass.isAbstract()) {
+			stringBuffer.append(TEXT_19);
+		}
+		stringBuffer.append(TEXT_20);
+		stringBuffer.append(genClass.getTestCaseClassName());
+		stringBuffer.append(TEXT_21);
+		stringBuffer.append(genClass.isModelRoot() ? genModel.getImportedName("junit.framework.TestCase")
+				: genClass.getClassExtendsGenClass().getImportedTestCaseClassName());
+		stringBuffer.append(TEXT_22);
+		if (genModel.hasCopyrightField()) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_24);
+			stringBuffer.append(genModel.getCopyrightFieldLiteral());
+			stringBuffer.append(TEXT_25);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		if (genModel.getDriverNumber() != null) {
+			stringBuffer.append(TEXT_23);
+			stringBuffer.append(genModel.getImportedName("java.lang.String"));
+			stringBuffer.append(TEXT_26);
+			stringBuffer.append(genModel.getDriverNumber());
+			stringBuffer.append(TEXT_27);
+			stringBuffer.append(genModel.getNonNLS());
+		}
+		if (genClass.isModelRoot()) {
+			stringBuffer.append(TEXT_28);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_29);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+			stringBuffer.append(TEXT_30);
+		}
+		if (!genClass.isAbstract()) {
+			stringBuffer.append(TEXT_31);
+			stringBuffer.append(genModel.getImportedName("junit.textui.TestRunner"));
+			stringBuffer.append(TEXT_32);
+			stringBuffer.append(genClass.getTestCaseClassName());
+			stringBuffer.append(TEXT_33);
+		}
+		stringBuffer.append(TEXT_34);
+		stringBuffer.append(genClass.getFormattedName());
+		stringBuffer.append(TEXT_35);
+		stringBuffer.append(genClass.getTestCaseClassName());
+		stringBuffer.append(TEXT_36);
+		if (genClass.isModelRoot()) {
+			stringBuffer.append(TEXT_37);
+			stringBuffer.append(genClass.getFormattedName());
+			stringBuffer.append(TEXT_38);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+			stringBuffer.append(TEXT_39);
+		}
+		stringBuffer.append(TEXT_40);
+		stringBuffer.append(genClass.getFormattedName());
+		stringBuffer.append(TEXT_41);
+		if (!genClass.isModelRoot() && genModel.useClassOverrideAnnotation()) {
+			stringBuffer.append(TEXT_42);
+		}
+		stringBuffer.append(TEXT_43);
+		if (genModel.useGenerics()) {
+			stringBuffer.append(TEXT_44);
+		} else {
+			stringBuffer.append(TEXT_45);
+		}
+		stringBuffer.append(TEXT_46);
+		stringBuffer.append(genClass.getImportedInterfaceName());
+		stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+		stringBuffer.append(TEXT_47);
+		if (genClass.isModelRoot()) {
+			stringBuffer.append(TEXT_48);
+		} else {
+			stringBuffer.append(TEXT_49);
+			stringBuffer.append(genClass.getImportedInterfaceName());
+			stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+			stringBuffer.append(TEXT_50);
+		}
+		stringBuffer.append(TEXT_51);
+		if (!genClass.isAbstract()) {
+			stringBuffer.append(TEXT_52);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_42);
+			}
+			if (genModel.useGenerics() && genClass.isMapEntry()) {
+				stringBuffer.append(TEXT_53);
+			}
+			stringBuffer.append(TEXT_54);
+			if (genClass.isMapEntry()) {
+				stringBuffer.append(TEXT_55);
+				stringBuffer.append(genClass.getImportedInterfaceName());
+				stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+				stringBuffer.append(TEXT_56);
+				stringBuffer.append(genPackage.getQualifiedEFactoryInternalInstanceAccessor());
+				stringBuffer.append(TEXT_57);
+				stringBuffer.append(genClass.getQualifiedClassifierAccessor());
+				stringBuffer.append(TEXT_58);
+			} else {
+				stringBuffer.append(TEXT_59);
+				stringBuffer.append(genPackage.getQualifiedEFactoryInternalInstanceAccessor());
+				stringBuffer.append(TEXT_60);
+				stringBuffer.append(genClass.getName());
+				stringBuffer.append(TEXT_61);
+			}
+			stringBuffer.append(TEXT_62);
+			if (genModel.useClassOverrideAnnotation()) {
+				stringBuffer.append(TEXT_42);
+			}
+			stringBuffer.append(TEXT_63);
+		}
+		for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {
+			stringBuffer.append(TEXT_64);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_09kCIWJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//TestCase/implementedGenFeature.override.javajetinc
+		}
+		for (GenOperation genOperation : genClass.getImplementedGenOperations()) {
+			stringBuffer.append(TEXT_64);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genOperation", genOperation);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1Cx5UGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+			//TestCase/implementedGenOperation.override.javajetinc
+		}
+		stringBuffer.append(TEXT_64);
+		stringBuffer.append(TEXT_64);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1DYWQGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_65);
+		stringBuffer.append(genClass.getTestCaseClassName());
+		genModel.emitSortedImports();
+		stringBuffer.append(TEXT_64);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		GenClass genClass = parameter;
+		genModel = parameter.getGenModel();
+		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
+				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+		canGenerate = canGenerate && true;
+		return canGenerate;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegenOperationannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegenOperationannotationsinsert.java
new file mode 100644
index 0000000..9ee5957
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegenOperationannotationsinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasegenOperationannotationsinsert {
+	protected static String nl;
+
+	public static synchronized TestCasegenOperationannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasegenOperationannotationsinsert result = new TestCasegenOperationannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCasegenOperationannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..e7d34ec
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureTODOoverride.java
@@ -0,0 +1,162 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasegetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized TestCasegetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasegetGenFeatureTODOoverride result = new TestCasegetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this feature getter test method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tfail();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public TestCasegetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..babfd17
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureannotationsinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasegetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized TestCasegetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasegetGenFeatureannotationsinsert result = new TestCasegetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCasegetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureoverride.java
new file mode 100644
index 0000000..a240f34
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasegetGenFeatureoverride.java
@@ -0,0 +1,238 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasegetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized TestCasegetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasegetGenFeatureoverride result = new TestCasegetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + NL + "\t/**" + NL + "\t * Tests the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = "() <em>";
+	protected final String TEXT_4 = "</em>}' feature getter." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_5 = "()";
+	protected final String TEXT_6 = NL + "\t * ";
+	protected final String TEXT_7 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_8 = NL;
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\tpublic void test";
+	protected final String TEXT_11 = "()" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t}" + NL;
+	protected final String TEXT_13 = NL;
+
+	public TestCasegetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(TEXT_13);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getGetAccessor());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/getGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_8);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0-KfEGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genModel.capName(genFeature.getGetAccessor()));
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(TEXT_8);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0-UQEGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//TestCase/getGenFeature.todo.override.javajetinc
+		stringBuffer.append(TEXT_12);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenFeatureinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenFeatureinsert.java
new file mode 100644
index 0000000..96926db
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenFeatureinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseimplementedGenFeatureinsert {
+	protected static String nl;
+
+	public static synchronized TestCaseimplementedGenFeatureinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseimplementedGenFeatureinsert result = new TestCaseimplementedGenFeatureinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCaseimplementedGenFeatureinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenFeatureoverride.java
new file mode 100644
index 0000000..c4038c9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenFeatureoverride.java
@@ -0,0 +1,277 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseimplementedGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseimplementedGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseimplementedGenFeatureoverride result = new TestCaseimplementedGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL;
+
+	public TestCaseimplementedGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(TEXT_3);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		if (genFeature.isTested()) {
+			if (genFeature.isGet() && !genFeature.isSuppressedGetVisibility()) {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_093kIGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//TestCase/getGenFeature.override.javajetinc
+			}
+			if (genFeature.isSet() && !genFeature.isSuppressedSetVisibility()) {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0-daAGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//TestCase/setGenFeature.override.javajetinc
+			}
+			if (genFeature.isUnset() && !genFeature.isSuppressedUnsetVisibility()) {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0_NA4GJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//TestCase/unsetGenFeature.override.javajetinc
+			}
+			if (genFeature.isIsSet() && !genFeature.isSuppressedIsSetVisibility()) {
+				stringBuffer.append(TEXT_2);
+				{
+					//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+					InternalPatternContext ictx = (InternalPatternContext) ctx;
+					new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+					stringBuffer.setLength(0);
+
+					final Map<String, Object> callParameters = new HashMap<String, Object>();
+					callParameters.put("genFeature", genFeature);
+					callParameters.put("genClass", genClass);
+					callParameters.put("genPackage", genPackage);
+					callParameters.put("genModel", genModel);
+					callParameters.put("isJDK50", isJDK50);
+					CallHelper.executeWithParameterInjection(
+							"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1BvXgGJ-Ed-FqczH3ESmRw",
+							new ExecutionContext((InternalPatternContext) ctx), callParameters);
+					stringBuffer.setLength(0);
+				}
+
+				//TestCase/isSetGenFeature.override.javajetinc
+			}
+		}
+		stringBuffer.append(TEXT_2);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1CovYGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_2);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationTODOoverride.java
new file mode 100644
index 0000000..4c2fb8a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationTODOoverride.java
@@ -0,0 +1,162 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseimplementedGenOperationTODOoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseimplementedGenOperationTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseimplementedGenOperationTODOoverride result = new TestCaseimplementedGenOperationTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this operation test method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tfail();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public TestCaseimplementedGenOperationTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationinsert.java
new file mode 100644
index 0000000..4a8e7f1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseimplementedGenOperationinsert {
+	protected static String nl;
+
+	public static synchronized TestCaseimplementedGenOperationinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseimplementedGenOperationinsert result = new TestCaseimplementedGenOperationinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCaseimplementedGenOperationinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationoverride.java
new file mode 100644
index 0000000..d93a4f9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseimplementedGenOperationoverride.java
@@ -0,0 +1,264 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseimplementedGenOperationoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseimplementedGenOperationoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseimplementedGenOperationoverride result = new TestCaseimplementedGenOperationoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + NL + "\t/**" + NL + "\t * Tests the '{@link ";
+	protected final String TEXT_2 = "#";
+	protected final String TEXT_3 = "(";
+	protected final String TEXT_4 = ") <em>";
+	protected final String TEXT_5 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_6 = ")";
+	protected final String TEXT_7 = NL + "\t * ";
+	protected final String TEXT_8 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_9 = NL;
+	protected final String TEXT_10 = NL + "\t@Deprecated";
+	protected final String TEXT_11 = NL + "\tpublic void test";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t}";
+	protected final String TEXT_14 = NL;
+
+	public TestCaseimplementedGenOperationoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genOperationList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genOperationParameter : genOperationList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genOperation = (org.eclipse.emf.codegen.ecore.genmodel.GenOperation) genOperationParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_14);
+		stringBuffer.append(TEXT_14);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genOperation", this.genOperation);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenOperation genOperation = null;
+
+	public void set_genOperation(org.eclipse.emf.codegen.ecore.genmodel.GenOperation object) {
+		this.genOperation = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genOperation", this.genOperation);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genOperation.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genOperation.getName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genOperation.getParameterTypes(", "));
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genOperation.getFormattedName());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(genOperation.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genOperation.getName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genOperation.getParameterTypes(", "));
+		stringBuffer.append(TEXT_6);
+		if (genOperation.hasAPITags()) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genOperation.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_8);
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/genOperation.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_9);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.genOperation.annotations.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genOperation", genOperation);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1C7qUGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_10);
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genClass.getUniqueName(genOperation));
+		stringBuffer.append(TEXT_12);
+		stringBuffer.append(TEXT_9);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.TODO.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genOperation", genOperation);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1DFbUGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//TestCase/implementedGenOperation.todo.override.javajetinc
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(TEXT_9);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genOperation", genOperation);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1DOlQGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		stringBuffer.append(TEXT_9);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseinsert.java
new file mode 100644
index 0000000..082f9f0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseinsert.java
@@ -0,0 +1,147 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseinsert {
+	protected static String nl;
+
+	public static synchronized TestCaseinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseinsert result = new TestCaseinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCaseinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genClassParameter : genClassList) {
+			for (Object genPackageParameter : genPackageList) {
+				for (Object genModelParameter : genModelList) {
+					for (Object isJDK50Parameter : isJDK50List) {
+
+						this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+						this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+						this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+						this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+						if (preCondition(ctx)) {
+							ctx.setNode(new Node.Container(currentNode, getClass()));
+							orchestration(ctx);
+						}
+
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..6c90250
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureTODOoverride.java
@@ -0,0 +1,162 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseisSetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseisSetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseisSetGenFeatureTODOoverride result = new TestCaseisSetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this test method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tfail();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public TestCaseisSetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..b5f47ca
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureannotationsinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseisSetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized TestCaseisSetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseisSetGenFeatureannotationsinsert result = new TestCaseisSetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCaseisSetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureoverride.java
new file mode 100644
index 0000000..93ac296
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseisSetGenFeatureoverride.java
@@ -0,0 +1,238 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseisSetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseisSetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseisSetGenFeatureoverride result = new TestCaseisSetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + NL + "\t/**" + NL + "\t * Tests the '{@link ";
+	protected final String TEXT_2 = "#isSet";
+	protected final String TEXT_3 = "() <em>isSet";
+	protected final String TEXT_4 = "()</em>}' method." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_5 = "()";
+	protected final String TEXT_6 = NL + "\t * ";
+	protected final String TEXT_7 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_8 = NL;
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\tpublic void testIsSet";
+	protected final String TEXT_11 = "()" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t}" + NL;
+	protected final String TEXT_13 = NL;
+
+	public TestCaseisSetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(TEXT_13);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/isSetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_8);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1CMDcGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(TEXT_8);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1Ce-YGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//TestCase/isSetGenFeature.todo.override.javajetinc
+		stringBuffer.append(TEXT_12);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..3570fea
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureTODOoverride.java
@@ -0,0 +1,162 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasesetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized TestCasesetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasesetGenFeatureTODOoverride result = new TestCasesetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this feature setter test method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tfail();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public TestCasesetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..9be5094
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureannotationsinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasesetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized TestCasesetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasesetGenFeatureannotationsinsert result = new TestCasesetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCasesetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureoverride.java
new file mode 100644
index 0000000..9750bc2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCasesetGenFeatureoverride.java
@@ -0,0 +1,243 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCasesetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized TestCasesetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCasesetGenFeatureoverride result = new TestCasesetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + NL + "\t/**" + NL + "\t * Tests the '{@link ";
+	protected final String TEXT_2 = "#set";
+	protected final String TEXT_3 = "(";
+	protected final String TEXT_4 = ") <em>";
+	protected final String TEXT_5 = "</em>}' feature setter." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_6 = ")";
+	protected final String TEXT_7 = NL + "\t * ";
+	protected final String TEXT_8 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_9 = NL;
+	protected final String TEXT_10 = NL + "\t@Deprecated";
+	protected final String TEXT_11 = NL + "\tpublic void testSet";
+	protected final String TEXT_12 = "()" + NL + "\t{";
+	protected final String TEXT_13 = NL + "\t}" + NL;
+	protected final String TEXT_14 = NL;
+
+	public TestCasesetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_14);
+		stringBuffer.append(TEXT_14);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getRawBoundType());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getFormattedName());
+		stringBuffer.append(TEXT_5);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getRawBoundType());
+		stringBuffer.append(TEXT_6);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_7);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_8);
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/setGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_9);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0-wU8GJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_10);
+		}
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_12);
+		stringBuffer.append(TEXT_9);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_0-6F8GJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//TestCase/setGenFeature.todo.override.javajetinc
+		stringBuffer.append(TEXT_13);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureTODOoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureTODOoverride.java
new file mode 100644
index 0000000..9e4d1da
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureTODOoverride.java
@@ -0,0 +1,162 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseunsetGenFeatureTODOoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseunsetGenFeatureTODOoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseunsetGenFeatureTODOoverride result = new TestCaseunsetGenFeatureTODOoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + "\t\t// TODO: implement this test method" + NL
+			+ "\t\t// Ensure that you remove @generated or mark it @generated NOT" + NL + "\t\tfail();" + NL;
+	protected final String TEXT_2 = NL;
+
+	public TestCaseunsetGenFeatureTODOoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureannotationsinsert.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureannotationsinsert.java
new file mode 100644
index 0000000..68d7aa5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureannotationsinsert.java
@@ -0,0 +1,160 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseunsetGenFeatureannotationsinsert {
+	protected static String nl;
+
+	public static synchronized TestCaseunsetGenFeatureannotationsinsert create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseunsetGenFeatureannotationsinsert result = new TestCaseunsetGenFeatureannotationsinsert();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = "";
+	protected final String TEXT_2 = NL;
+
+	public TestCaseunsetGenFeatureannotationsinsert() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(TEXT_2);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureoverride.java b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureoverride.java
new file mode 100644
index 0000000..76fc8e6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/generated/org/eclipse/egf/emf/pattern/tests/call/TestCase/TestCaseunsetGenFeatureoverride.java
@@ -0,0 +1,238 @@
+//Generated with EGF 1.6.1.201902111324
+package org.eclipse.egf.emf.pattern.tests.call.TestCase;
+
+import org.eclipse.egf.emf.pattern.base.*;
+import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
+import org.eclipse.emf.codegen.ecore.genmodel.*;
+import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
+import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
+import org.eclipse.emf.codegen.util.*;
+import org.eclipse.emf.ecore.util.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.egf.common.helper.*;
+import java.util.*;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.egf.model.pattern.*;
+import org.eclipse.egf.pattern.execution.*;
+import org.eclipse.egf.pattern.query.*;
+
+public class TestCaseunsetGenFeatureoverride {
+	protected static String nl;
+
+	public static synchronized TestCaseunsetGenFeatureoverride create(String lineSeparator) {
+		nl = lineSeparator;
+		TestCaseunsetGenFeatureoverride result = new TestCaseunsetGenFeatureoverride();
+		nl = null;
+		return result;
+	}
+
+	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+	protected final String TEXT_1 = NL + NL + "\t/**" + NL + "\t * Tests the '{@link ";
+	protected final String TEXT_2 = "#unset";
+	protected final String TEXT_3 = "() <em>unset";
+	protected final String TEXT_4 = "()</em>}' method." + NL + "\t * <!-- begin-user-doc -->" + NL
+			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
+	protected final String TEXT_5 = "()";
+	protected final String TEXT_6 = NL + "\t * ";
+	protected final String TEXT_7 = NL + "\t * @generated" + NL + "\t */";
+	protected final String TEXT_8 = NL;
+	protected final String TEXT_9 = NL + "\t@Deprecated";
+	protected final String TEXT_10 = NL + "\tpublic void testUnset";
+	protected final String TEXT_11 = "()" + NL + "\t{";
+	protected final String TEXT_12 = NL + "\t}" + NL;
+	protected final String TEXT_13 = NL;
+
+	public TestCaseunsetGenFeatureoverride() {
+		//Here is the constructor
+		StringBuffer stringBuffer = new StringBuffer();
+
+		// add initialisation of the pattern variables (declaration has been already done).
+
+	}
+
+	public String generate(Object argument) throws Exception {
+		final StringBuffer stringBuffer = new StringBuffer();
+
+		InternalPatternContext ctx = (InternalPatternContext) argument;
+		Map<String, String> queryCtx = null;
+		IQuery.ParameterDescription paramDesc = null;
+		Node.Container currentNode = ctx.getNode();
+
+		List<Object> genFeatureList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genClassList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genPackageList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> genModelList = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+		List<Object> isJDK50List = null;
+		//this pattern can only be called by another (i.e. it's not an entry point in execution)
+
+		for (Object genFeatureParameter : genFeatureList) {
+			for (Object genClassParameter : genClassList) {
+				for (Object genPackageParameter : genPackageList) {
+					for (Object genModelParameter : genModelList) {
+						for (Object isJDK50Parameter : isJDK50List) {
+
+							this.genFeature = (org.eclipse.emf.codegen.ecore.genmodel.GenFeature) genFeatureParameter;
+							this.genClass = (org.eclipse.emf.codegen.ecore.genmodel.GenClass) genClassParameter;
+							this.genPackage = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) genPackageParameter;
+							this.genModel = (org.eclipse.emf.codegen.ecore.genmodel.GenModel) genModelParameter;
+							this.isJDK50 = (java.lang.Boolean) isJDK50Parameter;
+
+							if (preCondition(ctx)) {
+								ctx.setNode(new Node.Container(currentNode, getClass()));
+								orchestration(ctx);
+							}
+
+						}
+					}
+				}
+			}
+		}
+		ctx.setNode(currentNode);
+		if (ctx.useReporter()) {
+			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
+		}
+
+		stringBuffer.append(TEXT_13);
+		stringBuffer.append(TEXT_13);
+		return stringBuffer.toString();
+	}
+
+	public String orchestration(PatternContext ctx) throws Exception {
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+
+		method_doGenerate(new StringBuffer(), ictx);
+
+		if (ictx.useReporter()) {
+			Map<String, Object> parameterValues = new HashMap<String, Object>();
+			parameterValues.put("genFeature", this.genFeature);
+			parameterValues.put("genClass", this.genClass);
+			parameterValues.put("genPackage", this.genPackage);
+			parameterValues.put("genModel", this.genModel);
+			parameterValues.put("isJDK50", this.isJDK50);
+			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
+			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
+			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
+		}
+		return null;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenFeature genFeature = null;
+
+	public void set_genFeature(org.eclipse.emf.codegen.ecore.genmodel.GenFeature object) {
+		this.genFeature = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenClass genClass = null;
+
+	public void set_genClass(org.eclipse.emf.codegen.ecore.genmodel.GenClass object) {
+		this.genClass = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenPackage genPackage = null;
+
+	public void set_genPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage object) {
+		this.genPackage = object;
+	}
+
+	protected org.eclipse.emf.codegen.ecore.genmodel.GenModel genModel = null;
+
+	public void set_genModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel object) {
+		this.genModel = object;
+	}
+
+	protected java.lang.Boolean isJDK50 = null;
+
+	public void set_isJDK50(java.lang.Boolean object) {
+		this.isJDK50 = object;
+	}
+
+	public Map<String, Object> getParameters() {
+		final Map<String, Object> parameters = new HashMap<String, Object>();
+		parameters.put("genFeature", this.genFeature);
+		parameters.put("genClass", this.genClass);
+		parameters.put("genPackage", this.genPackage);
+		parameters.put("genModel", this.genModel);
+		parameters.put("isJDK50", this.isJDK50);
+		return parameters;
+	}
+
+	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {
+
+		stringBuffer.append(TEXT_1);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_3);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_4);
+		stringBuffer.append(genFeature.getGenClass().getRawQualifiedInterfaceName());
+		stringBuffer.append(TEXT_2);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_5);
+		if (genFeature.hasAPITags()) {
+			stringBuffer.append(TEXT_6);
+			stringBuffer.append(genFeature.getAPITags(genModel.getIndentation(stringBuffer)));
+		}
+		stringBuffer.append(TEXT_7);
+		if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/unsetGenFeature.annotations.insert.javajetinc
+			stringBuffer.append(TEXT_8);
+			{
+				//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+				InternalPatternContext ictx = (InternalPatternContext) ctx;
+				new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+				stringBuffer.setLength(0);
+
+				final Map<String, Object> callParameters = new HashMap<String, Object>();
+				callParameters.put("genFeature", genFeature);
+				callParameters.put("genClass", genClass);
+				callParameters.put("genPackage", genPackage);
+				callParameters.put("genModel", genModel);
+				callParameters.put("isJDK50", isJDK50);
+				CallHelper.executeWithParameterInjection(
+						"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1BcckGJ-Ed-FqczH3ESmRw",
+						new ExecutionContext((InternalPatternContext) ctx), callParameters);
+				stringBuffer.setLength(0);
+			}
+
+		}
+		if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {
+			stringBuffer.append(TEXT_9);
+		}
+		stringBuffer.append(TEXT_10);
+		stringBuffer.append(genFeature.getAccessorName());
+		stringBuffer.append(TEXT_11);
+		stringBuffer.append(TEXT_8);
+		{
+			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+
+			InternalPatternContext ictx = (InternalPatternContext) ctx;
+			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
+			stringBuffer.setLength(0);
+
+			final Map<String, Object> callParameters = new HashMap<String, Object>();
+			callParameters.put("genFeature", genFeature);
+			callParameters.put("genClass", genClass);
+			callParameters.put("genPackage", genPackage);
+			callParameters.put("genModel", genModel);
+			callParameters.put("isJDK50", isJDK50);
+			CallHelper.executeWithParameterInjection(
+					"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_1BlmgGJ-Ed-FqczH3ESmRw",
+					new ExecutionContext((InternalPatternContext) ctx), callParameters);
+			stringBuffer.setLength(0);
+		}
+
+		//TestCase/unsetGenFeature.todo.override.javajetinc
+		stringBuffer.append(TEXT_12);
+		InternalPatternContext ictx = (InternalPatternContext) ctx;
+		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
+	}
+
+	public boolean preCondition(PatternContext ctx) throws Exception {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/org.eclipse.emf.codegen.ecore.patch b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/org.eclipse.emf.codegen.ecore.patch
new file mode 100644
index 0000000..90fe9ba
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/org.eclipse.emf.codegen.ecore.patch
@@ -0,0 +1,24 @@
+diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/model/Class.javajet b/plugins/org.eclipse.emf.codegen.ecore/templates/model/Class.javajet
+index 48d03c8..b578b58 100644
+--- a/plugins/org.eclipse.emf.codegen.ecore/templates/model/Class.javajet
++++ b/plugins/org.eclipse.emf.codegen.ecore/templates/model/Class.javajet
+@@ -16,7 +16,7 @@
+ <%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+ <%final boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); final boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]); final boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+ <%final boolean isGWT = genModel.getRuntimePlatform() == GenRuntimePlatform.GWT;%>
+-<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();String indentDefaultCase = forceDefaultCase ? "\t\t" : "";%>
++<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();final String indentDefaultCase = forceDefaultCase ? "\t\t" : "";%>
+ <%final String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+ <%final String singleWildcard = isJDK50 ? "<?>" : "";%>
+ <%final String negativeOffsetCorrection = genClass.hasOffsetCorrection() ? " - " + genClass.getOffsetCorrectionField(null) : "";%>
+@@ -502,7 +502,10 @@
+ 	 */
+ 	<%if (genModel.isPublicConstructors()) {%>public<%} else {%>protected<%}%> <%=genClass.getClassName()%>()
+ 	{
++<%@ include file="Class/egfCustom.constructor.override.javajetinc" fail="alternative" %>
++<%@ start %>
+ 		super();
++<%@ end %>
+   <%for (GenFeature genFeature : genClass.getFlagGenFeaturesWithDefault()) {%>
+ 		<%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG<%if (!genFeature.isBooleanType()) {%>_DEFAULT<%}%>;
+   <%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/plugin.properties b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/plugin.properties
new file mode 100644
index 0000000..3747c7c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/plugin.properties
@@ -0,0 +1,13 @@
+##
+#  Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
+#  All rights reserved. This program and the accompanying materials
+#  are made available under the terms of the Eclipse Public License v1.0
+#  which accompanies this distribution, and is available at
+#  http://www.eclipse.org/legal/epl-v10.html
+# 
+#  Contributors:
+#      Thales Corporate Services S.A.S - initial API and implementation
+##
+
+pluginName=EGF EMF Pattern
+providerName=Eclipse Modeling Project
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/plugin.xml b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/plugin.xml
new file mode 100644
index 0000000..e7336fa
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/plugin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<!--
+     Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
+     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
+    
+     Contributors:
+         Thales Corporate Services S.A.S - initial API and implementation
+ -->
+ 
+<plugin>
+   <extension
+         point="org.eclipse.egf.core.fcore">
+      <fcore
+            id="egf/EMF_Pattern.fcore">
+      </fcore>
+   </extension>
+
+  
+</plugin>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F-2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F-2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..de5a4ae
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F-2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this feature setter test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._0-6F9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._CStaNHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._CStaNHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-6F8GJ-Ed-FqczH3ESmRw/method._CStaNHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfG2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfG2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._0-KfG2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._CLQuZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._CLQuZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-KfEGJ-Ed-FqczH3ESmRw/method._CLQuZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQG2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQG2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..42821b4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._0-UQG2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this feature getter test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._CMmyNHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._CMmyNHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-UQEGJ-Ed-FqczH3ESmRw/method._CMmyNHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daC2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daC2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..f6550dc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._0-daC2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,23 @@
+
+
+
+	/**
+	 * Tests the '{@link <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawBoundType()%>) <em><%=genFeature.getFormattedName()%></em>}' feature setter.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawBoundType()%>)
+      <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+      <%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/setGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+      <%}%>
+      <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	public void testSet<%=genFeature.getAccessorName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/setGenFeature.todo.override.javajetinc%>
+	}
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._CPu-tHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._CPu-tHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-daAGJ-Ed-FqczH3ESmRw/method._CPu-tHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU-2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU-2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU-2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._0-wU9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._CRq4ZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._CRq4ZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0-wU8GJ-Ed-FqczH3ESmRw/method._CRq4ZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00Bro2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00Bro2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00Bro2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BromJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BromJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BromJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..592e957
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._00BrsmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,19 @@
+
+
+	/**
+	 * Unsets the value of the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
+	 * @see #isSet<%=genFeature.getAccessorName()%>()
+  <%}%>
+	 * @see #<%=genFeature.getGetAccessor()%>()
+  <%if (!genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
+	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawImportedBoundType()%>)
+  <%}%>
+  <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._BW9jpHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._BW9jpHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00BroGJ-Ed-FqczH3ESmRw/method._BW9jpHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00Lco2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00Lco2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00Lco2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._00LcsmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._BX27hHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._BX27hHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00LcoGJ-Ed-FqczH3ESmRw/method._BX27hHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNo2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNo2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNo2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._00VNsmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._BY5dVHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._BY5dVHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00VNoGJ-Ed-FqczH3ESmRw/method._BY5dVHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXk2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXk2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXk2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXkmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXkmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXkmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXlWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXlWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXlWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..bebddb5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._00eXomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method to unset the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._BZy1NHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._BZy1NHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00eXkGJ-Ed-FqczH3ESmRw/method._BZy1NHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIk2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIk2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIk2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIkmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIkmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIkmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIlWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIlWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIlWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..beb0420
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._00oIomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,64 @@
+
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/isSetGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/isSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) {%>
+	boolean isSet<%=genFeature.getAccessorName()%>();
+
+<%} else {%>
+  <%if (useInterfaceOverrideAnnotation  && !genClass.isMapEntry() && !genClass.hasCollidingIsSetAccessorOperation(genFeature) && !genFeature.isSuppressedIsSetVisibility()) {%>
+	@Override
+  <%}%>
+	public boolean isSet<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingIsSetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		return eDynamicIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+		return eIsSet(<%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		return <%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		return <%=genFeature.getSafeName()%> != null && ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable<%=singleWildcard%>)<%=genFeature.getSafeName()%>).isSet();
+      <%} else {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		return eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%} else if (genClass.isESetFlag(genFeature)) {%>
+		return (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+        <%} else {%>
+		return <%=genFeature.getUncapName()%>ESet;
+        <%}%>
+      <%}%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%} else {%>
+		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%}%>
+    <%} else if (genClass.getIsSetAccessorOperation(genFeature) != null) {%>
+		<%=genClass.getIsSetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/isSetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._BaPhJHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._BaPhJHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00oIkGJ-Ed-FqczH3ESmRw/method._BaPhJHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5k2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5k2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5k2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5kmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5kmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5kmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5lWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5lWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5lWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5omJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5omJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..cb31135
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._00x5omJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,20 @@
+
+
+	/**
+	 * Returns whether the value of the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%> is set.
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%> is set.
+    <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
+	 * @see #unset<%=genFeature.getAccessorName()%>()
+    <%}%>
+	 * @see #<%=genFeature.getGetAccessor()%>()
+    <%if (!genFeature.isListType() && genFeature.isChangeable() && !genFeature.isSuppressedSetVisibility()) {%>
+	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawImportedBoundType()%>)
+    <%}%>
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._BbSC9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._BbSC9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._00x5kGJ-Ed-FqczH3ESmRw/method._BbSC9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-MZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-McmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-McmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e508431
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._01-McmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,126 @@
+
+
+  <%if (isImplementation) {%>
+    <%if (genOperation.isInvariant() && genOperation.hasInvariantExpression()) {%>
+	/**
+	 * The cached validation expression for the '{@link #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' invariant operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	protected static final <%=genModel.getImportedName("java.lang.String")%> <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EEXPRESSION = "<%=genOperation.getInvariantExpression("\t\t")%>";<%=genModel.getNonNLS()%>
+
+    <%} else if (genOperation.hasInvocationDelegate()) {%>
+	/**
+	 * The cached invocation delegate for the '{@link #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	protected static final <%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%>.Internal.InvocationDelegate <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%>.Internal)<%=genOperation.getQualifiedOperationAccessor()%>).getInvocationDelegate();
+
+    <%}%>
+  <%}%>
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.javadoc.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/genOperation.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/genOperation.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.annotations.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) {%>
+	<%=genOperation.getTypeParameters(genClass)%><%=genOperation.getImportedType(genClass)%> <%=genOperation.getName()%>(<%=genOperation.getParameters(genClass)%>)<%=genOperation.getThrows(genClass)%>;
+
+<%} else {%>
+  <%if (genModel.useGenerics() && !genOperation.hasBody() && !genOperation.isInvariant() && genOperation.hasInvocationDelegate() && genOperation.isUncheckedCast(genClass)) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genOperation.isSuppressedVisibility()) {%>
+	@Override
+  <%}%>
+	public <%=genOperation.getTypeParameters(genClass)%><%=genOperation.getImportedType(genClass)%> <%=genOperation.getName()%>(<%=genOperation.getParameters(isImplementation, genClass)%>)<%=genOperation.getThrows(genClass)%>
+	{
+  <%if (genOperation.hasBody()) {%>
+		<%=genOperation.getBody(genModel.getIndentation(stringBuffer))%>
+  <%} else if (genOperation.isInvariant()) {GenClass opClass = genOperation.getGenClass(); String diagnostics = genOperation.getGenParameters().get(0).getName(); String context = genOperation.getGenParameters().get(1).getName();%>
+    <%if (genOperation.hasInvariantExpression()) {%>
+		return
+			<%=opClass.getGenPackage().getImportedValidatorClassName()%>.validate
+				(<%=genClass.getQualifiedClassifierAccessor()%>,
+				 this,
+				 <%=diagnostics%>,
+				 <%=context%>,
+				 "<%=genOperation.getValidationDelegate()%>",<%=genModel.getNonNLS()%>
+				 <%=genOperation.getQualifiedOperationAccessor()%>,
+				 <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EEXPRESSION,
+				 <%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+				 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.DIAGNOSTIC_SOURCE,
+				 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.<%=opClass.getOperationID(genOperation)%>);
+    <%} else {%>
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false)
+		{
+			if (<%=diagnostics%> != null)
+			{
+				<%=diagnostics%>.add
+					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.DIAGNOSTIC_SOURCE,
+						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.<%=opClass.getOperationID(genOperation)%>,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericInvariant_diagnostic", new Object[] { "<%=genOperation.getName()%>", <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator")%>.getObjectLabel(this, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+						 new Object [] { this }));
+			}
+			return false;
+		}
+		return true;
+    <%}%>
+  <%} else if (genOperation.hasInvocationDelegate()) { int size = genOperation.getGenParameters().size();%>
+		try
+		{
+    <%if (genOperation.isVoid()) {%>
+			<%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE.dynamicInvoke(this, <%if (size > 0) {%>new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>.UnmodifiableEList<Object>(<%=size%>, <%=genOperation.getParametersArray(genClass)%>)<%} else {%>null<%}%>);
+    <%} else {%>
+			return <%if (!isJDK50 && genOperation.isPrimitiveType()) {%>(<%}%>(<%=genOperation.getObjectType(genClass)%>)<%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE.dynamicInvoke(this, <%if (size > 0) {%>new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>.UnmodifiableEList<Object>(<%=size%>, <%=genOperation.getParametersArray(genClass)%>)<%} else {%>null<%}%>)<%if (!isJDK50 && genOperation.isPrimitiveType()) {%>).<%=genOperation.getPrimitiveValueFunction()%>()<%}%>;
+    <%}%>
+		}
+		catch (<%=genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException" : "java.lang.reflect.InvocationTargetException")%> ite)
+		{
+			throw new <%=genModel.getImportedName("org.eclipse.emf.common.util.WrappedException")%>(ite);
+		}
+  <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.implementedGenOperation.TODO.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/implementedGenOperation.todo.override.javajetinc%>
+  <%}%>
+	}
+
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._BiI45HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._BiI45HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01-MYGJ-Ed-FqczH3ESmRw/method._BiI45HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._010bcmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._BgWJJHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._BgWJJHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._010bYGJ-Ed-FqczH3ESmRw/method._BgWJJHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-c2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-c2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-c2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-cmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-cmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-cmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-dWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-dWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-dWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-gmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-gmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._01N-gmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._BcoGxHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._BcoGxHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01N-cGJ-Ed-FqczH3ESmRw/method._BcoGxHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgc2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgc2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgc2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgcmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgdWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgdWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hgdWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hggmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hggmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._01hggmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._Bd9jhHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._Bd9jhHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01hgcGJ-Ed-FqczH3ESmRw/method._Bd9jhHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..b837f39
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._01qqcmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method to return whether the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%> is set
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._BfAsZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._BfAsZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._01qqYGJ-Ed-FqczH3ESmRw/method._BfAsZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229M2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229M2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229M2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229MmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229MmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229MmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229NWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229NWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229NWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229QmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229QmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..fc18b0e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._0229QmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._Bn8l9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._Bn8l9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0229MGJ-Ed-FqczH3ESmRw/method._Bn8l9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWU2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWU2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWU2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWUmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWVWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWVWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWVWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..79b2cdc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._02HWYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,32 @@
+
+
+	/**
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.javadoc.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genOperation.hasDocumentation() || genOperation.hasParameterDocumentation()) {%>
+	 * <!-- begin-model-doc -->
+    <%if (genOperation.hasDocumentation()) {%>
+	 * <%=genOperation.getDocumentation(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+    <%for (GenParameter genParameter : genOperation.getGenParameters()) {%>
+      <%if (genParameter.hasDocumentation()) { String documentation = genParameter.getDocumentation("");%>
+        <%if (documentation.contains("\n") || documentation.contains("\r")) {%>
+	 * @param <%=genParameter.getName()%>
+	 *   <%=genParameter.getDocumentation(genModel.getIndentation(stringBuffer))%>
+        <%} else {%>
+	 * @param <%=genParameter.getName()%> <%=genParameter.getDocumentation(genModel.getIndentation(stringBuffer))%>
+        <%}%>
+      <%}%>
+    <%}%>
+	 * <!-- end-model-doc -->
+  <%}%>
+  <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genOperation.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+  <%} else {%>
+	 *        <%=modelInfo%>
+  <%}} if (first) {%>
+	 * @model
+  <%}}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._Bjx3pHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._Bjx3pHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02HWUGJ-Ed-FqczH3ESmRw/method._Bjx3pHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQ2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCRWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCRWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCRWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._02kCUmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._BlkAVHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._BlkAVHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02kCQGJ-Ed-FqczH3ESmRw/method._BlkAVHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQ2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzRWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzRWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzRWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._02tzUmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._BnDOFHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._BnDOFHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._02tzQGJ-Ed-FqczH3ESmRw/method._BnDOFHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GIGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GIGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7f68806
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._036GIGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,13 @@
+
+
+				newChildDescriptors.add
+					(createChildParameter
+						(<%=createFeature.getQualifiedFeatureAccessor()%>,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil")%>.createEntry
+							(<%=delegatedFeature.getQualifiedFeatureAccessor()%>,
+          <%if (createClass.isMapEntry()) { %>
+							 <%=createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.create(<%=createClass.getQualifiedClassifierAccessor()%>))));
+          <%} else {%>
+							 <%=createClass.getGenPackage().getQualifiedFactoryInstanceAccessor()%>.create<%=createClass.getName()%>())));
+          <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.insert" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._Bx7oZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._Bx7oZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._036GEGJ-Ed-FqczH3ESmRw/method._Bx7oZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._03AuQmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._BpSpxHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._BpSpxHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03AuMGJ-Ed-FqczH3ESmRw/method._BpSpxHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfQWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfQWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..703dd2c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._03KfQWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,54 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public void eUnset(int featureID)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+  <%for (GenFeature genFeature : genClass.getEUnsetGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
+      <%if (genFeature.isWrappedFeatureMapType()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().clear();
+      <%} else {%>
+				<%=genFeature.getGetAccessor()%>().clear();
+      <%}%>
+    <%} else if (genFeature.isUnsettable()) {%>
+				unset<%=genFeature.getAccessorName()%>();
+    <%} else if (!genFeature.hasEDefault()) {%>
+				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)null);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+				<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicUnset(this, null, 0);
+    <%} else {%>
+				set<%=genFeature.getAccessorName()%>(<%=genFeature.getEDefault()%>);
+    <%}%>
+				return;
+  <%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+  <%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		super.eUnset(featureID);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%} else {%>
+<%=indentDefaultCase%>		eDynamicUnset(featureID);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._BqoGhHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._BqoGhHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03KfMGJ-Ed-FqczH3ESmRw/method._BqoGhHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpMWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpMWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..4b6981b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._03TpMWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,116 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+    <%for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) {%>
+      <%if (genFeature.isListType() && !genFeature.isUnsettable() && !genFeature.isWrappedFeatureMapType() && !genClass.isField(genFeature) && genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+	@SuppressWarnings("unchecked")
+      <%break; }%>
+    <%}%>
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public boolean eIsSet(int featureID)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) { String safeNameAccessor = genFeature.getSafeName(); if ("featureID".equals(safeNameAccessor)) { safeNameAccessor = "this." + safeNameAccessor; }%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.hasSettingDelegate()) {%>
+    <%if (genFeature.isUnsettable()) {%>
+				return isSet<%=genFeature.getAccessorName()%>();
+    <%} else {%>
+				return <%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);
+    <%}%>
+  <%} else if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
+    <%if (genFeature.isWrappedFeatureMapType()) {%>
+      <%if (genFeature.isVolatile()) {%>
+				return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().isEmpty();
+      <%} else {%>
+				return <%=safeNameAccessor%> != null && !<%=safeNameAccessor%>.featureMap().isEmpty();
+      <%}%>
+    <%} else {%>
+      <%if (genClass.isField(genFeature)) {%>
+				return <%=safeNameAccessor%> != null && !<%=safeNameAccessor%>.isEmpty();
+      <%} else {%>
+        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=safeNameAccessor%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+				return <%=safeNameAccessor%> != null && !<%=safeNameAccessor%>.isEmpty();
+        <%} else {%>
+				return !<%=genFeature.getGetAccessor()%>().isEmpty();
+        <%}%>
+      <%}%>
+    <%}%>
+  <%} else if (genFeature.isUnsettable()) {%>
+				return isSet<%=genFeature.getAccessorName()%>();
+  <%} else if (genFeature.isResolveProxies()) {%>
+    <%if (genClass.isField(genFeature)) {%>
+				return <%=safeNameAccessor%> != null;
+    <%} else {%>
+      <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) != null;
+      <%} else {%>
+				return basicGet<%=genFeature.getAccessorName()%>() != null;
+      <%}%>
+    <%}%>
+  <%} else if (!genFeature.hasEDefault()) {%>
+    <%if (genClass.isField(genFeature)) {%>
+				return <%=safeNameAccessor%> != null;
+    <%} else {%>
+      <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) != null;
+      <%} else {%>
+				return <%=genFeature.getGetAccessor()%>() != null;
+      <%}%>
+    <%}%>
+  <%} else if (genFeature.isPrimitiveType() || genFeature.isEnumType()) {%>
+    <%if (genClass.isField(genFeature)) {%>
+      <%if (genClass.isFlag(genFeature)) {%>
+        <%if (genFeature.isBooleanType()) {%>
+				return ((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0) != <%=genFeature.getEDefault()%>;
+        <%} else {%>
+				return (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != <%=genFeature.getUpperName()%>_EFLAG_DEFAULT;
+        <%}%>
+      <%} else {%>
+				return <%=safeNameAccessor%> != <%=genFeature.getEDefault()%>;
+      <%}%>
+    <%} else {%>
+      <%if (genFeature.isEnumType() && genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getEDefault()%>) != <%=genFeature.getEDefault()%>;
+      <%} else {%>
+				return <%=genFeature.getGetAccessor()%>() != <%=genFeature.getEDefault()%>;
+      <%}%>
+    <%}%>
+  <%} else {//datatype%>
+    <%if (genClass.isField(genFeature)) {%>
+				return <%=genFeature.getEDefault()%> == null ? <%=safeNameAccessor%> != null : !<%=genFeature.getEDefault()%>.equals(<%=safeNameAccessor%>);
+    <%} else {%>
+      <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=safeNameAccessor%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getEDefault()%>);
+				return <%=genFeature.getEDefault()%> == null ? <%=safeNameAccessor%> != null : !<%=genFeature.getEDefault()%>.equals(<%=safeNameAccessor%>);
+      <%} else {%>
+				return <%=genFeature.getEDefault()%> == null ? <%=genFeature.getGetAccessor()%>() != null : !<%=genFeature.getEDefault()%>.equals(<%=genFeature.getGetAccessor()%>());
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eIsSet(featureID);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicIsSet(featureID);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._BsH7VHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._BsH7VHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03TpIGJ-Ed-FqczH3ESmRw/method._BsH7VHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daMWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daMWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._03daMWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._BtAsJHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._BtAsJHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03daIGJ-Ed-FqczH3ESmRw/method._BtAsJHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkFmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkHWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkHWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..4985f19
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._03mkHWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,47 @@
+
+
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((<%=genModel.getImportedName("org.eclipse.emf.edit.provider.ComposeableAdapterFactory")%>)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_feature"),<%=genModel.getNonNLS()%>
+  <%if (genFeature.getPropertyDescription() == null || genFeature.getPropertyDescription().length() == 0) {%>
+				 getString("_UI_PropertyDescriptor_description", "_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_feature", "_UI_<%=genFeature.getGenClass().getName()%>_type"),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+  <%} else {%>
+				 getString("_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_description"),<%=genModel.getNonNLS()%>
+  <%}%>
+				 <%=genFeature.getQualifiedFeatureAccessor()%>,
+				 <%=genFeature.getProperty() == GenPropertyKind.EDITABLE_LITERAL ? "true" : "false"%>,
+				 <%=genFeature.isPropertyMultiLine() ? "true" : "false"%>,
+				 <%=genFeature.isPropertySortChoices() ? "true" : "false"%>,
+  <%if (genFeature.isReferenceType()) {%>
+				 null,
+  <%} else {%>
+				 <%=genModel.getImportedName("org.eclipse.emf.edit.provider.ItemPropertyDescriptor")%>.<%=genFeature.getPropertyImageName()%>,
+  <%}%>
+  <%if (genFeature.getPropertyCategory() == null || genFeature.getPropertyCategory().length() == 0) {%>
+				 null,
+  <%} else {%>
+				 getString("<%=genModel.getPropertyCategoryKey(genFeature.getPropertyCategory())%>"),<%=genModel.getNonNLS()%>
+  <%}%>
+  <%if (genFeature.getPropertyFilterFlags().isEmpty()) {%>
+    <%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF214_VALUE && genFeature.getPropertyEditorFactory() != null && genFeature.getPropertyEditorFactory().trim().length() != 0) {%>
+				 null,
+				 <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(<%=org.eclipse.emf.codegen.ecore.genmodel.impl.Literals.toStringLiteral(genFeature.getPropertyEditorFactory().trim(), genModel)%>)));<%=genModel.getNonNLS()%>
+    <%} else {%>
+				 null));
+    <%}%>
+  <%} else {%>
+				 new String[] {
+    <%/*}*/for (Iterator<String> j = genFeature.getPropertyFilterFlags().iterator(); j.hasNext();) { String filterFlag = j.next();%>
+      <%if (filterFlag != null && filterFlag.length() > 0) {%>
+					"<%=filterFlag%>"<%if (j.hasNext()) {%>,<%}%><%=genModel.getNonNLS()%>
+      <%}%>
+    <%}%>
+    <%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF214_VALUE && genFeature.getPropertyEditorFactory() != null && genFeature.getPropertyEditorFactory().trim().length() != 0) { // {%>
+				 },
+				 <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(<%=org.eclipse.emf.codegen.ecore.genmodel.impl.Literals.toStringLiteral(genFeature.getPropertyEditorFactory().trim(), genModel)%>)));
+    <%} else { // {%>
+				 }));
+    <%}%>
+  <%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._BuWv9XLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._BuWv9XLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03mkEWJ-Ed-FqczH3ESmRw/method._BuWv9XLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVG2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVG2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..1b4a935
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._03wVG2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,49 @@
+
+
+<%if (genModel.isStyleProviders()) {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%>)getStyledText(object)).getString();
+<%} else {%>
+<%if (genClass.isMapEntry()) {%>
+		<%=genClass.getImportedInterfaceName()%><%if (genModel.useGenerics()) {%><?, ?><%}%> <%=genClass.getSafeUncapName()%> = (<%=genClass.getImportedInterfaceName()%><%if (genModel.useGenerics()) {%><?, ?><%}%>)object;
+  <%if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine() && !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {%>
+		return "" + <%=genClass.getSafeUncapName()%>.getKey() + " -> " + <%=genClass.getSafeUncapName()%>.getValue();<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+  <%} else {%>
+    <%if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {%>
+		String key = crop("" + <%=genClass.getSafeUncapName()%>.getKey());<%=genModel.getNonNLS()%>
+    <%} else {%>
+		String key = "" + <%=genClass.getSafeUncapName()%>.getKey();<%=genModel.getNonNLS()%>
+    <%}%>
+    <%if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {%>
+		String value = crop("" + <%=genClass.getSafeUncapName()%>.getValue());<%=genModel.getNonNLS()%>
+    <%} else {%>
+		String value = "" + <%=genClass.getSafeUncapName()%>.getValue();<%=genModel.getNonNLS()%>
+    <%}%>
+		return key + " -> " + value;<%=genModel.getNonNLS()%>
+  <%}%>
+<%} else if (genClass.getLabelFeature() != null) { GenFeature labelFeature = genClass.getLabelFeature();%>
+  <%if (labelFeature.isPrimitiveType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {%>
+		<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%> <%=genClass.getSafeUncapName()%> = (<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object;
+		return getString("_UI_<%=genClass.getName()%>_type") + " " + <%=genClass.getSafeUncapName()%>.<%=genClass.getLabelFeature().getGetAccessor()%>();<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+  <%} else {%>
+    <%if (labelFeature.isStringType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {%>
+      <%if (labelFeature.isPropertyMultiLine()) {%>
+		String label = crop(((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object).<%=labelFeature.getGetAccessor()%>());
+      <%} else {%>
+		String label = ((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object).<%=labelFeature.getGetAccessor()%>();
+      <%}%>
+    <%} else {%>
+      <%if (labelFeature.isSuppressedGetVisibility() || labelFeature.getGenClass().isDynamic()) {%>
+		<%=genModel.getImportedName("java.lang.Object")%> labelValue = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%>)object).eGet(<%=labelFeature.getQualifiedFeatureAccessor()%>);
+      <%} else {%>
+		<%=labelFeature.getRawImportedType()%> labelValue = ((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object).<%=labelFeature.getGetAccessor()%>();
+      <%}%>
+		String label = labelValue == null ? null : labelValue.toString();
+    <%}%>
+		return label == null || label.length() == 0 ?
+			getString("_UI_<%=genClass.getName()%>_type") :<%=genModel.getNonNLS()%>
+			getString("_UI_<%=genClass.getName()%>_type") + " " + label;<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+  <%}%>
+<%} else {%>
+		return getString("_UI_<%=genClass.getName()%>_type");<%=genModel.getNonNLS()%>
+<%}%>
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._BvZRxHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._BvZRxHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._03wVEGJ-Ed-FqczH3ESmRw/method._BvZRxHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n8GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n8GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..f2a29e1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._048n8GJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,13 @@
+
+
+				newChildDescriptors.add
+					(createChildParameter
+						(<%=createFeature.getQualifiedFeatureAccessor()%>,
+        <%if (createFeature.isEnumBasedType()) {%>
+						 <%=createFeature.getTypeGenEnum().getStaticValue(createFeature.getEcoreFeature().getDefaultValueLiteral())%>));
+        <%} else if (createFeature.isStringBasedType()) {%>
+						 <%=createFeature.getCreateChildValueLiteral()%>));<%=genModel.getNonNLS()%>
+        <%} else { String literal = createFeature.getCreateChildValueLiteral();%>
+						 <%=createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.createFromString(<%=createDataType.getQualifiedClassifierAccessor()%>, <%=literal%>)));<%if (literal != null) {%><%=genModel.getNonNLS()%><%} else {%> // TODO: ensure this is a valid literal value<%}%>
+        <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.insert" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._B_otNHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._B_otNHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._048n4GJ-Ed-FqczH3ESmRw/method._B_otNHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBEGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBEGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._04NBEGJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._B2Z4tHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._B2Z4tHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04NBAGJ-Ed-FqczH3ESmRw/method._B2Z4tHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyEGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyEGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e60fe31
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._04WyEGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,15 @@
+
+
+				newChildDescriptors.add
+					(createChildParameter
+						(<%=createFeature.getQualifiedFeatureAccessor()%>,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil")%>.createEntry
+							(<%=delegatedFeature.getQualifiedFeatureAccessor()%>,
+          <%if (delegatedFeature.isEnumBasedType()) {%>
+							 <%=delegatedFeature.getTypeGenEnum().getStaticValue(delegatedFeature.getEcoreFeature().getDefaultValueLiteral())%>)));
+          <%} else if (delegatedFeature.isStringBasedType()) {%>
+							 <%=delegatedFeature.getCreateChildValueLiteral()%>)));<%=genModel.getNonNLS()%>
+          <%} else { String literal = delegatedFeature.getCreateChildValueLiteral();%>
+							 <%=createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.createFromString(<%=createDataType.getQualifiedClassifierAccessor()%>, <%=literal%>))));<%if (literal != null) {%><%=genModel.getNonNLS()%><%} else {%> // TODO: ensure this is a valid literal value<%}%>
+          <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.insert" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._B3vVdHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._B3vVdHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04WyAGJ-Ed-FqczH3ESmRw/method._B3vVdHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f782J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f782J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f782J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f78mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f78mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f78mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f79WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f79WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f79WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f8AGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f8AGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._04f8AGJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._B4yeVHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._B4yeVHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04f78GJ-Ed-FqczH3ESmRw/method._B4yeVHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ps9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ptAGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ptAGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..da8f180
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._04ptAGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,11 @@
+
+
+				newChildDescriptors.add
+					(createChildParameter
+						(<%=createFeature.getQualifiedFeatureAccessor()%>,
+        <%if (createClass.isMapEntry()) { %>
+						 <%=createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.create(<%=createClass.getQualifiedClassifierAccessor()%>)));
+        <%} else {%>
+						 <%=createClass.getGenPackage().getQualifiedFactoryInstanceAccessor()%>.create<%=createClass.getName()%>()));
+        <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.insert" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._B63h9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._B63h9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04ps8GJ-Ed-FqczH3ESmRw/method._B63h9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y242J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y242J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y242J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y24mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y24mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y24mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y25WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y25WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y25WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y28GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y28GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._04y28GJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._B-caZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._B-caZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._04y24GJ-Ed-FqczH3ESmRw/method._B-caZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_w2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_w2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_w2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_wmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_wmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_wmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_xWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_xWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_xWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_y2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_y2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._051_y2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._CCU01HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._CCU01HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._051_wGJ-Ed-FqczH3ESmRw/method._CCU01HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT02J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT02J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT02J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT1WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT1WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT1WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT4GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT4GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._05ZT4GJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._CBIiBHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._CBIiBHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._05ZT0GJ-Ed-FqczH3ESmRw/method._CBIiBHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MQ2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MRmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MXGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MXGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..1800b0a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._08-MXGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,13 @@
+
+
+<%for (GenPackage aGenPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+  <%if (!aGenPackage.getGenClasses().isEmpty() && aGenPackage.getGenModel().hasEditSupport()) {%>
+		adapterFactory.addAdapterFactory(new <%=aGenPackage.getImportedItemProviderAdapterFactoryClassName()%>());
+  <%}%>
+<%}%>
+<%for (GenPackage aGenPackage : genModel.getAllUsedGenPackagesWithClassifiers()) {%>
+  <%if (!aGenPackage.getGenClasses().isEmpty() && aGenPackage.getGenModel().hasEditSupport()) {%>
+		adapterFactory.addAdapterFactory(new <%=aGenPackage.getImportedItemProviderAdapterFactoryClassName()%>());
+  <%}%>
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.editor.call.Editor.Editor.addItemProviderFactories.insert" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,importedOperationClassName:importedOperationClassName,operationMethodName:operationMethodName,_ArrayListOfObject:_ArrayListOfObject,_ArrayListOfSelectionChangedListener:_ArrayListOfSelectionChangedListener,_CollectionOfSelectionChangedListener:_CollectionOfSelectionChangedListener,_ListOfResource:_ListOfResource,_ArrayListOfResource:_ArrayListOfResource,_CollectionOfResource:_CollectionOfResource,_MapOfResourceToDiagnostic:_MapOfResourceToDiagnostic,_HashMapOfResourceToBoolean:_HashMapOfResourceToBoolean,_MapOfObjectToObject:_MapOfObjectToObject,_HashMapOfObjectToObject:_HashMapOfObjectToObject,_LinkedHashMapOfResourceToDiagnostic:_LinkedHashMapOfResourceToDiagnostic,_CollectionOfAnything:_CollectionOfAnything,_ListOfAnything:_ListOfAnything,useExtendedLabelProvider:useExtendedLabelProvider,useStyledLabelProvider:useStyledLabelProvider,_AdapterFactoryLabelProvider:_AdapterFactoryLabelProvider,_DelegatingAdapterFactoryLabelProvider:_DelegatingAdapterFactoryLabelProvider,_DecoratingColumLabelProvider:_DecoratingColumLabelProvider,_DiagnosticDecorator:_DiagnosticDecorator,_ArrayListOfString:_ArrayListOfString,_ListOfString:_ListOfString,_ListOfPropertySheetPage:_ListOfPropertySheetPage,_ArrayListOfPropertySheetPage:_ArrayListOfPropertySheetPage"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._CC6qtXLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._CC6qtXLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._08-MQWJ-Ed-FqczH3ESmRw/method._CC6qtXLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kK2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kK2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..8d82bd4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._093kK2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,23 @@
+
+
+
+	/**
+	 * Tests the '{@link <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' feature getter.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%>()
+      <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+      <%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/getGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+      <%}%>
+      <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	public void test<%=genModel.capName(genFeature.getGetAccessor())%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/getGenFeature.todo.override.javajetinc%>
+	}
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._CKEblHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._CKEblHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._093kIGJ-Ed-FqczH3ESmRw/method._CKEblHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHS2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHS2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._09RHS2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._CHY7BHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._CHY7BHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09RHMGJ-Ed-FqczH3ESmRw/method._CHY7BHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCJmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCLGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCLGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..df68dc1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._09kCLGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,17 @@
+
+
+  <%if (genFeature.isTested()) {%>
+    <%if (genFeature.isGet() && !genFeature.isSuppressedGetVisibility()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.getGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/getGenFeature.override.javajetinc%>
+    <%}%>
+    <%if (genFeature.isSet() && !genFeature.isSuppressedSetVisibility()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.setGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/setGenFeature.override.javajetinc%>
+    <%}%>
+    <%if (genFeature.isUnset() && !genFeature.isSuppressedUnsetVisibility()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/unsetGenFeature.override.javajetinc%>
+    <%}%>
+    <%if (genFeature.isIsSet() && !genFeature.isSuppressedIsSetVisibility()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/isSetGenFeature.override.javajetinc%>
+    <%}%>
+  <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._CIbc1XLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._CIbc1XLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._09kCIWJ-Ed-FqczH3ESmRw/method._CIbc1XLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA62J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA62J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..482db9e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._0_NA62J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,23 @@
+
+
+
+	/**
+	 * Tests the '{@link <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#unset<%=genFeature.getAccessorName()%>() <em>unset<%=genFeature.getAccessorName()%>()</em>}' method.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#unset<%=genFeature.getAccessorName()%>()
+      <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+      <%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/unsetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+      <%}%>
+      <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	public void testUnset<%=genFeature.getAccessorName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.unsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/unsetGenFeature.todo.override.javajetinc%>
+	}
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._CUDeBHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._CUDeBHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0_NA4GJ-Ed-FqczH3ESmRw/method._CUDeBHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGU2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGU2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGU2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGUWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGYGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGYGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..9800070
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method._0jpGYGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,242 @@
+
+
+    <%if (genFeature.hasSettingDelegate()) {%>
+	/**
+	 * The cached setting delegate for the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Internal.SettingDelegate <%=genFeature.getUpperName()%>__ESETTING_DELEGATE = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Internal)<%=genFeature.getQualifiedFeatureAccessor()%>).getSettingDelegate();
+
+    <%} else if (genFeature.isListType() || genFeature.isReferenceType()) {%>
+      <%if (genClass.isField(genFeature)) {%>
+	/**
+	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected <%=genFeature.getImportedInternalType(genClass)%> <%=genFeature.getSafeName()%>;
+
+      <%}%>
+      <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String rawListItemType = genFeature.getRawListItemType(genClass); int index = rawListItemType.indexOf('['); String head = rawListItemType; String tail = ""; if (index != -1) { head = rawListItemType.substring(0, index); tail = rawListItemType.substring(index); } %>
+	/**
+	 * The empty value for the '{@link #<%=genFeature.getGetArrayAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' array accessor.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetArrayAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (genFeature.getQualifiedListItemType(genClass).contains("<") || genFeature.getArrayItemType(genClass).contains("<")) {%>
+	@SuppressWarnings("rawtypes")
+        <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final <%=rawListItemType%>[] <%=genFeature.getUpperName()%>_EEMPTY_ARRAY = new <%=head%> [0]<%=tail%>;
+
+      <%}%>
+    <%} else {%>
+      <%if (genFeature.hasEDefault() && (!genFeature.isVolatile() || !genModel.isReflectiveDelegation() && (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable()))) { String staticDefaultValue = genFeature.getStaticDefaultValue();%>
+	/**
+	 * The default value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (genModel.useGenerics() && genFeature.isListDataType() && genFeature.isSetDefaultValue()) {%>
+	@SuppressWarnings("unchecked")
+        <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final <%=genFeature.getImportedType(genClass)%> <%=genFeature.getEDefault()%><%if ("".equals(staticDefaultValue)) {%>; // TODO The default value literal "<%=genFeature.getEcoreFeature().getDefaultValueLiteral()%>" is not valid.<%} else {%> = <%=staticDefaultValue%>;<%=genModel.getNonNLS(staticDefaultValue)%><%}%>
+
+      <%}%>
+      <%if (genClass.isField(genFeature)) {%>
+        <%if (genClass.isFlag(genFeature)) { int flagIndex = genClass.getFlagIndex(genFeature);%>
+          <%if (flagIndex > 31 && flagIndex % 32 == 0) {%>
+	/**
+	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=genClass.getFlagsField(genFeature)%> = 0;
+
+          <%}%>
+          <%if (genFeature.isEnumType()) {%>
+	/**
+	 * The offset of the flags representing the value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_EFLAG_OFFSET = <%=flagIndex % 32%>;
+
+	/**
+	 * The flags representing the default value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_EFLAG_DEFAULT = <%if (isJDK50) {%><%=genFeature.getEDefault()%>.ordinal()<%} else {%><%=genFeature.getImportedType(genClass)%>.VALUES.indexOf(<%=genFeature.getEDefault()%>)<%}%> << <%=genFeature.getUpperName()%>_EFLAG_OFFSET;
+
+	/**
+	 * The array of enumeration values for '{@link <%=genFeature.getImportedType(genClass)%> <%=genFeature.getTypeGenClassifier().getFormattedName()%>}'
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	private static final <%=genFeature.getImportedType(genClass)%>[] <%=genFeature.getUpperName()%>_EFLAG_VALUES = <%if (isJDK50) {%><%=genFeature.getImportedType(genClass)%>.values()<%} else {%>(<%=genFeature.getImportedType(genClass)%>[])<%=genFeature.getImportedType(genClass)%>.VALUES.toArray(new <%=genFeature.getImportedType(genClass)%>[<%=genFeature.getImportedType(genClass)%>.VALUES.size()])<%}%>;
+
+          <%}%>
+	/**
+	 * The flag<%=genClass.getFlagSize(genFeature) > 1 ? "s" : ""%> representing the value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_EFLAG = <%=genClass.getFlagMask(genFeature)%> << <%if (genFeature.isEnumType()) {%><%=genFeature.getUpperName()%>_EFLAG_OFFSET<%} else {%><%=flagIndex % 32%><%}%>;
+
+        <%} else {%>
+	/**
+	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected <%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%><%if (genFeature.hasEDefault()) {%> = <%=genFeature.getEDefault()%><%}%>;
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (genClass.isESetField(genFeature)) {%>
+      <%if (genClass.isESetFlag(genFeature)) { int flagIndex = genClass.getESetFlagIndex(genFeature);%>
+        <%if (flagIndex > 31 && flagIndex % 32 == 0) {%>
+	/**
+	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=genClass.getESetFlagsField(genFeature)%> = 0;
+
+        <%}%>
+	/**
+	 * The flag representing whether the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_ESETFLAG = 1 << <%=flagIndex % 32 %>;
+
+      <%} else {%>
+	/**
+	 * This is true if the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected boolean <%=genFeature.getUncapName()%>ESet;
+
+      <%}%>
+    <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.declaredFieldGenFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method.__Dly1XLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method.__Dly1XLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jpGTmJ-Ed-FqczH3ESmRw/method.__Dly1XLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method._0jyQQmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method.__Fq2dHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method.__Fq2dHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0jyQMGJ-Ed-FqczH3ESmRw/method.__Fq2dHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyQWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyQWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d5092be
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method._0kFyQWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,26 @@
+
+
+<%if (isImplementation && (genModel.getFeatureDelegation() == GenDelegationKind.REFLECTIVE_LITERAL || genModel.isDynamicDelegation()) && (genClass.getClassExtendsGenClass() == null || (genClass.getClassExtendsGenClass().getGenModel().getFeatureDelegation() != GenDelegationKind.REFLECTIVE_LITERAL && !genClass.getClassExtendsGenClass().getGenModel().isDynamicDelegation()))) {%>
+  <%if (genClass.hasStaticFeatures()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final int ESTATIC_FEATURE_COUNT = <%=genClass.getClassExtendsGenClass() == null ? 0 : genClass.getClassExtendsGenClass().getAllGenFeatures().size()%>;
+
+  <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected int eStaticFeatureCount()
+	{
+		return <%=genClass.getClassExtendsGenClass() == null ? "0" : genClass.hasStaticFeatures() ? "ESTATIC_FEATURE_COUNT" : Integer.toString(genClass.getClassExtendsGenClass().getAllGenFeatures().size())%>;
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method.__IDcFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method.__IDcFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kFyMGJ-Ed-FqczH3ESmRw/method.__IDcFHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8I2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8I2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8I2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8ImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8ImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8ImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8JWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8JWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8JWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8MmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8MmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..2a8838e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method._0kO8MmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,161 @@
+
+
+  <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String arrayElementType = genFeature.getArrayItemType(genClass);%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (!isImplementation) {%>
+	<%=arrayElementType%>[] <%=genFeature.getGetArrayAccessor()%>();
+
+    <%} else {%>
+    <%if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public <%=arrayElementType%>[] <%=genFeature.getGetArrayAccessor()%>()
+	{
+      <%if (genFeature.isVolatile()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>();
+		if (list.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+      <%} else {%>
+		if (<%=genFeature.getSafeName()%> == null || <%=genFeature.getSafeName()%>.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getSafeName()%>;
+      <%}%>
+		list.shrink();
+		return (<%=arrayElementType%>[])list.data();
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	<%=genFeature.getListItemType(genClass)%> get<%=genFeature.getAccessorName()%>(int index);
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public <%=genFeature.getListItemType(genClass)%> get<%=genFeature.getAccessorName()%>(int index)
+	{
+		return <%if (!genModel.useGenerics()) {%>(<%=genFeature.getListItemType(genClass)%>)<%}%><%=genFeature.getGetAccessor()%>().get(index);
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	int get<%=genFeature.getAccessorName()%>Length();
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public int get<%=genFeature.getAccessorName()%>Length()
+	{
+      <%if (genFeature.isVolatile()) {%>
+		return <%=genFeature.getGetAccessor()%>().size();
+      <%} else {%>
+		return <%=genFeature.getSafeName()%> == null ? 0 : <%=genFeature.getSafeName()%>.size();
+      <%}%>
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType(genClass)%>[] new<%=genFeature.getCapName()%>);
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType(genClass)%>[] new<%=genFeature.getCapName()%>)
+	{
+		((<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).setData(new<%=genFeature.getCapName()%>.length, new<%=genFeature.getCapName()%>);
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType(genClass)%> element);
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType(genClass)%> element)
+	{
+		<%=genFeature.getGetAccessor()%>().set(index, element);
+	}
+
+    <%}%>
+  <%}%>
+  <%if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/getGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicGetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicSetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/setGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class.basicUnsetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/unsetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/isSetGenFeature.override.javajetinc%>
+  <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method.__LCepHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method.__LCepHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kO8IGJ-Ed-FqczH3ESmRw/method.__LCepHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3E2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3E2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3E2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3EmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3EmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3EmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3FWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3FWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3FWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3ImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3ImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..01cd65f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method._0kh3ImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,145 @@
+
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/getGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+<%if (!isImplementation) {%>
+	<%=genFeature.getImportedType(genClass)%> <%=genFeature.getGetAccessor()%>();
+
+<%} else {%>
+  <%if (genModel.useGenerics() && ((genFeature.isContainer() || genFeature.isResolveProxies()) && !genFeature.isListType() && genFeature.isUncheckedCast(genClass) || genFeature.isListType() && !genFeature.isFeatureMapType() && (genModel.isReflectiveDelegation() || genModel.isVirtualDelegation() || (genModel.isDynamicDelegation() && !genFeature.isVolatile())) || genFeature.isListDataType() && genFeature.hasDelegateFeature() || genFeature.isListType() && genFeature.hasSettingDelegate())) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genClass.hasCollidingGetAccessorOperation(genFeature) && !genFeature.isSuppressedGetVisibility()) {%>
+	@Override
+  <%}%>
+	public <%=genFeature.getImportedType(genClass)%> <%=genFeature.getGetAccessor()%><%if (genClass.hasCollidingGetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)eDynamicGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>, true, <%=!genFeature.isEffectiveSuppressEMFTypes()%>)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+      <%if (genFeature.hasGetterBody()) {%>
+		<%=genFeature.getGetterBody(genModel.getIndentation(stringBuffer))%>
+      <%} else {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)eGet(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+      <%}%>
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicGet(this, null, 0, true, false)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> == null)
+		{
+        <%if (genModel.isVirtualDelegation()) {%>
+			eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>);
+        <%} else {%>
+			<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
+        <%}%>
+		}
+		return <%=genFeature.getSafeName()%><%=genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : ""%>;
+      <%} else if (genFeature.isContainer()) {%>
+		if (eContainerFeatureID() != <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) return null;
+		return (<%=genFeature.getImportedType(genClass)%>)<%if (genFeature.isResolveProxies()) {%>eContainer<%} else {%>eInternalContainer<%}%>();
+      <%} else {%>
+        <%if (genFeature.isResolveProxies()) {%>
+          <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%><%if (genFeature.hasEDefault()) {%>, <%=genFeature.getEDefault()%><%}%>);
+          <%}%>
+		if (<%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeNameAsEObject()%>.eIsProxy())
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> old<%=genFeature.getCapName()%> = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), false)%>;
+			<%=genFeature.getSafeName()%> = <%=genFeature.getNonEObjectInternalTypeCast(genClass)%>eResolveProxy(old<%=genFeature.getCapName()%>);
+			if (<%=genFeature.getSafeName()%> != old<%=genFeature.getCapName()%>)
+			{
+          <%if (genFeature.isEffectiveContains()) {%>
+				<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> new<%=genFeature.getCapName()%> = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), false)%>;
+          <%if (!genFeature.isBidirectional()) {%>
+				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = old<%=genFeature.getCapName()%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, null);
+          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs =  old<%=genFeature.getCapName()%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, null);
+          <%}%>
+				if (new<%=genFeature.getCapName()%>.eInternalContainer() == null)
+				{
+          <%if (!genFeature.isBidirectional()) {%>
+					msgs = new<%=genFeature.getCapName()%>.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+					msgs =  new<%=genFeature.getCapName()%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+          <%}%>
+				}
+				if (msgs != null) msgs.dispatch();
+          <%} else if (genModel.isVirtualDelegation()) {%>
+				eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%>);
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+				if (eNotificationRequired())
+					eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.RESOLVE, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, old<%=genFeature.getCapName()%>, <%=genFeature.getSafeName()%>));
+          <%}%>
+			}
+		}
+        <%}%>
+        <%if (!genFeature.isResolveProxies() && genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%><%if (genFeature.hasEDefault()) {%>, <%=genFeature.getEDefault()%><%}%>);
+        <%} else if (genClass.isFlag(genFeature)) {%>
+          <%if (genFeature.isBooleanType()) {%>
+		return (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
+          <%} else {%>
+		return <%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET];
+          <%}%>
+        <%} else {%>
+		return <%=genFeature.getSafeName()%>;
+        <%}%>
+      <%}%>
+    <%} else {//volatile%>
+      <%if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = basicGet<%=genFeature.getAccessorName()%>();
+		return <%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeNameAsEObject()%>.eIsProxy() ? <%=genFeature.getNonEObjectInternalTypeCast(genClass)%>eResolveProxy(<%=genFeature.getAsInternalEObject(genFeature.getSafeName(), false)%>) : <%=genFeature.getSafeName()%>;
+      <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+        <%if (genFeature.isFeatureMapType()) {%>
+        <%String featureMapEntryTemplateArgument = isJDK50 ? "<" + genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap") + ".Entry>" : "";%>
+          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return new <%=genFeature.getImportedEffectiveFeatureMapWrapperClass()%>((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().<%=featureMapEntryTemplateArgument%>list(<%=genFeature.getQualifiedFeatureAccessor()%>));
+          <%} else {%>
+		return (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)get<%=delegateFeature.getAccessorName()%>().<%=featureMapEntryTemplateArgument%>list(<%=genFeature.getQualifiedFeatureAccessor()%>);
+          <%}%>
+        <%} else if (genFeature.isListType()) {%>
+          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().list(<%=genFeature.getQualifiedFeatureAccessor()%>);
+          <%} else {%>
+		return get<%=delegateFeature.getAccessorName()%>().list(<%=genFeature.getQualifiedFeatureAccessor()%>);
+          <%}%>
+        <%} else {%>
+          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%><%if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType()) {%>(<%=genFeature.getObjectType(genClass)%>)<%}%>((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+          <%} else {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%><%if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType()) {%>(<%=genFeature.getObjectType(genClass)%>)<%}%>get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+          <%}%>
+        <%}%>
+      <%} else if (genClass.getGetAccessorOperation(genFeature) != null) {%>
+		<%=genClass.getGetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer))%>
+      <%} else if (genFeature.hasGetterBody()) {%>
+		<%=genFeature.getGetterBody(genModel.getIndentation(stringBuffer))%>
+      <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/getGenFeature.todo.override.javajetinc%>
+      <%}%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method.__MrdZHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method.__MrdZHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kh3EGJ-Ed-FqczH3ESmRw/method.__MrdZHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..408d299
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method._0kroImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,65 @@
+
+
+	/**
+	 * Returns the value of the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%>.
+    <%if (genFeature.isListType() && genFeature.getEcoreFeature().getEGenericType().getETypeParameter() == null) {%>
+      <%if (genFeature.isMapType()) { GenFeature keyFeature = genFeature.getMapEntryTypeGenClass().getMapEntryKeyFeature(); GenFeature valueFeature = genFeature.getMapEntryTypeGenClass().getMapEntryValueFeature(); %>
+	 * The key is of type <%if (keyFeature.isListType()) {%>list of {@link <%=keyFeature.getQualifiedListItemType(genClass)%>}<%} else {%>{@link <%=keyFeature.getType(genClass)%>}<%}%>,
+	 * and the value is of type <%if (valueFeature.isListType()) {%>list of {@link <%=valueFeature.getQualifiedListItemType(genClass)%>}<%} else {%>{@link <%=valueFeature.getType(genClass)%>}<%}%>,
+      <%} else if (!genFeature.isWrappedFeatureMapType() && !(genModel.isSuppressEMFMetaData() && "org.eclipse.emf.ecore.EObject".equals(genFeature.getQualifiedListItemType(genClass)))) {
+String typeName = genFeature.getQualifiedListItemType(genClass); String head = typeName; String tail = ""; int index = typeName.indexOf('<'); if (index == -1) { index = typeName.indexOf('['); } 
+if (index != -1) { head = typeName.substring(0, index); tail = "<code>" + CodeGenUtil.xmlEscapeEncode(typeName.substring(index)) + "</code>"; }
+%>
+	 * The list contents are of type {@link <%=head%>}<%=tail%>.
+      <%}%>
+    <%} else if (genFeature.isSetDefaultValue()) {%>
+	 * The default value is <code><%=genFeature.getDefaultValue()%></code>.
+    <%}%>
+    <%if (genFeature.getTypeGenEnum() != null) {%>
+	 * The literals are from the enumeration {@link <%=genFeature.getTypeGenEnum().getQualifiedName()%>}.
+    <%}%>
+    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
+      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
+	 * It is bidirectional and its opposite is '{@link <%=reverseGenFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%> <em><%=reverseGenFeature.getFormattedName()%></em>}'.
+      <%}%>
+    <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasDocumentation()) {%>
+	 * <!-- begin-model-doc -->
+	 * <%=genFeature.getDocumentation(genModel.getIndentation(stringBuffer))%>
+	 * <!-- end-model-doc -->
+    <%}%>
+	 * @return the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
+    <%if (genFeature.getTypeGenEnum() != null) {%>
+	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
+    <%}%>
+    <%if (genFeature.isUnsettable()) {%>
+      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
+	 * @see #isSet<%=genFeature.getAccessorName()%>()
+      <%}%>
+      <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
+	 * @see #unset<%=genFeature.getAccessorName()%>()
+      <%}%>
+    <%}%>
+    <%if (genFeature.isChangeable() && !genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
+	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawImportedBoundType()%>)
+    <%}%>
+    <%if (!genModel.isSuppressEMFMetaData()) {%>
+	 * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genFeature.getFeatureAccessorName()%>()
+    <%}%>
+    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
+      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
+	 * @see <%=reverseGenFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%>
+      <%}%>
+    <%}%>
+    <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genFeature.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+    <%} else {%>
+	 *        <%=modelInfo%>
+    <%}} if (first) {%>
+	 * @model
+    <%}}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method.__Nt_NHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method.__Nt_NHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0kroEGJ-Ed-FqczH3ESmRw/method.__Nt_NHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l3642J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l3642J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l3642J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l364mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l364mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l364mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l365WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l365WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l365WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l368mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l368mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method._0l368mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method.__XjQpHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method.__XjQpHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0l364GJ-Ed-FqczH3ESmRw/method.__XjQpHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method._0lIUEmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method.__O6SBHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method.__O6SBHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUAGJ-Ed-FqczH3ESmRw/method.__O6SBHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUF2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUF2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUF2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUFmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUFmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUFmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUGWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUGWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lIUGWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lSFCmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lSFCmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method._0lSFCmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method.__P9a5HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method.__P9a5HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lIUFGJ-Ed-FqczH3ESmRw/method.__P9a5HLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lSFDmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lSFDmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lSFDmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8GJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO8mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO_2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO_2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method._0lbO_2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method.__RvjlHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method.__RvjlHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lSFDGJ-Ed-FqczH3ESmRw/method.__RvjlHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPBmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..fa0522b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method._0lbPE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,9 @@
+
+
+		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// Ensure that you remove @generated or mark it @generated NOT
+        <%if (genFeature.isListType()) {%>
+		// The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+		// so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.<%if (genFeature.isMapType()) {%>EcoreEMap<%} else if (genFeature.isFeatureMapType()) {%>BasicFeatureMap<%} else {%>EcoreEList<%}%> should be used.
+        <%}%>
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method.__TiTVHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method.__TiTVHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lbPAWJ-Ed-FqczH3ESmRw/method.__TiTVHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0lk_9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0llAAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0llAAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..121aab7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method._0llAAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,45 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicGetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+	public <%=genFeature.getImportedType(genClass)%> basicGet<%=genFeature.getAccessorName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)eDynamicGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>, false, <%=!genFeature.isEffectiveSuppressEMFTypes()%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicGet(this, null, 0, false, false)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+    <%} else if (genFeature.isContainer()) {%>
+		if (eContainerFeatureID() != <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) return null;
+		return (<%=genFeature.getImportedType(genClass)%>)eInternalContainer();
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genModel.isVirtualDelegation()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+      <%} else {%>
+		return <%=genFeature.getSafeName()%>;
+      <%}%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
+      <%} else {%>
+		return (<%=genFeature.getImportedType(genClass)%>)get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
+      <%}%>
+    <%} else if (genFeature.hasGetterBody()) {%>
+		<%=genFeature.getGetterBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicGetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicGetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method.__VBhFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method.__VBhFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0lk_8GJ-Ed-FqczH3ESmRw/method.__VBhFHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6c0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6c0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..96f1ac1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6c0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,8 @@
+
+
+		// TODO: implement this method to set the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// -> this method is automatically invoked to keep the containment relationship in synch
+		// -> do not modify other features
+		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cw2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cw2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cw2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cxWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cxWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method._0m6cxWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method.__hsEFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method.__hsEFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0m6cwGJ-Ed-FqczH3ESmRw/method.__hsEFHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method._0mBr8mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method.__ZDFdHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method.__ZDFdHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mBr4GJ-Ed-FqczH3ESmRw/method.__ZDFdHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK102J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK102J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK102J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK10mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK10mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK10mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK11WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK11WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK11WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK14mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK14mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..b72a863
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method._0mK14mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,6 @@
+
+
+		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// -> do not perform proxy resolution
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method.__a1OJHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method.__a1OJHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mK10GJ-Ed-FqczH3ESmRw/method.__a1OJHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm02J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm02J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm02J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm1WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm1WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm1WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..9a89e4d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method._0mUm4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,77 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedInternalType(genClass)%> new<%=genFeature.getCapName()%>, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+    <%if (genFeature.isContainer()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		msgs = eBasicSetContainer(<%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false)%>, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		return msgs;
+    <%} else if (genModel.isDynamicDelegation()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		msgs = eDynamicInverseAdd(<%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false)%>, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		return msgs;
+    <%} else if (!genFeature.isVolatile()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+      <%if (genModel.isVirtualDelegation()) {%>
+		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>);
+      <%} else {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%>;
+      <%}%>
+      <%if (genFeature.isUnsettable()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
+          <%}%>
+        <%} else if (genClass.isESetFlag(genFeature)) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+          <%if (!genModel.isSuppressNotification()) {%>
+		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
+          <%}%>
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+          <%}%>
+		<%=genFeature.getUncapName()%>ESet = true;
+        <%}%>
+      <%}%>
+      <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+		{
+        <%if (genFeature.isUnsettable()) {%>
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>);
+        <%} else {%>
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>);
+        <%}%>
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+      <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		return msgs;
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
+      <%} else {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
+      <%}%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicSetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method.__d9apHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method.__d9apHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mUm0GJ-Ed-FqczH3ESmRw/method.__d9apHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnh0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnh0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnh0mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhw2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhw2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhw2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhxWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhxWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method._0mnhxWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method.__fJtdHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method.__fJtdHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mnhwGJ-Ed-FqczH3ESmRw/method.__fJtdHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6csWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6csWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6csWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6cvmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6cvmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0m6cvmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS12J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS12J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS12J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS1mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS1mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method._0mxS1mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method.__gysNHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method.__gysNHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxS1GJ-Ed-FqczH3ESmRw/method.__gysNHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxS0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxS0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxS0mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSw2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSw2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSw2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSxWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSxWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method._0mxSxWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method.__gDFVHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method.__gDFVHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0mxSwGJ-Ed-FqczH3ESmRw/method.__gDFVHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-s2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-s2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-s2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-smJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-smJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-smJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-tWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-tWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-tWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-wmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-wmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..72f32cd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method._0nN-wmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,181 @@
+
+
+<%if (isInterface) { %>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/setGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) { %>
+	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType(genClass)%> value);
+
+<%} else { GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genClass.hasCollidingSetAccessorOperation(genFeature) && !genFeature.isSuppressedSetVisibility()) {%>
+	@Override
+  <%}%>
+	public void set<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingSetAccessorOperation(genFeature)) {%>_<%}%>(<%=genFeature.getImportedType(genClass)%> <%=setAccessorOperation == null ? "new" + genFeature.getCapName() : setAccessorOperation.getGenParameters().get(0).getName()%>)
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicSetGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		eDynamicSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicSetGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+		eSet(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicSet(this, null, 0, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isContainer()) { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+		if (new<%=genFeature.getCapName()%> != eInternalContainer() || (eContainerFeatureID() != <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%> && new<%=genFeature.getCapName()%> != null))
+		{
+			if (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil")%>.isAncestor(this, <%=genFeature.getEObjectCast()%>new<%=genFeature.getCapName()%>))
+				throw new <%=genModel.getImportedName("java.lang.IllegalArgumentException")%>("Recursive containment not allowed for " + toString());<%=genModel.getNonNLS()%>
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (new<%=genFeature.getCapName()%> != null)
+				msgs = <%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true)%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+        <%if (!genModel.isSuppressNotification()) {%>
+		else if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
+        <%}%>
+      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (new<%=genFeature.getCapName()%> != <%=genFeature.getSafeName()%>)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
+			if (<%=genFeature.getSafeName()%> != null)
+        <%if (!genFeature.isBidirectional()) {%>
+				msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+			if (new<%=genFeature.getCapName()%> != null)
+				msgs = <%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true)%>.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+				msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+			if (new<%=genFeature.getCapName()%> != null)
+				msgs = <%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true)%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+        <%}%>
+			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+        <%if (genFeature.isUnsettable()) {%>
+		else
+		{
+          <%if (genModel.isVirtualDelegation()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+          <%} else if (genClass.isESetFlag(genFeature)) {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+            <%}%>
+			<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
+          <%} else {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+            <%}%>
+			<%=genFeature.getUncapName()%>ESet = true;
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+			if (eNotificationRequired())
+				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>, !old<%=genFeature.getCapName()%>ESet));
+          <%}%>
+		}
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		else if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
+          <%}%>
+        <%}%>
+      <%} else {%>
+        <%if (genClass.isFlag(genFeature)) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
+            <%} else {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET];
+            <%}%>
+          <%}%>
+          <%if (genFeature.isBooleanType()) {%>
+		if (new<%=genFeature.getCapName()%>) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
+          <%} else {%>
+		if (new<%=genFeature.getCapName()%> == null) new<%=genFeature.getCapName()%> = <%=genFeature.getUpperName()%>_EDEFAULT;
+		<%=genClass.getFlagsField(genFeature)%> = <%=genClass.getFlagsField(genFeature)%> & ~<%=genFeature.getUpperName()%>_EFLAG | <%if (isJDK50) {%>new<%=genFeature.getCapName()%>.ordinal()<%} else {%><%=genFeature.getImportedType(genClass)%>.VALUES.indexOf(new<%=genFeature.getCapName()%>)<%}%> << <%=genFeature.getUpperName()%>_EFLAG_OFFSET;
+          <%}%>
+        <%} else {%>
+          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+            <%}%>
+          <%}%>
+          <%if (genFeature.isEnumType()) {%>
+            <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getEDefault()%> : new<%=genFeature.getCapName()%>;
+            <%} else {%>
+		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getEDefault()%> : new<%=genFeature.getCapName()%>;
+            <%}%>
+          <%} else {%>
+            <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
+            <%} else {%>
+		<%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
+            <%}%>
+          <%}%>
+          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%>);
+          <%}%>
+        <%}%>
+        <%if (genFeature.isUnsettable()) {%>
+          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
+          <%} else if (genClass.isESetFlag(genFeature)) {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+            <%}%>
+		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
+          <%} else {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+            <%}%>
+		<%=genFeature.getUncapName()%>ESet = true;
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? <%=genFeature.getEDefault()%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>));
+          <%}%>
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? <%=genFeature.getEDefault()%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>));
+          <%}%>
+        <%}%>
+      <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+      <%} else {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+      <%}%>
+    <%} else if (setAccessorOperation != null) {%>
+		<%=setAccessorOperation.getBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.TODO.override" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/setGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method.__jLR1HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method.__jLR1HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nN-sGJ-Ed-FqczH3ESmRw/method.__jLR1HLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIo2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIo2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIo2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..3dba729
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method._0nXIsmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,25 @@
+
+
+	/**
+	 * Sets the value of the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
+    <%if (genFeature.isEnumType()) {%>
+	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
+    <%}%>
+    <%if (genFeature.isUnsettable()) {%>
+      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
+	 * @see #isSet<%=genFeature.getAccessorName()%>()
+      <%}%>
+      <%if (!genFeature.isSuppressedUnsetVisibility()) {%>
+	 * @see #unset<%=genFeature.getAccessorName()%>()
+      <%}%>
+    <%}%>
+	 * @see #<%=genFeature.getGetAccessor()%>()
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method.__m57RHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method.__m57RHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nXIoGJ-Ed-FqczH3ESmRw/method.__m57RHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5o2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5o2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5o2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5omJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5omJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5omJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5pWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5pWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5pWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5smJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5smJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method._0ng5smJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method.__oi6BHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method.__oi6BHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ng5oGJ-Ed-FqczH3ESmRw/method.__oi6BHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqo2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqo2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqo2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method._0nqqsmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method.__pvM1HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method.__pvM1HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nqqoGJ-Ed-FqczH3ESmRw/method.__pvM1HLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0k2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0k2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0k2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0kmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0kmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0kmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0lWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0lWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0lWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0o2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0o2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method._0nz0o2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method.__rEplHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method.__rEplHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0nz0kGJ-Ed-FqczH3ESmRw/method.__rEplHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..8f8ef03
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method._0q8BImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,151 @@
+
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/unsetGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/unsetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) {%>
+	void unset<%=genFeature.getAccessorName()%>();
+
+<%} else {%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genClass.hasCollidingUnsetAccessorOperation(genFeature) && !genFeature.isSuppressedUnsetVisibility()) {%>
+	@Override
+  <%}%>
+	public void unset<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingUnsetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		eDynamicUnset(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+		eUnset(<%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicUnset(this, null, 0);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> != null) ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable<%=singleWildcard%>)<%=genFeature.getSafeName()%>).unset();
+      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> != null)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
+        <%if (!genFeature.isBidirectional()) {%>
+			msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+			msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+        <%}%>
+			msgs = basicUnset<%=genFeature.getAccessorName()%>(msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else
+		{
+        <%if (genModel.isVirtualDelegation()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%} else if (genClass.isESetFlag(genFeature)) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+          <%}%>
+			<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+          <%}%>
+			<%=genFeature.getUncapName()%>ESet = false;
+        <%}%>
+        <%if (!genModel.isSuppressNotification()) {%>
+			if (eNotificationRequired())
+				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, null, null, old<%=genFeature.getCapName()%>ESet));
+        <%}%>
+		}
+      <%} else {%>
+        <%if (genClass.isFlag(genFeature)) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
+            <%} else {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET];
+            <%}%>
+          <%}%>
+        <%} else if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		Object old<%=genFeature.getCapName()%> = eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+          <%}%>
+        <%}%>
+       <%if (!genModel.isSuppressNotification()) {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
+          <%} else if (genClass.isESetFlag(genFeature)) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+          <%} else {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+          <%}%>
+        <%}%>
+        <%if (genFeature.isReferenceType()) {%>
+		<%=genFeature.getSafeName()%> = null;
+          <%if (!genModel.isVirtualDelegation()) {%>
+            <%if (genClass.isESetFlag(genFeature)) {%>
+		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+            <%} else {%>
+		<%=genFeature.getUncapName()%>ESet = false;
+            <%}%>
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
+          <%}%>
+        <%} else {%>
+          <%if (genClass.isFlag(genFeature)) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		if (<%=genFeature.getEDefault()%>) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
+            <%} else {%>
+		<%=genClass.getFlagsField(genFeature)%> = <%=genClass.getFlagsField(genFeature)%> & ~<%=genFeature.getUpperName()%>_EFLAG | <%=genFeature.getUpperName()%>_EFLAG_DEFAULT;
+            <%}%>
+          <%} else if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
+		<%=genFeature.getSafeName()%> = <%=genFeature.getEDefault()%>;
+          <%}%>
+          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
+            <%if (genClass.isESetFlag(genFeature)) {%>
+		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+            <%} else {%>
+		<%=genFeature.getUncapName()%>ESet = false;
+            <%}%>
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? old<%=genFeature.getCapName()%> : <%=genFeature.getEDefault()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%=genFeature.getEDefault()%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
+          <%}%>
+        <%}%>
+      <%}%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%} else {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%}%>
+    <%} else if (genClass.getUnsetAccessorOperation(genFeature) != null) {%>
+		<%=genClass.getUnsetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/unsetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method.__0BKNHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method.__0BKNHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0q8BEGJ-Ed-FqczH3ESmRw/method.__0BKNHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method._0qMaQ2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method.__sQ8ZHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method.__sQ8ZHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaMGJ-Ed-FqczH3ESmRw/method.__sQ8ZHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaR2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaR2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaR2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaSGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaSGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qMaSGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLMWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLMWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLMWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLP2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLP2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..2524a90
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method._0qWLP2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method to set the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method.__tAjRHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method.__tAjRHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qMaRWJ-Ed-FqczH3ESmRw/method.__tAjRHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..497b69d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method._0qfVMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,57 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicUnsetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicUnset<%=genFeature.getAccessorName()%>(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+    <%if (genModel.isDynamicDelegation()) {%>
+		return eDynamicInverseRemove(<%=genFeature.getAsInternalEObject("", false)%><%if (genFeature.isResolveProxies()) {%>basicGet<%=genFeature.getAccessorName()%><%} else {%><%=genFeature.getGetAccessor()%><%}%>(), <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genModel.isVirtualDelegation()) {%>
+        <%if (!genModel.isSuppressNotification()) {%>Object old<%=genFeature.getCapName()%> = <%}%>eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+      <%} else {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+        <%}%>
+		<%=genFeature.getSafeName()%> = null;
+      <%}%>
+      <%if (genModel.isVirtualDelegation()) {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
+        <%}%>
+      <%} else if (genClass.isESetFlag(genFeature)) {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+        <%}%>
+		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+      <%} else {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+        <%}%>
+		<%=genFeature.getUncapName()%>ESet = false;
+      <%}%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+        <%}%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicUnsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicUnsetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method.__v101HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method.__v101HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qfVIGJ-Ed-FqczH3ESmRw/method.__v101HLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method._0qpGMmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method.__xezlHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method.__xezlHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qpGIGJ-Ed-FqczH3ESmRw/method.__xezlHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3I2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3I2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3I2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3ImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3ImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3ImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3JWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3JWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3JWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3MmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3MmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..89c17da
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method._0qy3MmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,8 @@
+
+
+		// TODO: implement this method to unset the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// -> this method is automatically invoked to keep the containment relationship in synch
+		// -> do not modify other features
+		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method.__yrGZHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method.__yrGZHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0qy3IGJ-Ed-FqczH3ESmRw/method.__yrGZHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e349b83
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method._0rPjImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,19 @@
+
+
+	/**
+	 * Unsets the value of the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.unsetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
+	 * @see #isSet<%=genFeature.getAccessorName()%>()
+  <%}%>
+	 * @see #<%=genFeature.getGetAccessor()%>()
+  <%if (!genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
+	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawImportedBoundType()%>)
+  <%}%>
+  <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method.__1gX9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method.__1gX9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rPjEGJ-Ed-FqczH3ESmRw/method.__1gX9HLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_J9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_KAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_KAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..bebddb5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method._0r_KAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method to unset the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method.__6keJHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method.__6keJHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0r_J8GJ-Ed-FqczH3ESmRw/method.__6keJHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method._0rieEmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method.__349lHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method.__349lHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rieAGJ-Ed-FqczH3ESmRw/method.__349lHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rrn9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rroAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rroAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method._0rroAmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method.__5rtVHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method.__5rtVHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0rrn8GJ-Ed-FqczH3ESmRw/method.__5rtVHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s360mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s360mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s360mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36w2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36w2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36w2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36wmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36wmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36wmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36xWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36xWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._0s36xWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._ADOD1HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._ADOD1HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0s36wGJ-Ed-FqczH3ESmRw/method._ADOD1HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..c3b2a2a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method._0sIT8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,64 @@
+
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/isSetGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/isSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) {%>
+	boolean isSet<%=genFeature.getAccessorName()%>();
+
+<%} else {%>
+  <%if (useInterfaceOverrideAnnotation  && !genClass.isMapEntry() && !genClass.hasCollidingIsSetAccessorOperation(genFeature) && !genFeature.isSuppressedIsSetVisibility()) {%>
+	@Override
+  <%}%>
+	public boolean isSet<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingIsSetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		return eDynamicIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+		return eIsSet(<%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		return <%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		return <%=genFeature.getSafeName()%> != null && ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable<%=singleWildcard%>)<%=genFeature.getSafeName()%>).isSet();
+      <%} else {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		return eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%} else if (genClass.isESetFlag(genFeature)) {%>
+		return (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+        <%} else {%>
+		return <%=genFeature.getUncapName()%>ESet;
+        <%}%>
+      <%}%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%} else {%>
+		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%}%>
+    <%} else if (genClass.getIsSetAccessorOperation(genFeature) != null) {%>
+		<%=genClass.getIsSetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/isSetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method.__8ES9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method.__8ES9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sIT4GJ-Ed-FqczH3ESmRw/method.__8ES9HLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..3edcd74
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method._0sSE8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,20 @@
+
+
+	/**
+	 * Returns whether the value of the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%> is set.
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.isSetGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%> is set.
+    <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
+	 * @see #unset<%=genFeature.getAccessorName()%>()
+    <%}%>
+	 * @see #<%=genFeature.getGetAccessor()%>()
+    <%if (!genFeature.isListType() && genFeature.isChangeable() && !genFeature.isSuppressedSetVisibility()) {%>
+	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawImportedBoundType()%>)
+    <%}%>
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method.__9sqpHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method.__9sqpHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sSE4GJ-Ed-FqczH3ESmRw/method.__9sqpHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb142J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb142J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb142J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb14mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb14mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb14mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb15WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb15WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb15WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb18mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb18mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method._0sb18mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method.__-mChHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method.__-mChHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sb14GJ-Ed-FqczH3ESmRw/method.__-mChHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_02J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_02J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_02J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_1WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_1WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_1WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method._0sk_4mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method.___faZHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method.___faZHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0sk_0GJ-Ed-FqczH3ESmRw/method.___faZHLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw02J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw02J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw02J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw1WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw1WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw1WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..b837f39
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._0suw4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method to return whether the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%> is set
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._AAYyRHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._AAYyRHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0suw0GJ-Ed-FqczH3ESmRw/method._AAYyRHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7Do2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7Do2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7Do2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..fc18b0e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._0t7DsmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._AKODtHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._AKODtHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0t7DoGJ-Ed-FqczH3ESmRw/method._AKODtHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLc0GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLc0GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..78be4c1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLc0GJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,126 @@
+
+
+  <%if (isImplementation) {%>
+    <%if (genOperation.isInvariant() && genOperation.hasInvariantExpression()) {%>
+	/**
+	 * The cached validation expression for the '{@link #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' invariant operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	protected static final <%=genModel.getImportedName("java.lang.String")%> <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EEXPRESSION = "<%=genOperation.getInvariantExpression("\t\t")%>";<%=genModel.getNonNLS()%>
+
+    <%} else if (genOperation.hasInvocationDelegate()) {%>
+	/**
+	 * The cached invocation delegate for the '{@link #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	protected static final <%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%>.Internal.InvocationDelegate <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%>.Internal)<%=genOperation.getQualifiedOperationAccessor()%>).getInvocationDelegate();
+
+    <%}%>
+  <%}%>
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.javadoc.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/genOperation.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/genOperation.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.annotations.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) {%>
+	<%=genOperation.getTypeParameters(genClass)%><%=genOperation.getImportedType(genClass)%> <%=genOperation.getName()%>(<%=genOperation.getParameters(genClass)%>)<%=genOperation.getThrows(genClass)%>;
+
+<%} else {%>
+  <%if (genModel.useGenerics() && !genOperation.hasBody() && !genOperation.isInvariant() && genOperation.hasInvocationDelegate() && genOperation.isUncheckedCast(genClass)) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genOperation.isSuppressedVisibility()) {%>
+	@Override
+  <%}%>
+	public <%=genOperation.getTypeParameters(genClass)%><%=genOperation.getImportedType(genClass)%> <%=genOperation.getName()%>(<%=genOperation.getParameters(isImplementation, genClass)%>)<%=genOperation.getThrows(genClass)%>
+	{
+  <%if (genOperation.hasBody()) {%>
+		<%=genOperation.getBody(genModel.getIndentation(stringBuffer))%>
+  <%} else if (genOperation.isInvariant()) {GenClass opClass = genOperation.getGenClass(); String diagnostics = genOperation.getGenParameters().get(0).getName(); String context = genOperation.getGenParameters().get(1).getName();%>
+    <%if (genOperation.hasInvariantExpression()) {%>
+		return
+			<%=opClass.getGenPackage().getImportedValidatorClassName()%>.validate
+				(<%=genClass.getQualifiedClassifierAccessor()%>,
+				 this,
+				 <%=diagnostics%>,
+				 <%=context%>,
+				 "<%=genOperation.getValidationDelegate()%>",<%=genModel.getNonNLS()%>
+				 <%=genOperation.getQualifiedOperationAccessor()%>,
+				 <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EEXPRESSION,
+				 <%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+				 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.DIAGNOSTIC_SOURCE,
+				 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.<%=opClass.getOperationID(genOperation)%>);
+    <%} else {%>
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false)
+		{
+			if (<%=diagnostics%> != null)
+			{
+				<%=diagnostics%>.add
+					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.DIAGNOSTIC_SOURCE,
+						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.<%=opClass.getOperationID(genOperation)%>,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericInvariant_diagnostic", new Object[] { "<%=genOperation.getName()%>", <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator")%>.getObjectLabel(this, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+						 new Object [] { this }));
+			}
+			return false;
+		}
+		return true;
+    <%}%>
+  <%} else if (genOperation.hasInvocationDelegate()) { int size = genOperation.getGenParameters().size();%>
+		try
+		{
+    <%if (genOperation.isVoid()) {%>
+			<%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE.dynamicInvoke(this, <%if (size > 0) {%>new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>.UnmodifiableEList<Object>(<%=size%>, <%=genOperation.getParametersArray(genClass)%>)<%} else {%>null<%}%>);
+    <%} else {%>
+			return <%if (!isJDK50 && genOperation.isPrimitiveType()) {%>(<%}%>(<%=genOperation.getObjectType(genClass)%>)<%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE.dynamicInvoke(this, <%if (size > 0) {%>new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>.UnmodifiableEList<Object>(<%=size%>, <%=genOperation.getParametersArray(genClass)%>)<%} else {%>null<%}%>)<%if (!isJDK50 && genOperation.isPrimitiveType()) {%>).<%=genOperation.getPrimitiveValueFunction()%>()<%}%>;
+    <%}%>
+		}
+		catch (<%=genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException" : "java.lang.reflect.InvocationTargetException")%> ite)
+		{
+			throw new <%=genModel.getImportedName("org.eclipse.emf.common.util.WrappedException")%>(ite);
+		}
+  <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.implementedGenOperation.TODO.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/implementedGenOperation.todo.override.javajetinc%>
+  <%}%>
+	}
+
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcw2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcw2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcw2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._0tLcwWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._AD9qtHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._AD9qtHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tBrwGJ-Ed-FqczH3ESmRw/method._AD9qtHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUms2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUms2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUms2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmsmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmtWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmtWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmtWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..95e0b50
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._0tUmwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,32 @@
+
+
+	/**
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.javadoc.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genOperation.hasDocumentation() || genOperation.hasParameterDocumentation()) {%>
+	 * <!-- begin-model-doc -->
+    <%if (genOperation.hasDocumentation()) {%>
+	 * <%=genOperation.getDocumentation(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+    <%for (GenParameter genParameter : genOperation.getGenParameters()) {%>
+      <%if (genParameter.hasDocumentation()) { String documentation = genParameter.getDocumentation("");%>
+        <%if (documentation.contains("\n") || documentation.contains("\r")) {%>
+	 * @param <%=genParameter.getName()%>
+	 *   <%=genParameter.getDocumentation(genModel.getIndentation(stringBuffer))%>
+        <%} else {%>
+	 * @param <%=genParameter.getName()%> <%=genParameter.getDocumentation(genModel.getIndentation(stringBuffer))%>
+        <%}%>
+      <%}%>
+    <%}%>
+	 * <!-- end-model-doc -->
+  <%}%>
+  <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genOperation.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+  <%} else {%>
+	 *        <%=modelInfo%>
+  <%}} if (first) {%>
+	 * @model
+  <%}}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._AFJ9hHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._AFJ9hHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0tUmsGJ-Ed-FqczH3ESmRw/method._AFJ9hHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIs2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIs2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIs2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIsmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toItWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toItWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toItWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._0toIwmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._AG8GNHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._AG8GNHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0toIsGJ-Ed-FqczH3ESmRw/method._AG8GNHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSo2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSo2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSo2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSomJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSpWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSpWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSpWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._0txSsmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._AIbT9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._AIbT9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0txSoGJ-Ed-FqczH3ESmRw/method._AIbT9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bg2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bg2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bg2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bhmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bk2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bk2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..ba596b5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._0u0bk2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,242 @@
+
+
+    <%if (genFeature.hasSettingDelegate()) {%>
+	/**
+	 * The cached setting delegate for the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Internal.SettingDelegate <%=genFeature.getUpperName()%>__ESETTING_DELEGATE = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Internal)<%=genFeature.getQualifiedFeatureAccessor()%>).getSettingDelegate();
+
+    <%} else if (genFeature.isListType() || genFeature.isReferenceType()) {%>
+      <%if (genClass.isField(genFeature)) {%>
+	/**
+	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected <%=genFeature.getImportedInternalType(genClass)%> <%=genFeature.getSafeName()%>;
+
+      <%}%>
+      <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String rawListItemType = genFeature.getRawListItemType(genClass); int index = rawListItemType.indexOf('['); String head = rawListItemType; String tail = ""; if (index != -1) { head = rawListItemType.substring(0, index); tail = rawListItemType.substring(index); } %>
+	/**
+	 * The empty value for the '{@link #<%=genFeature.getGetArrayAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' array accessor.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetArrayAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (genFeature.getQualifiedListItemType(genClass).contains("<") || genFeature.getArrayItemType(genClass).contains("<")) {%>
+	@SuppressWarnings("rawtypes")
+        <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final <%=rawListItemType%>[] <%=genFeature.getUpperName()%>_EEMPTY_ARRAY = new <%=head%> [0]<%=tail%>;
+
+      <%}%>
+    <%} else {%>
+      <%if (genFeature.hasEDefault() && (!genFeature.isVolatile() || !genModel.isReflectiveDelegation() && (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable()))) { String staticDefaultValue = genFeature.getStaticDefaultValue();%>
+	/**
+	 * The default value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (genModel.useGenerics() && genFeature.isListDataType() && genFeature.isSetDefaultValue()) {%>
+	@SuppressWarnings("unchecked")
+        <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final <%=genFeature.getImportedType(genClass)%> <%=genFeature.getEDefault()%><%if ("".equals(staticDefaultValue)) {%>; // TODO The default value literal "<%=genFeature.getEcoreFeature().getDefaultValueLiteral()%>" is not valid.<%} else {%> = <%=staticDefaultValue%>;<%=genModel.getNonNLS(staticDefaultValue)%><%}%>
+
+      <%}%>
+      <%if (genClass.isField(genFeature)) {%>
+        <%if (genClass.isFlag(genFeature)) { int flagIndex = genClass.getFlagIndex(genFeature);%>
+          <%if (flagIndex > 31 && flagIndex % 32 == 0) {%>
+	/**
+	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=genClass.getFlagsField(genFeature)%> = 0;
+
+          <%}%>
+          <%if (genFeature.isEnumType()) {%>
+	/**
+	 * The offset of the flags representing the value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_EFLAG_OFFSET = <%=flagIndex % 32%>;
+
+	/**
+	 * The flags representing the default value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_EFLAG_DEFAULT = <%if (isJDK50) {%><%=genFeature.getEDefault()%>.ordinal()<%} else {%><%=genFeature.getImportedType(genClass)%>.VALUES.indexOf(<%=genFeature.getEDefault()%>)<%}%> << <%=genFeature.getUpperName()%>_EFLAG_OFFSET;
+
+	/**
+	 * The array of enumeration values for '{@link <%=genFeature.getImportedType(genClass)%> <%=genFeature.getTypeGenClassifier().getFormattedName()%>}'
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	private static final <%=genFeature.getImportedType(genClass)%>[] <%=genFeature.getUpperName()%>_EFLAG_VALUES = <%if (isJDK50) {%><%=genFeature.getImportedType(genClass)%>.values()<%} else {%>(<%=genFeature.getImportedType(genClass)%>[])<%=genFeature.getImportedType(genClass)%>.VALUES.toArray(new <%=genFeature.getImportedType(genClass)%>[<%=genFeature.getImportedType(genClass)%>.VALUES.size()])<%}%>;
+
+          <%}%>
+	/**
+	 * The flag<%=genClass.getFlagSize(genFeature) > 1 ? "s" : ""%> representing the value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_EFLAG = <%=genClass.getFlagMask(genFeature)%> << <%if (genFeature.isEnumType()) {%><%=genFeature.getUpperName()%>_EFLAG_OFFSET<%} else {%><%=flagIndex % 32%><%}%>;
+
+        <%} else {%>
+	/**
+	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected <%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%><%if (genFeature.hasEDefault()) {%> = <%=genFeature.getEDefault()%><%}%>;
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (genClass.isESetField(genFeature)) {%>
+      <%if (genClass.isESetFlag(genFeature)) { int flagIndex = genClass.getESetFlagIndex(genFeature);%>
+        <%if (flagIndex > 31 && flagIndex % 32 == 0) {%>
+	/**
+	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=genClass.getESetFlagsField(genFeature)%> = 0;
+
+        <%}%>
+	/**
+	 * The flag representing whether the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	protected static final int <%=genFeature.getUpperName()%>_ESETFLAG = 1 << <%=flagIndex % 32 %>;
+
+      <%} else {%>
+	/**
+	 * This is true if the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	protected boolean <%=genFeature.getUncapName()%>ESet;
+
+      <%}%>
+    <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.declaredFieldGenFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._AQBwxXLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._AQBwxXLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0u0bgWJ-Ed-FqczH3ESmRw/method._AQBwxXLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENk2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENk2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENk2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENkmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENkmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENkmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENlWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENlWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENlWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENomJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENomJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._0uENomJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._ALaWhHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._ALaWhHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uENkGJ-Ed-FqczH3ESmRw/method._ALaWhHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-k2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-k2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-k2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-kmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-kmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-kmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-lWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-lWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-lWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-oWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-oWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..703dd2c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._0uN-oWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,54 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public void eUnset(int featureID)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+  <%for (GenFeature genFeature : genClass.getEUnsetGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
+      <%if (genFeature.isWrappedFeatureMapType()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().clear();
+      <%} else {%>
+				<%=genFeature.getGetAccessor()%>().clear();
+      <%}%>
+    <%} else if (genFeature.isUnsettable()) {%>
+				unset<%=genFeature.getAccessorName()%>();
+    <%} else if (!genFeature.hasEDefault()) {%>
+				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)null);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+				<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicUnset(this, null, 0);
+    <%} else {%>
+				set<%=genFeature.getAccessorName()%>(<%=genFeature.getEDefault()%>);
+    <%}%>
+				return;
+  <%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+  <%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		super.eUnset(featureID);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%} else {%>
+<%=indentDefaultCase%>		eDynamicUnset(featureID);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._AMmpVHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._AMmpVHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uN-kGJ-Ed-FqczH3ESmRw/method._AMmpVHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvk2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvk2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvk2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvkmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvkmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvkmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvlWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvlWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvlWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvoWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvoWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..4b6981b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._0uXvoWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,116 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+    <%for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) {%>
+      <%if (genFeature.isListType() && !genFeature.isUnsettable() && !genFeature.isWrappedFeatureMapType() && !genClass.isField(genFeature) && genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+	@SuppressWarnings("unchecked")
+      <%break; }%>
+    <%}%>
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public boolean eIsSet(int featureID)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEIsSetGenFeatures()) { String safeNameAccessor = genFeature.getSafeName(); if ("featureID".equals(safeNameAccessor)) { safeNameAccessor = "this." + safeNameAccessor; }%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.hasSettingDelegate()) {%>
+    <%if (genFeature.isUnsettable()) {%>
+				return isSet<%=genFeature.getAccessorName()%>();
+    <%} else {%>
+				return <%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);
+    <%}%>
+  <%} else if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
+    <%if (genFeature.isWrappedFeatureMapType()) {%>
+      <%if (genFeature.isVolatile()) {%>
+				return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().isEmpty();
+      <%} else {%>
+				return <%=safeNameAccessor%> != null && !<%=safeNameAccessor%>.featureMap().isEmpty();
+      <%}%>
+    <%} else {%>
+      <%if (genClass.isField(genFeature)) {%>
+				return <%=safeNameAccessor%> != null && !<%=safeNameAccessor%>.isEmpty();
+      <%} else {%>
+        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=safeNameAccessor%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+				return <%=safeNameAccessor%> != null && !<%=safeNameAccessor%>.isEmpty();
+        <%} else {%>
+				return !<%=genFeature.getGetAccessor()%>().isEmpty();
+        <%}%>
+      <%}%>
+    <%}%>
+  <%} else if (genFeature.isUnsettable()) {%>
+				return isSet<%=genFeature.getAccessorName()%>();
+  <%} else if (genFeature.isResolveProxies()) {%>
+    <%if (genClass.isField(genFeature)) {%>
+				return <%=safeNameAccessor%> != null;
+    <%} else {%>
+      <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) != null;
+      <%} else {%>
+				return basicGet<%=genFeature.getAccessorName()%>() != null;
+      <%}%>
+    <%}%>
+  <%} else if (!genFeature.hasEDefault()) {%>
+    <%if (genClass.isField(genFeature)) {%>
+				return <%=safeNameAccessor%> != null;
+    <%} else {%>
+      <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) != null;
+      <%} else {%>
+				return <%=genFeature.getGetAccessor()%>() != null;
+      <%}%>
+    <%}%>
+  <%} else if (genFeature.isPrimitiveType() || genFeature.isEnumType()) {%>
+    <%if (genClass.isField(genFeature)) {%>
+      <%if (genClass.isFlag(genFeature)) {%>
+        <%if (genFeature.isBooleanType()) {%>
+				return ((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0) != <%=genFeature.getEDefault()%>;
+        <%} else {%>
+				return (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != <%=genFeature.getUpperName()%>_EFLAG_DEFAULT;
+        <%}%>
+      <%} else {%>
+				return <%=safeNameAccessor%> != <%=genFeature.getEDefault()%>;
+      <%}%>
+    <%} else {%>
+      <%if (genFeature.isEnumType() && genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getEDefault()%>) != <%=genFeature.getEDefault()%>;
+      <%} else {%>
+				return <%=genFeature.getGetAccessor()%>() != <%=genFeature.getEDefault()%>;
+      <%}%>
+    <%}%>
+  <%} else {//datatype%>
+    <%if (genClass.isField(genFeature)) {%>
+				return <%=genFeature.getEDefault()%> == null ? <%=safeNameAccessor%> != null : !<%=genFeature.getEDefault()%>.equals(<%=safeNameAccessor%>);
+    <%} else {%>
+      <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=safeNameAccessor%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getEDefault()%>);
+				return <%=genFeature.getEDefault()%> == null ? <%=safeNameAccessor%> != null : !<%=genFeature.getEDefault()%>.equals(<%=safeNameAccessor%>);
+      <%} else {%>
+				return <%=genFeature.getEDefault()%> == null ? <%=genFeature.getGetAccessor()%>() != null : !<%=genFeature.getEDefault()%>.equals(<%=genFeature.getGetAccessor()%>());
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eIsSet(featureID);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicIsSet(featureID);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._AN8tJHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._AN8tJHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uXvkGJ-Ed-FqczH3ESmRw/method._AN8tJHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5g2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5g2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5g2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5gmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5gmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5gmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5hWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5hWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5hWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5kWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5kWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._0ug5kWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._AO_O9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._AO_O9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ug5gGJ-Ed-FqczH3ESmRw/method._AO_O9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._--X7pXLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._--X7pXLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._--X7pXLYEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqg2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqg2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqg2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhGJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhGJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhGJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqhmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqimJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqimJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d41619d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0uqqgWJ-Ed-FqczH3ESmRw/method._0uqqimJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,24 @@
+
+
+<%if (genPackage.hasExtendedMetaData()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%> result = new <%=genPackage.getResourceClassName()%>(uri);
+		result.getDefaultSaveOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_EXTENDED_META_DATA, <%if (genPackage.hasTargetNamespace()){%>Boolean.TRUE<%}else{%>extendedMetaData<%}%>);
+		result.getDefaultLoadOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_EXTENDED_META_DATA, <%if (genPackage.hasTargetNamespace()){%>Boolean.TRUE<%}else{%>extendedMetaData<%}%>);
+
+		result.getDefaultSaveOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
+
+		result.getDefaultLoadOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
+		result.getDefaultSaveOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
+
+		result.getDefaultLoadOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
+<%if (genPackage.isDataTypeConverters() && genPackage.hasDocumentRoot()) {%>
+		result.getDefaultLoadOptions().put(<%=genPackage.getResourceClassName()%>.OPTION_USE_DATA_CONVERTER, Boolean.TRUE);
+<%}%>
+<%} else if (genPackage.hasXMLMap()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%> result = new <%=genPackage.getResourceClassName()%>(uri);
+		result.getDefaultSaveOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_XML_MAP, xmlMap);
+		result.getDefaultLoadOptions().put(<%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource")%>.OPTION_XML_MAP, xmlMap);
+<%} else {%>
+		Resource result = new <%=genPackage.getResourceClassName()%>(uri);
+<%}%>
+		return result;
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWc2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWc2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWc2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWcmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWdWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWdWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWdWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWgmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWgmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._0vHWgmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._ARX0lHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._ARX0lHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vHWcGJ-Ed-FqczH3ESmRw/method._ARX0lHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgcWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgcWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d5092be
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._0vQgcWJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,26 @@
+
+
+<%if (isImplementation && (genModel.getFeatureDelegation() == GenDelegationKind.REFLECTIVE_LITERAL || genModel.isDynamicDelegation()) && (genClass.getClassExtendsGenClass() == null || (genClass.getClassExtendsGenClass().getGenModel().getFeatureDelegation() != GenDelegationKind.REFLECTIVE_LITERAL && !genClass.getClassExtendsGenClass().getGenModel().isDynamicDelegation()))) {%>
+  <%if (genClass.hasStaticFeatures()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final int ESTATIC_FEATURE_COUNT = <%=genClass.getClassExtendsGenClass() == null ? 0 : genClass.getClassExtendsGenClass().getAllGenFeatures().size()%>;
+
+  <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected int eStaticFeatureCount()
+	{
+		return <%=genClass.getClassExtendsGenClass() == null ? "0" : genClass.hasStaticFeatures() ? "ESTATIC_FEATURE_COUNT" : Integer.toString(genClass.getClassExtendsGenClass().getAllGenFeatures().size())%>;
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._ASkHZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._ASkHZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vQgYGJ-Ed-FqczH3ESmRw/method._ASkHZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..845c938
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._0vaRcmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,161 @@
+
+
+  <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String arrayElementType = genFeature.getArrayItemType(genClass);%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (!isImplementation) {%>
+	<%=arrayElementType%>[] <%=genFeature.getGetArrayAccessor()%>();
+
+    <%} else {%>
+    <%if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public <%=arrayElementType%>[] <%=genFeature.getGetArrayAccessor()%>()
+	{
+      <%if (genFeature.isVolatile()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>();
+		if (list.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+      <%} else {%>
+		if (<%=genFeature.getSafeName()%> == null || <%=genFeature.getSafeName()%>.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getSafeName()%>;
+      <%}%>
+		list.shrink();
+		return (<%=arrayElementType%>[])list.data();
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	<%=genFeature.getListItemType(genClass)%> get<%=genFeature.getAccessorName()%>(int index);
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public <%=genFeature.getListItemType(genClass)%> get<%=genFeature.getAccessorName()%>(int index)
+	{
+		return <%if (!genModel.useGenerics()) {%>(<%=genFeature.getListItemType(genClass)%>)<%}%><%=genFeature.getGetAccessor()%>().get(index);
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	int get<%=genFeature.getAccessorName()%>Length();
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public int get<%=genFeature.getAccessorName()%>Length()
+	{
+      <%if (genFeature.isVolatile()) {%>
+		return <%=genFeature.getGetAccessor()%>().size();
+      <%} else {%>
+		return <%=genFeature.getSafeName()%> == null ? 0 : <%=genFeature.getSafeName()%>.size();
+      <%}%>
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType(genClass)%>[] new<%=genFeature.getCapName()%>);
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType(genClass)%>[] new<%=genFeature.getCapName()%>)
+	{
+		((<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).setData(new<%=genFeature.getCapName()%>.length, new<%=genFeature.getCapName()%>);
+	}
+
+    <%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (!isImplementation) {%>
+	void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType(genClass)%> element);
+
+    <%} else {%>
+    <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+    <%}%>
+	public void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType(genClass)%> element)
+	{
+		<%=genFeature.getGetAccessor()%>().set(index, element);
+	}
+
+    <%}%>
+  <%}%>
+  <%if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/getGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicGetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicSetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/setGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class.basicUnsetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/unsetGenFeature.override.javajetinc%>
+  <%}%>
+  <%if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.isSetGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/isSetGenFeature.override.javajetinc%>
+  <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeature.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._AUpyFHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._AUpyFHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vaRYGJ-Ed-FqczH3ESmRw/method._AUpyFHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..30f370e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._0vkCcmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,145 @@
+
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/getGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+<%if (!isImplementation) {%>
+	<%=genFeature.getImportedType(genClass)%> <%=genFeature.getGetAccessor()%>();
+
+<%} else {%>
+  <%if (genModel.useGenerics() && ((genFeature.isContainer() || genFeature.isResolveProxies()) && !genFeature.isListType() && genFeature.isUncheckedCast(genClass) || genFeature.isListType() && !genFeature.isFeatureMapType() && (genModel.isReflectiveDelegation() || genModel.isVirtualDelegation() || (genModel.isDynamicDelegation() && !genFeature.isVolatile())) || genFeature.isListDataType() && genFeature.hasDelegateFeature() || genFeature.isListType() && genFeature.hasSettingDelegate())) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genClass.hasCollidingGetAccessorOperation(genFeature) && !genFeature.isSuppressedGetVisibility()) {%>
+	@Override
+  <%}%>
+	public <%=genFeature.getImportedType(genClass)%> <%=genFeature.getGetAccessor()%><%if (genClass.hasCollidingGetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)eDynamicGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>, true, <%=!genFeature.isEffectiveSuppressEMFTypes()%>)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+      <%if (genFeature.hasGetterBody()) {%>
+		<%=genFeature.getGetterBody(genModel.getIndentation(stringBuffer))%>
+      <%} else {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)eGet(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+      <%}%>
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicGet(this, null, 0, true, false)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> == null)
+		{
+        <%if (genModel.isVirtualDelegation()) {%>
+			eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>);
+        <%} else {%>
+			<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
+        <%}%>
+		}
+		return <%=genFeature.getSafeName()%><%=genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : ""%>;
+      <%} else if (genFeature.isContainer()) {%>
+		if (eContainerFeatureID() != <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) return null;
+		return (<%=genFeature.getImportedType(genClass)%>)<%if (genFeature.isResolveProxies()) {%>eContainer<%} else {%>eInternalContainer<%}%>();
+      <%} else {%>
+        <%if (genFeature.isResolveProxies()) {%>
+          <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%><%if (genFeature.hasEDefault()) {%>, <%=genFeature.getEDefault()%><%}%>);
+          <%}%>
+		if (<%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeNameAsEObject()%>.eIsProxy())
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> old<%=genFeature.getCapName()%> = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), false)%>;
+			<%=genFeature.getSafeName()%> = <%=genFeature.getNonEObjectInternalTypeCast(genClass)%>eResolveProxy(old<%=genFeature.getCapName()%>);
+			if (<%=genFeature.getSafeName()%> != old<%=genFeature.getCapName()%>)
+			{
+          <%if (genFeature.isEffectiveContains()) {%>
+				<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> new<%=genFeature.getCapName()%> = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), false)%>;
+          <%if (!genFeature.isBidirectional()) {%>
+				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = old<%=genFeature.getCapName()%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, null);
+          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs =  old<%=genFeature.getCapName()%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, null);
+          <%}%>
+				if (new<%=genFeature.getCapName()%>.eInternalContainer() == null)
+				{
+          <%if (!genFeature.isBidirectional()) {%>
+					msgs = new<%=genFeature.getCapName()%>.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+					msgs =  new<%=genFeature.getCapName()%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+          <%}%>
+				}
+				if (msgs != null) msgs.dispatch();
+          <%} else if (genModel.isVirtualDelegation()) {%>
+				eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%>);
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+				if (eNotificationRequired())
+					eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.RESOLVE, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, old<%=genFeature.getCapName()%>, <%=genFeature.getSafeName()%>));
+          <%}%>
+			}
+		}
+        <%}%>
+        <%if (!genFeature.isResolveProxies() && genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%><%if (genFeature.hasEDefault()) {%>, <%=genFeature.getEDefault()%><%}%>);
+        <%} else if (genClass.isFlag(genFeature)) {%>
+          <%if (genFeature.isBooleanType()) {%>
+		return (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
+          <%} else {%>
+		return <%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET];
+          <%}%>
+        <%} else {%>
+		return <%=genFeature.getSafeName()%>;
+        <%}%>
+      <%}%>
+    <%} else {//volatile%>
+      <%if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = basicGet<%=genFeature.getAccessorName()%>();
+		return <%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeNameAsEObject()%>.eIsProxy() ? <%=genFeature.getNonEObjectInternalTypeCast(genClass)%>eResolveProxy(<%=genFeature.getAsInternalEObject(genFeature.getSafeName(), false)%>) : <%=genFeature.getSafeName()%>;
+      <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+        <%if (genFeature.isFeatureMapType()) {%>
+        <%String featureMapEntryTemplateArgument = isJDK50 ? "<" + genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap") + ".Entry>" : "";%>
+          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return new <%=genFeature.getImportedEffectiveFeatureMapWrapperClass()%>((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().<%=featureMapEntryTemplateArgument%>list(<%=genFeature.getQualifiedFeatureAccessor()%>));
+          <%} else {%>
+		return (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)get<%=delegateFeature.getAccessorName()%>().<%=featureMapEntryTemplateArgument%>list(<%=genFeature.getQualifiedFeatureAccessor()%>);
+          <%}%>
+        <%} else if (genFeature.isListType()) {%>
+          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().list(<%=genFeature.getQualifiedFeatureAccessor()%>);
+          <%} else {%>
+		return get<%=delegateFeature.getAccessorName()%>().list(<%=genFeature.getQualifiedFeatureAccessor()%>);
+          <%}%>
+        <%} else {%>
+          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%><%if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType()) {%>(<%=genFeature.getObjectType(genClass)%>)<%}%>((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+          <%} else {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%><%if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType()) {%>(<%=genFeature.getObjectType(genClass)%>)<%}%>get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+          <%}%>
+        <%}%>
+      <%} else if (genClass.getGetAccessorOperation(genFeature) != null) {%>
+		<%=genClass.getGetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer))%>
+      <%} else if (genFeature.hasGetterBody()) {%>
+		<%=genFeature.getGetterBody(genModel.getIndentation(stringBuffer))%>
+      <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/getGenFeature.todo.override.javajetinc%>
+      <%}%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._AWlrxHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._AWlrxHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vkCYGJ-Ed-FqczH3ESmRw/method._AWlrxHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMU2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMU2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMU2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMUmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMVWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMVWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMVWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..837a022
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._0vtMYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,65 @@
+
+
+	/**
+	 * Returns the value of the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%>.
+    <%if (genFeature.isListType() && genFeature.getEcoreFeature().getEGenericType().getETypeParameter() == null) {%>
+      <%if (genFeature.isMapType()) { GenFeature keyFeature = genFeature.getMapEntryTypeGenClass().getMapEntryKeyFeature(); GenFeature valueFeature = genFeature.getMapEntryTypeGenClass().getMapEntryValueFeature(); %>
+	 * The key is of type <%if (keyFeature.isListType()) {%>list of {@link <%=keyFeature.getQualifiedListItemType(genClass)%>}<%} else {%>{@link <%=keyFeature.getType(genClass)%>}<%}%>,
+	 * and the value is of type <%if (valueFeature.isListType()) {%>list of {@link <%=valueFeature.getQualifiedListItemType(genClass)%>}<%} else {%>{@link <%=valueFeature.getType(genClass)%>}<%}%>,
+      <%} else if (!genFeature.isWrappedFeatureMapType() && !(genModel.isSuppressEMFMetaData() && "org.eclipse.emf.ecore.EObject".equals(genFeature.getQualifiedListItemType(genClass)))) {
+String typeName = genFeature.getQualifiedListItemType(genClass); String head = typeName; String tail = ""; int index = typeName.indexOf('<'); if (index == -1) { index = typeName.indexOf('['); } 
+if (index != -1) { head = typeName.substring(0, index); tail = "<code>" + CodeGenUtil.xmlEscapeEncode(typeName.substring(index)) + "</code>"; }
+%>
+	 * The list contents are of type {@link <%=head%>}<%=tail%>.
+      <%}%>
+    <%} else if (genFeature.isSetDefaultValue()) {%>
+	 * The default value is <code><%=genFeature.getDefaultValue()%></code>.
+    <%}%>
+    <%if (genFeature.getTypeGenEnum() != null) {%>
+	 * The literals are from the enumeration {@link <%=genFeature.getTypeGenEnum().getQualifiedName()%>}.
+    <%}%>
+    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
+      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
+	 * It is bidirectional and its opposite is '{@link <%=reverseGenFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%> <em><%=reverseGenFeature.getFormattedName()%></em>}'.
+      <%}%>
+    <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasDocumentation()) {%>
+	 * <!-- begin-model-doc -->
+	 * <%=genFeature.getDocumentation(genModel.getIndentation(stringBuffer))%>
+	 * <!-- end-model-doc -->
+    <%}%>
+	 * @return the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
+    <%if (genFeature.getTypeGenEnum() != null) {%>
+	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
+    <%}%>
+    <%if (genFeature.isUnsettable()) {%>
+      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
+	 * @see #isSet<%=genFeature.getAccessorName()%>()
+      <%}%>
+      <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
+	 * @see #unset<%=genFeature.getAccessorName()%>()
+      <%}%>
+    <%}%>
+    <%if (genFeature.isChangeable() && !genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
+	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getRawImportedBoundType()%>)
+    <%}%>
+    <%if (!genModel.isSuppressEMFMetaData()) {%>
+	 * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genFeature.getFeatureAccessorName()%>()
+    <%}%>
+    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
+      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
+	 * @see <%=reverseGenFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%>
+      <%}%>
+    <%}%>
+    <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genFeature.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+    <%} else {%>
+	 *        <%=modelInfo%>
+    <%}} if (first) {%>
+	 * @model
+    <%}}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._AXx-lHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._AXx-lHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0vtMUGJ-Ed-FqczH3ESmRw/method._AXx-lHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._0w5fMmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._Ag3pJHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._Ag3pJHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0w5fIGJ-Ed-FqczH3ESmRw/method._Ag3pJHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4Q2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4Q2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4Q2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4QmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4QmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4QmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4RWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4RWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4RWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4UmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4UmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._0wJ4UmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._AZkHRHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._AZkHRHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wJ4QGJ-Ed-FqczH3ESmRw/method._AZkHRHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQ2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpRWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpRWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpRWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._0wTpUmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._AawaFHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._AawaFHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wTpQGJ-Ed-FqczH3ESmRw/method._AawaFHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._0wczQmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._Ab8s5HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._Ab8s5HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wczMGJ-Ed-FqczH3ESmRw/method._Ab8s5HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..fa0522b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._0wmkQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,9 @@
+
+
+		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// Ensure that you remove @generated or mark it @generated NOT
+        <%if (genFeature.isListType()) {%>
+		// The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+		// so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.<%if (genFeature.isMapType()) {%>EcoreEMap<%} else if (genFeature.isFeatureMapType()) {%>BasicFeatureMap<%} else {%>EcoreEList<%}%> should be used.
+        <%}%>
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._AdvcpHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._AdvcpHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wmkMGJ-Ed-FqczH3ESmRw/method._AdvcpHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVM2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVM2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVM2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVNWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVNWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVNWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..bf5b825
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._0wwVQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,45 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicGetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+	public <%=genFeature.getImportedType(genClass)%> basicGet<%=genFeature.getAccessorName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)eDynamicGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>, false, <%=!genFeature.isEffectiveSuppressEMFTypes()%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		return <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType(genClass)%>)<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicGet(this, null, 0, false, false)<%if (!isJDK50 && genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
+    <%} else if (genFeature.isContainer()) {%>
+		if (eContainerFeatureID() != <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>) return null;
+		return (<%=genFeature.getImportedType(genClass)%>)eInternalContainer();
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genModel.isVirtualDelegation()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+      <%} else {%>
+		return <%=genFeature.getSafeName()%>;
+      <%}%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return (<%=genFeature.getImportedType(genClass)%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
+      <%} else {%>
+		return (<%=genFeature.getImportedType(genClass)%>)get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
+      <%}%>
+    <%} else if (genFeature.hasGetterBody()) {%>
+		<%=genFeature.getGetterBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicGetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicGetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._AfhlVHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._AfhlVHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0wwVMGJ-Ed-FqczH3ESmRw/method._AfhlVHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._0x8oEmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._AtPRNHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._AtPRNHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oAGJ-Ed-FqczH3ESmRw/method._AtPRNHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oF2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oF2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oF2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oFmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oFmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oFmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oGWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oGWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0x8oGWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0yFx-2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0yFx-2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..96f1ac1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._0yFx-2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,8 @@
+
+
+		// TODO: implement this method to set the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// -> this method is automatically invoked to keep the containment relationship in synch
+		// -> do not modify other features
+		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._Aukt9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._Aukt9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0x8oFGJ-Ed-FqczH3ESmRw/method._Aukt9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._0xDQMmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._Ah6K9HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._Ah6K9HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xDQIGJ-Ed-FqczH3ESmRw/method._Ah6K9HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBI2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBI2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBI2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBJWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBJWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBJWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBMmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBMmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..b72a863
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._0xNBMmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,6 @@
+
+
+		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// -> do not perform proxy resolution
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._Aizi1HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._Aizi1HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xNBIGJ-Ed-FqczH3ESmRw/method._Aizi1HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLE2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLE2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLE2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLEmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLFWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLFWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLFWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLImJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLImJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..53022ac
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._0xWLImJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,77 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedInternalType(genClass)%> new<%=genFeature.getCapName()%>, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+    <%if (genFeature.isContainer()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		msgs = eBasicSetContainer(<%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false)%>, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		return msgs;
+    <%} else if (genModel.isDynamicDelegation()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		msgs = eDynamicInverseAdd(<%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), false)%>, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		return msgs;
+    <%} else if (!genFeature.isVolatile()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+      <%if (genModel.isVirtualDelegation()) {%>
+		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>);
+      <%} else {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%>;
+      <%}%>
+      <%if (genFeature.isUnsettable()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
+          <%}%>
+        <%} else if (genClass.isESetFlag(genFeature)) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+          <%if (!genModel.isSuppressNotification()) {%>
+		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
+          <%}%>
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+          <%}%>
+		<%=genFeature.getUncapName()%>ESet = true;
+        <%}%>
+      <%}%>
+      <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+		{
+        <%if (genFeature.isUnsettable()) {%>
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>);
+        <%} else {%>
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>);
+        <%}%>
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+      <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.post.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		return msgs;
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
+      <%} else {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
+      <%}%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicSetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._Aj_1pHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._Aj_1pHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xWLEGJ-Ed-FqczH3ESmRw/method._Aj_1pHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGA2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGA2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGA2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGBWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGBWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGBWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGEmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGEmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._0xpGEmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._AmYbRHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._AmYbRHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xpGAGJ-Ed-FqczH3ESmRw/method._AmYbRHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3A2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3A2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3A2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3AmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3AmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3AmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3BWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3BWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3BWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3EmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3EmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._0xy3EmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._AsC-ZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._AsC-ZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0xy3AGJ-Ed-FqczH3ESmRw/method._AsC-ZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y02J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y02J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y02J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y1WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y1WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y1WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._0y1Y42J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._BI881HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._BI881HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y1Y0GJ-Ed-FqczH3ESmRw/method._BI881HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPi9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPjAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPjAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..08817d8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._0yPjAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,181 @@
+
+
+<%if (isInterface) { %>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/setGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) { %>
+	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType(genClass)%> value);
+
+<%} else { GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genClass.hasCollidingSetAccessorOperation(genFeature) && !genFeature.isSuppressedSetVisibility()) {%>
+	@Override
+  <%}%>
+	public void set<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingSetAccessorOperation(genFeature)) {%>_<%}%>(<%=genFeature.getImportedType(genClass)%> <%=setAccessorOperation == null ? "new" + genFeature.getCapName() : setAccessorOperation.getGenParameters().get(0).getName()%>)
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicSetGenFeature.pre.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+		eDynamicSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicSetGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+		eSet(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicSet(this, null, 0, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isContainer()) { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+		if (new<%=genFeature.getCapName()%> != eInternalContainer() || (eContainerFeatureID() != <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%> && new<%=genFeature.getCapName()%> != null))
+		{
+			if (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil")%>.isAncestor(this, <%=genFeature.getEObjectCast()%>new<%=genFeature.getCapName()%>))
+				throw new <%=genModel.getImportedName("java.lang.IllegalArgumentException")%>("Recursive containment not allowed for " + toString());<%=genModel.getNonNLS()%>
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (new<%=genFeature.getCapName()%> != null)
+				msgs = <%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true)%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+        <%if (!genModel.isSuppressNotification()) {%>
+		else if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
+        <%}%>
+      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (new<%=genFeature.getCapName()%> != <%=genFeature.getSafeName()%>)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
+			if (<%=genFeature.getSafeName()%> != null)
+        <%if (!genFeature.isBidirectional()) {%>
+				msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+			if (new<%=genFeature.getCapName()%> != null)
+				msgs = <%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true)%>.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+				msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+			if (new<%=genFeature.getCapName()%> != null)
+				msgs = <%=genFeature.getAsInternalEObject("new" + genFeature.getCapName(), true)%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+        <%}%>
+			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+        <%if (genFeature.isUnsettable()) {%>
+		else
+		{
+          <%if (genModel.isVirtualDelegation()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+          <%} else if (genClass.isESetFlag(genFeature)) {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+            <%}%>
+			<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
+          <%} else {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+            <%}%>
+			<%=genFeature.getUncapName()%>ESet = true;
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+			if (eNotificationRequired())
+				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>, !old<%=genFeature.getCapName()%>ESet));
+          <%}%>
+		}
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		else if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
+          <%}%>
+        <%}%>
+      <%} else {%>
+        <%if (genClass.isFlag(genFeature)) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
+            <%} else {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET];
+            <%}%>
+          <%}%>
+          <%if (genFeature.isBooleanType()) {%>
+		if (new<%=genFeature.getCapName()%>) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
+          <%} else {%>
+		if (new<%=genFeature.getCapName()%> == null) new<%=genFeature.getCapName()%> = <%=genFeature.getUpperName()%>_EDEFAULT;
+		<%=genClass.getFlagsField(genFeature)%> = <%=genClass.getFlagsField(genFeature)%> & ~<%=genFeature.getUpperName()%>_EFLAG | <%if (isJDK50) {%>new<%=genFeature.getCapName()%>.ordinal()<%} else {%><%=genFeature.getImportedType(genClass)%>.VALUES.indexOf(new<%=genFeature.getCapName()%>)<%}%> << <%=genFeature.getUpperName()%>_EFLAG_OFFSET;
+          <%}%>
+        <%} else {%>
+          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+            <%}%>
+          <%}%>
+          <%if (genFeature.isEnumType()) {%>
+            <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getEDefault()%> : new<%=genFeature.getCapName()%>;
+            <%} else {%>
+		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getEDefault()%> : new<%=genFeature.getCapName()%>;
+            <%}%>
+          <%} else {%>
+            <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
+            <%} else {%>
+		<%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
+            <%}%>
+          <%}%>
+          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%>);
+          <%}%>
+        <%}%>
+        <%if (genFeature.isUnsettable()) {%>
+          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
+          <%} else if (genClass.isESetFlag(genFeature)) {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+            <%}%>
+		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
+          <%} else {%>
+            <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+            <%}%>
+		<%=genFeature.getUncapName()%>ESet = true;
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? <%=genFeature.getEDefault()%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>));
+          <%}%>
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? <%=genFeature.getEDefault()%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>));
+          <%}%>
+        <%}%>
+      <%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.post.insert" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+      <%} else {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (!isJDK50 && genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType(genClass)%>(<%}%>new<%=genFeature.getCapName()%><%if (!isJDK50 && genFeature.isPrimitiveType()) {%>)<%}%>);
+      <%}%>
+    <%} else if (setAccessorOperation != null) {%>
+		<%=setAccessorOperation.getBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.TODO.override" args="setAccessorOperation:setAccessorOperation,genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/setGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._AvxAxHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._AvxAxHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yPi8GJ-Ed-FqczH3ESmRw/method._AvxAxHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT82J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT82J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT82J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT8mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT9WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT9WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZT9WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZUAmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZUAmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..ae5e740
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._0yZUAmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,25 @@
+
+
+	/**
+	 * Sets the value of the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.javadoc.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
+    <%if (genFeature.isEnumType()) {%>
+	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
+    <%}%>
+    <%if (genFeature.isUnsettable()) {%>
+      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
+	 * @see #isSet<%=genFeature.getAccessorName()%>()
+      <%}%>
+      <%if (!genFeature.isSuppressedUnsetVisibility()) {%>
+	 * @see #unset<%=genFeature.getAccessorName()%>()
+      <%}%>
+    <%}%>
+	 * @see #<%=genFeature.getGetAccessor()%>()
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._BAT-NHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._BAT-NHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yZT8GJ-Ed-FqczH3ESmRw/method._BAT-NHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J02J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J02J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J02J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J1WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J1WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J1WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._0y_J42J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._BKJPpHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._BKJPpHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J0GJ-Ed-FqczH3ESmRw/method._BKJPpHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J52J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J52J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J52J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J6GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J6GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0y_J6GJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI60GJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI60GJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI60GJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI63mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI63mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..2524a90
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._0zI63mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this method to set the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._BQGttHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._BQGttHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0y_J5WJ-Ed-FqczH3ESmRw/method._BQGttHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._0yid8mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._BGamNHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._BGamNHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0yid4GJ-Ed-FqczH3ESmRw/method._BGamNHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO42J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO42J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO42J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO4mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO4mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO4mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO5WJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO5WJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO5WJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO8mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO8mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._0ysO8mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._BH6bBHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._BH6bBHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0ysO4GJ-Ed-FqczH3ESmRw/method._BH6bBHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hs2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hs2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hs2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hsmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hsmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hsmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4htWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4htWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4htWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..315caef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._0z4hwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,151 @@
+
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.javadoc.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/unsetGenFeature.javadoc.override.javajetinc%>
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/unsetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (!isImplementation) {%>
+	void unset<%=genFeature.getAccessorName()%>();
+
+<%} else {%>
+  <%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry() && !genClass.hasCollidingUnsetAccessorOperation(genFeature) && !genFeature.isSuppressedUnsetVisibility()) {%>
+	@Override
+  <%}%>
+	public void unset<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingUnsetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+    <%if (genModel.isDynamicDelegation() && !genFeature.isVolatile()) {%>
+		eDynamicUnset(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (genClass.hasStaticFeatures()){%> - ESTATIC_FEATURE_COUNT<%}%>, <%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genModel.isReflectiveDelegation()) {%>
+		eUnset(<%=genFeature.getQualifiedFeatureAccessor()%>);
+    <%} else if (genFeature.hasSettingDelegate()) {%>
+		<%=genFeature.getUpperName()%>__ESETTING_DELEGATE.dynamicUnset(this, null, 0);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> != null) ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable<%=singleWildcard%>)<%=genFeature.getSafeName()%>).unset();
+      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> != null)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
+        <%if (!genFeature.isBidirectional()) {%>
+			msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+			msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+        <%}%>
+			msgs = basicUnset<%=genFeature.getAccessorName()%>(msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else
+		{
+        <%if (genModel.isVirtualDelegation()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%} else if (genClass.isESetFlag(genFeature)) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+          <%}%>
+			<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+          <%}%>
+			<%=genFeature.getUncapName()%>ESet = false;
+        <%}%>
+        <%if (!genModel.isSuppressNotification()) {%>
+			if (eNotificationRequired())
+				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, null, null, old<%=genFeature.getCapName()%>ESet));
+        <%}%>
+		}
+      <%} else {%>
+        <%if (genClass.isFlag(genFeature)) {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
+            <%} else {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET];
+            <%}%>
+          <%}%>
+        <%} else if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		Object old<%=genFeature.getCapName()%> = eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%} else {%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+          <%}%>
+        <%}%>
+       <%if (!genModel.isSuppressNotification()) {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
+          <%} else if (genClass.isESetFlag(genFeature)) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+          <%} else {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+          <%}%>
+        <%}%>
+        <%if (genFeature.isReferenceType()) {%>
+		<%=genFeature.getSafeName()%> = null;
+          <%if (!genModel.isVirtualDelegation()) {%>
+            <%if (genClass.isESetFlag(genFeature)) {%>
+		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+            <%} else {%>
+		<%=genFeature.getUncapName()%>ESet = false;
+            <%}%>
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
+          <%}%>
+        <%} else {%>
+          <%if (genClass.isFlag(genFeature)) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		if (<%=genFeature.getEDefault()%>) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
+            <%} else {%>
+		<%=genClass.getFlagsField(genFeature)%> = <%=genClass.getFlagsField(genFeature)%> & ~<%=genFeature.getUpperName()%>_EFLAG | <%=genFeature.getUpperName()%>_EFLAG_DEFAULT;
+            <%}%>
+          <%} else if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
+		<%=genFeature.getSafeName()%> = <%=genFeature.getEDefault()%>;
+          <%}%>
+          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
+            <%if (genClass.isESetFlag(genFeature)) {%>
+		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+            <%} else {%>
+		<%=genFeature.getUncapName()%>ESet = false;
+            <%}%>
+          <%}%>
+          <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? old<%=genFeature.getCapName()%> : <%=genFeature.getEDefault()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%=genFeature.getEDefault()%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
+          <%}%>
+        <%}%>
+      <%}%>
+    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
+      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%} else {%>
+		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
+      <%}%>
+    <%} else if (genClass.getUnsetAccessorOperation(genFeature) != null) {%>
+		<%=genClass.getUnsetAccessorOperation(genFeature).getBody(genModel.getIndentation(stringBuffer))%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.unsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/unsetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._BVnf1HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._BVnf1HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0z4hsGJ-Ed-FqczH3ESmRw/method._BVnf1HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSE0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSE0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..f73583b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSE0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,57 @@
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicUnsetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicUnset<%=genFeature.getAccessorName()%>(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+    <%if (genModel.isDynamicDelegation()) {%>
+		return eDynamicInverseRemove(<%=genFeature.getAsInternalEObject("", false)%><%if (genFeature.isResolveProxies()) {%>basicGet<%=genFeature.getAccessorName()%><%} else {%><%=genFeature.getGetAccessor()%><%}%>(), <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+    <%} else if (!genFeature.isVolatile()) {%>
+      <%if (genModel.isVirtualDelegation()) {%>
+        <%if (!genModel.isSuppressNotification()) {%>Object old<%=genFeature.getCapName()%> = <%}%>eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+      <%} else {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		<%=genFeature.getImportedType(genClass)%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
+        <%}%>
+		<%=genFeature.getSafeName()%> = null;
+      <%}%>
+      <%if (genModel.isVirtualDelegation()) {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
+        <%}%>
+      <%} else if (genClass.isESetFlag(genFeature)) {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
+        <%}%>
+		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
+      <%} else {%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
+        <%}%>
+		<%=genFeature.getUncapName()%>ESet = false;
+      <%}%>
+        <%if (!genModel.isSuppressNotification()) {%>
+		if (eNotificationRequired())
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+        <%}%>
+    <%} else {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicUnsetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/basicUnsetGenFeature.todo.override.javajetinc%>
+    <%}%>
+	}
+
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEw2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEw2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEw2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSEwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSExWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSExWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._0zSExWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._BR5ddHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._BR5ddHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zSEwGJ-Ed-FqczH3ESmRw/method._BR5ddHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb10mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb10mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb10mJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1w2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1w2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1w2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1wmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1wmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1wmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1xWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1xWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._0zb1xWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._BS7_RHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._BS7_RHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zb1wGJ-Ed-FqczH3ESmRw/method._BS7_RHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlm0mJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlm0mJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..89c17da
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlm0mJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,8 @@
+
+
+		// TODO: implement this method to unset the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
+		// -> this method is automatically invoked to keep the containment relationship in synch
+		// -> do not modify other features
+		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmw2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmw2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmw2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmwmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmwmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmwmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmxWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmxWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._0zlmxWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._BUISFHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._BUISFHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._0zlmwGJ-Ed-FqczH3ESmRw/method._BUISFHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bcck2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bcck2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bcck2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcckmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcckmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcckmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcclWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcclWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1BcclWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bccm2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bccm2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._1Bccm2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._CVZh1HLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._CVZh1HLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BcckGJ-Ed-FqczH3ESmRw/method._CVZh1HLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmg2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmg2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmg2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmgmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmgmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmgmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmhWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmhWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1BlmhWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmi2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmi2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..19002e7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._1Blmi2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._CWSSpHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._CWSSpHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BlmgGJ-Ed-FqczH3ESmRw/method._CWSSpHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXg2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXg2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXg2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXgmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXgmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXgmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXhWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXhWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXhWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXi2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXi2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..925b0f0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._1BvXi2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,23 @@
+
+
+
+	/**
+	 * Tests the '{@link <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#isSet<%=genFeature.getAccessorName()%>() <em>isSet<%=genFeature.getAccessorName()%>()</em>}' method.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#isSet<%=genFeature.getAccessorName()%>()
+      <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+      <%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/isSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+      <%}%>
+      <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	public void testIsSet<%=genFeature.getAccessorName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.isSetGenFeature.TODO.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/isSetGenFeature.todo.override.javajetinc%>
+	}
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._CY-aRHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._CY-aRHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1BvXgGJ-Ed-FqczH3ESmRw/method._CY-aRHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qU2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qU2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qU2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qUmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qVWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qVWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qVWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qW2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qW2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._1C7qW2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._CgILJHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._CgILJHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1C7qUGJ-Ed-FqczH3ESmRw/method._CgILJHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDc2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDc2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDc2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDcmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDcmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDcmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDdWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDdWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDdWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDe2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDe2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._1CMDe2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._CanZBHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._CanZBHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CMDcGJ-Ed-FqczH3ESmRw/method._CanZBHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-Y2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-Y2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-Y2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-YmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-YmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-YmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-ZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-ZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-ZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-a2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-a2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..19002e7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._1Ce-a2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._CcGmxHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._CcGmxHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Ce-YGJ-Ed-FqczH3ESmRw/method._CcGmxHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovY2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovY2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovY2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovYmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovYmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovYmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovZWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovZWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1CovZWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1Cova2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1Cova2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._1Cova2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._CdcDhHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._CdcDhHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1CovYGJ-Ed-FqczH3ESmRw/method._CdcDhHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5U2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5U2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5U2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5UmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5UmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5UmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5VWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5VWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5VWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5W2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5W2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..fd7ef3b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._1Cx5W2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,24 @@
+
+
+
+	/**
+	 * Tests the '{@link <%=genOperation.getGenClass().getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genOperation.getGenClass().getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+      <%if (genOperation.hasAPITags()) {%>
+	 * <%=genOperation.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+  <%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) { //TestCase/genOperation.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.genOperation.annotations.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+  <%}%>
+      <%if (isJDK50 && genOperation.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	public void test<%=genClass.getUniqueName(genOperation)%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.TODO.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/implementedGenOperation.todo.override.javajetinc%>
+	}
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.insert" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._CeVbZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._CeVbZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1Cx5UGJ-Ed-FqczH3ESmRw/method._CeVbZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbU2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbU2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbU2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbUmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbUmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbUmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbVWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbVWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbVWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbW2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbW2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..595c9ce
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._1DFbW2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1,5 @@
+
+
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._CjtDlHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._CjtDlHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DFbUGJ-Ed-FqczH3ESmRw/method._CjtDlHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQ2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlRWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlRWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlRWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlS2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlS2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._1DOlS2J-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._Ckl0ZHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._Ckl0ZHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DOlQGJ-Ed-FqczH3ESmRw/method._Ckl0ZHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQ2J-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQ2J-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQ2J-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWQmJ-Ed-FqczH3ESmRw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWRWJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWRWJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWRWJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWSmJ-Ed-FqczH3ESmRw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWSmJ-Ed-FqczH3ESmRw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._1DYWSmJ-Ed-FqczH3ESmRw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._ClCgVHLZEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._ClCgVHLZEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._1DYWQGJ-Ed-FqczH3ESmRw/method._ClCgVHLZEd-09ds9dfYpFw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsLUk-XDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsLUk-XDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsLUk-XDEeCxnsoQRwU99Q.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFk-XDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFk-XDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFk-XDEeCxnsoQRwU99Q.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkOXDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkOXDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkOXDEeCxnsoQRwU99Q.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkeXDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkeXDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFkeXDEeCxnsoQRwU99Q.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFouXDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFouXDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..02b371f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._BsLUkeXDEeCxnsoQRwU99Q/method._BsVFouXDEeCxnsoQRwU99Q.pt
@@ -0,0 +1,44 @@
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
+ * <!-- end-user-doc -->
+<%if (genClass.hasDocumentation()) {%>
+ *
+ * <!-- begin-model-doc -->
+ * <%=genClass.getDocumentation(genModel.getIndentation(stringBuffer))%>
+ * <!-- end-model-doc -->
+<%}%>
+ *
+<%if (!genClass.getGenFeatures().isEmpty()) {%>
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+<%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+  <%if (!genFeature.isSuppressedGetVisibility()) {%>
+ *   <li>{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
+  <%}%>
+<%}%>
+ * </ul>
+<%}%>
+ *
+<%if (!genModel.isSuppressEMFMetaData()) {%>
+ * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genClass.getClassifierAccessorName()%>()
+<%}%>
+<%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+ * @model <%=modelInfo%>
+<%} else {%>
+ *        <%=modelInfo%>
+<%}} if (first) {%>
+ * @model
+<%}}%>
+<%if (genClass.needsRootExtendsInterfaceExtendsTag()) {%>
+ * @extends <%=genModel.getImportedName(genModel.getRootExtendsInterface())%>
+<%}%>
+<%if (genClass.hasImplicitAPITags(true)) {%>
+ * <%=genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer), true)%>
+<%}%>
+ * @generated
+ */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO4-XDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO4-XDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO4-XDEeCxnsoQRwU99Q.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5-XDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5-XDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5-XDEeCxnsoQRwU99Q.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5OXDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5OXDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5OXDEeCxnsoQRwU99Q.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5eXDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5eXDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO5eXDEeCxnsoQRwU99Q.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO9uXDEeCxnsoQRwU99Q.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO9uXDEeCxnsoQRwU99Q.pt
new file mode 100644
index 0000000..02b371f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._C2iO4eXDEeCxnsoQRwU99Q/method._C2iO9uXDEeCxnsoQRwU99Q.pt
@@ -0,0 +1,44 @@
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
+ * <!-- end-user-doc -->
+<%if (genClass.hasDocumentation()) {%>
+ *
+ * <!-- begin-model-doc -->
+ * <%=genClass.getDocumentation(genModel.getIndentation(stringBuffer))%>
+ * <!-- end-model-doc -->
+<%}%>
+ *
+<%if (!genClass.getGenFeatures().isEmpty()) {%>
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+<%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+  <%if (!genFeature.isSuppressedGetVisibility()) {%>
+ *   <li>{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
+  <%}%>
+<%}%>
+ * </ul>
+<%}%>
+ *
+<%if (!genModel.isSuppressEMFMetaData()) {%>
+ * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genClass.getClassifierAccessorName()%>()
+<%}%>
+<%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+ * @model <%=modelInfo%>
+<%} else {%>
+ *        <%=modelInfo%>
+<%}} if (first) {%>
+ * @model
+<%}}%>
+<%if (genClass.needsRootExtendsInterfaceExtendsTag()) {%>
+ * @extends <%=genModel.getImportedName(genModel.getRootExtendsInterface())%>
+<%}%>
+<%if (genClass.hasImplicitAPITags(true)) {%>
+ * <%=genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer), true)%>
+<%}%>
+ * @generated
+ */
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM03roEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM03roEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM03roEeC0XN9kbwkPYQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM0nroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM0nroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM0nroEeC0XN9kbwkPYQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1HroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1HroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1HroEeC0XN9kbwkPYQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1nroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1nroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM1nroEeC0XN9kbwkPYQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM4XroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM4XroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..8e4ecfb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._JLBM0HroEeC0XN9kbwkPYQ/method._JLBM4XroEeC0XN9kbwkPYQ.pt
@@ -0,0 +1,3 @@
+
+
+		super();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da03roEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da03roEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da03roEeC0XN9kbwkPYQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da0nroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da0nroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da0nroEeC0XN9kbwkPYQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1HroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1HroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1HroEeC0XN9kbwkPYQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1nroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1nroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da1nroEeC0XN9kbwkPYQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da4XroEeC0XN9kbwkPYQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da4XroEeC0XN9kbwkPYQ.pt
new file mode 100644
index 0000000..8e4ecfb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._K9da0HroEeC0XN9kbwkPYQ/method._K9da4XroEeC0XN9kbwkPYQ.pt
@@ -0,0 +1,3 @@
+
+
+		super();
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._06ILSWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._06ILSWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._06ILSWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._8vBvNHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._8vBvNHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..692d9a7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._8vBvNHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genModel.hasPluginSupport());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9tzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9uTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9uTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Pcm9uTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..3e8531f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getModelProjectDirectory() + "/build.properties";
+overwrite = genModel.isUpdateClasspath() && !new CodegenGeneratorAdapter(parameter).exists(new CodegenGeneratorAdapter(parameter).toURI(genModel.getModelProjectDirectory()).appendSegment("plugin.xml"));
+encoding = "ISO-8859-1";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..4ab8c36
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._PcwusjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,38 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getModelPluginID()+".jar" : ".";%>
+<%List<String> sourceFolders = genModel.getModelSourceFolders();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+bin.includes = <%=pluginClassesLocation%>,\
+               model/,\
+<%if (genModel.sameModelEditProject() || genModel.sameModelEditorProject()) {%>
+               icons/,\
+<%}%>
+<%if (genModel.isBundleManifest()) {%>
+               META-INF/,\
+<%}%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+               plugin.xml,\
+<%}%>
+<%String modelBundleLocalization = genModel.getModelBundleLocalization(); int index = modelBundleLocalization.indexOf("/"); if (index == -1) {%>
+               <%=modelBundleLocalization%>.properties
+<%} else {%>
+               <%=modelBundleLocalization.substring(0, index + 1)%>
+<%}%>
+jars.compile.order = <%=pluginClassesLocation%>
+<% boolean first=true; for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) { String sourceFolder = i.next(); if (i.hasNext()){sourceFolder +=",\\";} if (first) {%>
+source.<%=pluginClassesLocation%> = <%=sourceFolder%><%first=false;} else {%><%=sourceFolder%><%}}%>
+output.<%=pluginClassesLocation%> = bin/
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Sq2-OGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Sq2-OGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pcm9tDG0Ed-kc8dEZsdm2w/method._Sq2-OGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._05rfVmKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._05rfVmKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._05rfVmKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._8qZt5HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._8qZt5HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..8e2b4dc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._8qZt5HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genModel.isBundleManifest()) && (genModel.hasPluginSupport() && !genModel.sameModelEditProject() && !genModel.sameModelEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpojG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpojG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpojG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpozG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpozG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpozG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ae7bb79
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDppzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getModelProjectDirectory() + "/META-INF/MANIFEST.MF";
+overwrite = genModel.isUpdateClasspath();
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpqTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpqTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..a4e6118
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._PdDpqTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,54 @@
+
+<%
+/**
+ * Copyright (c) 2005-2007 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: <%=genModel.getModelBundleNameKey()%>
+Bundle-SymbolicName: <%=genModel.getModelPluginID()%>;singleton:=true
+Automatic-Module-Name: <%=genModel.getModelPluginID()%>
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: <%if (genModel.isRuntimeJar()) {%><%=genModel.getModelPluginID()%>.jar<%}else{%>.<%}%>
+<%if (genModel.hasModelPluginClass()) {%>
+Bundle-Activator: <%=genModel.getQualifiedModelPluginClassName()%>$Implementation<%if (genModel.isOSGiCompatible()) {%>$Activator<%}%>
+<%}%>
+Bundle-Vendor: <%=genModel.getModelBundleVendorKey()%>
+Bundle-Localization: <%=genModel.getModelBundleLocalization()%>
+<%if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-9
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+<%}%>
+<%Iterator<String> packagesIterator = genModel.getModelQualifiedPackageNames().iterator(); if (packagesIterator.hasNext()) { String pack = packagesIterator.next();%>
+Export-Package: <%=pack%><%while(packagesIterator.hasNext()) { pack = packagesIterator.next();%>,
+ <%=pack%><%}%>
+<%}%>
+<%Iterator<String> requiredPluginIterator = genModel.getModelRequiredPlugins().iterator(); if (requiredPluginIterator.hasNext()) { String pluginID = requiredPluginIterator.next();%>
+Require-Bundle: <%=pluginID%><%if (pluginID.startsWith("org.eclipse.core.runtime")) {if (genModel.isOSGiCompatible()) {%>;resolution:=optional;x-installation:=greedy<%}} else {%>;visibility:=reexport<%} while(requiredPluginIterator.hasNext()) { pluginID = requiredPluginIterator.next();%>,
+ <%=pluginID%><%if (pluginID.startsWith("org.eclipse.core.runtime")) {if (genModel.isOSGiCompatible()) {%>;resolution:=optional;x-installation:=greedy<%}} else if (!pluginID.equals("org.eclipse.xtext.xbase.lib") && !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {%>;visibility:=reexport<%}}%>
+<%}%>
+<%if (genModel.isOSGiCompatible() && genModel.hasModelPluginClass()) {%>
+Import-Package: org.osgi.framework
+<%}%>
+<%if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22 || genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {%>
+Eclipse-LazyStart: true
+<%}%>
+Bundle-ActivationPolicy: lazy
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._SrAvOGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._SrAvOGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdDpoDG0Ed-kc8dEZsdm2w/method._SrAvOGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._06R8SWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._06R8SWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._06R8SWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._8mrriXLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._8mrriXLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..2302c81
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._8mrriXLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) && (genModel.hasPluginSupport() && !genModel.sameModelEditProject() && !genModel.sameModelEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaojG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaojG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaojG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaozG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaozG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdNaozG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLoTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLoTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLoTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLozG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLozG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..65e34ed
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLozG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getModelProjectDirectory() + "/plugin.xml";
+overwrite = true;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLpTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLpTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..25a9198
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._PdXLpTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,111 @@
+
+<%
+/**
+ * Copyright (c) 2002-2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; String key = genModel.getPluginKey(); boolean hasKey = key != null && !key.equals(""); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<%if (genModel.isBundleManifest()) {%>
+<plugin>
+<%} else {%>
+<plugin
+      name="%pluginName"
+      id="<%=genModel.getModelPluginID()%>"
+      version="1.0.0"
+  <%if (genModel.hasModelPluginClass()) { %>
+      provider-name="%providerName"
+      class="<%=genModel.getQualifiedModelPluginClassName()%>$Implementation">
+  <%} else {%>
+      provider-name="%providerName">
+  <%}%>
+
+   <requires>
+  <%for (String pluginID : genModel.getModelRequiredPlugins()) {%>
+      <import plugin="<%=pluginID%>"<%if (!pluginID.startsWith("org.eclipse.core.runtime")) {%> export="true"<%}%>/>
+  <%}%>
+   </requires>
+
+   <runtime>
+  <%if (genModel.isRuntimeJar()) {%>
+      <library name="<%=genModel.getModelPluginID()%>.jar">
+  <%} else {%>
+      <library name=".">
+  <%}%>
+         <export name="*"/>
+      </library>
+   </runtime>
+<%}%>
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <package
+            uri="<%=genPackage.getNSURI()%>"
+  <%if (genModel.hasLocalGenModel()) {%>
+            class="<%=genPackage.getQualifiedPackageInterfaceName()%>"
+            genModel="<%=genModel.getRelativeGenModelLocation()%>"/>
+  <%} else {%>
+            class="<%=genPackage.getQualifiedPackageInterfaceName()%>"/>
+  <%}%>
+   </extension>
+  <%if (genPackage.isContentType()) {%>
+
+   <extension point="org.eclipse.emf.ecore.content_parser">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <parser
+            contentTypeIdentifier="<%=genPackage.getContentTypeIdentifier()%>"
+            class="<%=genPackage.getQualifiedEffectiveResourceFactoryClassName()%>"/>
+   </extension>
+
+   <extension point="org.eclipse.core.contenttype.contentTypes">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <content-type
+            base-type="<%=genPackage.isXMIResource() ? "org.eclipse.emf.ecore.xmi" : "org.eclipse.core.runtime.xml"%>"
+            file-extensions="<%=genPackage.getFileExtensions()%>"
+            id="<%=genPackage.getContentTypeIdentifier()%>"
+            name="%_UI_<%=genPackage.getPrefix()%>_content_type"
+            priority="normal">
+         <describer class="org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer">
+    <%if (genPackage.hasTargetNamespace()) {%>
+            <parameter name="namespace" value="<%=genPackage.getNSURI()%>"/>
+    <%}%>
+    <%if (genPackage.isXMIResource()) {%>
+            <parameter name="kind" value="xmi"/>
+    <%}%>
+         </describer>
+      </content-type>
+   </extension>
+  <%} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {%>
+
+   <extension point="org.eclipse.emf.ecore.extension_parser">
+    <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+    <%}%>
+    <%for (String fileExtension : genPackage.getFileExtensionList()) {%>
+      <parser
+            type="<%=fileExtension%>"
+            class="<%=genPackage.getQualifiedResourceFactoryClassName()%>"/>
+    <%}%>
+   </extension>
+  <%}%>
+<%}%>
+
+</plugin>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._SqaSS2KPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._SqaSS2KPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdNaoDG0Ed-kc8dEZsdm2w/method._SqaSS2KPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._06k3OWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._06k3OWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._06k3OWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._8zCshHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._8zCshHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..692d9a7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._8zCshHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genModel.hasPluginSupport());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVkzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e97c3de
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVlzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getModelProjectDirectory() + "/" + genModel.getModelBundleLocalization()+ ".properties";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVmTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVmTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..2f0b3c1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._PdgVmTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,26 @@
+
+<%
+/**
+ * Copyright (c) 2002-2004 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+pluginName = <%=genModel.getModelBundleName()%>
+providerName = <%=genModel.getModelBundleVendorName()%>
+<%boolean first = true; for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.isContentType()) {%>
+    <%if (first) { first = false;%>
+
+    <%}%>
+_UI_<%=genPackage.getPrefix()%>_content_type = <%=genPackage.getPrefix()%> File
+  <%}%>
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._SrTqKGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._SrTqKGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdgVkDG0Ed-kc8dEZsdm2w/method._SrTqKGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._09HN2WKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._09HN2WKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._09HN2WKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._89Lf9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._89Lf9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..449324b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._89Lf9HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQgzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..4466696
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQhzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getReflectionClassPackageName();
+className = genPackage.getPackageClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQiTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQiTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..90684dd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._PdzQiTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,1348 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%final GenPackage genPackage = (GenPackage)((Object[])argument)[0]; final GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]);  boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+<%boolean packageNeedsSuppressDeprecation = isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getOrderedGenClassifiers()) && !genPackage.hasAPIDeprecatedTag() && !genModel.isSuppressEMFMetaData();%>
+<%String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+<%boolean needsAddEOperation = false;%>
+<%boolean needsAddEParameter = false;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%if (isImplementation && !genModel.isSuppressInterfaces()) {%>
+package <%=genPackage.getClassPackageName()%>;
+<%} else {%>
+package <%=genPackage.getReflectionPackageName()%>;
+<%}%>
+
+<%genModel.markImportLocation(stringBuffer, genPackage);%>
+<%if (isImplementation) {%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Registry");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Descriptor");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.EPackageImpl.EBasicWhiteList");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");%>
+  <%if (genPackage.isLiteralsInterface()) {%>
+<%genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + ".Literals");%>
+  <%}%>
+<%for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + "." + genPackage.getClassifierID(genClassifier));%>
+<%}%>
+<%if (isInterface) {%>
+
+/**
+ * <!-- 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>
+  <%if (genModel.isOperationReflection()) {%>
+ *   <li>each operation of each class,</li>
+  <%}%>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+<%if (genPackage.hasDocumentation()) {%>
+ * <!-- begin-model-doc -->
+ * <%=genPackage.getDocumentation(genModel.getIndentation(stringBuffer))%>
+ * <!-- end-model-doc -->
+<%}%>
+ * @see <%=genPackage.getQualifiedFactoryInterfaceName()%>
+  <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genPackage.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+ * @model <%=modelInfo%>
+  <%} else {%>
+ *        <%=modelInfo%>
+  <%}} if (first) {%>
+ * @model
+  <%}}%>
+ * @generated
+ */
+<%} else {%>
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%}%>
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+  <%if (packageNeedsSuppressDeprecation) {%>
+@SuppressWarnings("deprecation")
+  <%}%>
+public class <%=genPackage.getPackageClassName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageImpl")%><%if (!isInterface){%> implements <%=genPackage.getImportedPackageInterfaceName()%><%}%>
+<%} else {%>
+public interface <%=genPackage.getPackageInterfaceName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isInterface) {%>
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eNAME = "<%=genPackage.getPackageName()%>";<%=genModel.getNonNLS()%>
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eNS_URI = "<%=genPackage.getNSURI()%>";<%=genModel.getNonNLS()%>
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eNS_PREFIX = "<%=genPackage.getNSName()%>";<%=genModel.getNonNLS()%>
+  <%if (genPackage.isContentType()) {%>
+
+	/**
+	 * The package content type ID.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eCONTENT_TYPE = "<%=genPackage.getContentTypeIdentifier()%>";<%=genModel.getNonNLS()%>
+  <%}%>
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getPackageInterfaceName()%> eINSTANCE = <%=genPackage.getQualifiedPackageClassName()%>.init();
+
+  <%for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) {%>
+	/**
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%if (!genClass.isInterface()) {%>
+	 * The meta object id for the '{@link <%=genClass.getQualifiedClassName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genClass.getQualifiedClassName()%>
+      <%} else {%>
+	 * The meta object id for the '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%>
+      <%}%>
+    <%} else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;%>
+	 * The meta object id for the '{@link <%=genEnum.getQualifiedName()%> <em><%=genEnum.getFormattedName()%></em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genEnum.getQualifiedName()%>
+    <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+	 * The meta object id for the '<em><%=genDataType.getFormattedName()%></em>' data type.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+      <%if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {%>
+	 * @see <%=genDataType.getRawInstanceClassName()%>
+      <%}%>
+    <%}%>
+	 * @see <%=genPackage.getQualifiedPackageClassName()%>#get<%=genClassifier.getClassifierAccessorName()%>()
+  <%if (genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genPackage.getClassifierID(genClassifier)%> = <%=genPackage.getClassifierValue(genClassifier)%>;
+
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%for (GenFeature genFeature : genClass.getAllGenFeatures()) {%>
+	/**
+	 * The feature id for the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasImplicitAPITags()) {%>
+	 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getFeatureID(genFeature)%> = <%=genClass.getFeatureValue(genFeature)%>;
+
+      <%}%>
+	/**
+	 * The number of structural features of the '<em><%=genClass.getFormattedName()%></em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getFeatureCountID()%> = <%=genClass.getFeatureCountValue()%>;
+
+      <%if (genModel.isOperationReflection()) {%>
+        <%for (GenOperation genOperation : genClass.getAllGenOperations(false)) {%>
+          <%if (genClass.getOverrideGenOperation(genOperation) == null) {%>
+	/**
+	 * The operation id for the '<em><%=genOperation.getFormattedName()%></em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genOperation.hasImplicitAPITags()) {%>
+	 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getOperationID(genOperation, false)%> = <%=genClass.getOperationValue(genOperation)%>;
+
+          <%}%>
+        <%}%>
+	/**
+	 * The number of operations of the '<em><%=genClass.getFormattedName()%></em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getOperationCountID()%> = <%=genClass.getOperationCountValue()%>;
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (isImplementation) {%>
+  <%if (genPackage.isLoadingInitialization()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected String packageFilename = "<%=genPackage.getSerializedPackageFilename()%>";<%=genModel.getNonNLS()%>
+
+  <%}%>
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClassifier.hasAPITags(true)) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer), true)%>
+    <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	private <%=genClassifier.getImportedMetaType()%> <%=genClassifier.getClassifierInstanceName()%> = 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 <%=genPackage.getQualifiedPackageInterfaceName()%>#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private <%=genPackage.getPackageClassName()%>()
+	{
+		super(eNS_URI, <%=genPackage.getQualifiedEFactoryInstanceAccessor()%>);
+	}
+
+	/**
+	 * <!-- 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 <%=genPackage.getImportedPackageInterfaceName()%>#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
+  <%if (!genPackage.isLoadedInitialization()) {%>
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+  <%}%>
+	 * @generated
+	 */
+	public static <%=genPackage.getImportedPackageInterfaceName()%> init()
+	{
+		if (isInited) return (<%=genPackage.getImportedPackageInterfaceName()%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI);
+
+    <%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+		initializeRegistryHelpers();
+
+    <%}%>
+		// Obtain or create and register package
+		Object registered<%=genPackage.getBasicPackageName()%> = <%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.get(eNS_URI);
+		<%=genPackage.getPackageClassName()%> the<%=genPackage.getBasicPackageName()%> = registered<%=genPackage.getBasicPackageName()%> instanceof <%=genPackage.getPackageClassName()%> ? (<%=genPackage.getPackageClassName()%>)registered<%=genPackage.getBasicPackageName()%> : new <%=genPackage.getPackageClassName()%>();
+
+		isInited = true;
+
+    <%if (!genPackage.getPackageSimpleDependencies().isEmpty()) {%>
+		// Initialize simple dependencies
+    <%for (GenPackage dep : genPackage.getPackageSimpleDependencies()) {%>
+		<%=dep.getImportedPackageInterfaceName()%>.eINSTANCE.eClass();
+    <%}%>
+
+  <%}%>
+  <%if (!genPackage.getPackageInterDependencies().isEmpty()) {%>
+		// Obtain or create and register interdependencies
+    <%for (ListIterator<GenPackage> i = genPackage.getPackageInterDependencies().listIterator(); i.hasNext(); ) { GenPackage interdep = i.next(); %>
+		<%if (i.previousIndex() == 0) {%>Object <%}%>registeredPackage = <%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=interdep.getImportedPackageInterfaceName()%>.eNS_URI);
+		<%=interdep.getImportedPackageClassName()%> <%=genPackage.getPackageInstanceVariable(interdep)%> = (<%=interdep.getImportedPackageClassName()%>)(registeredPackage instanceof <%=interdep.getImportedPackageClassName()%> ? registeredPackage : <%=interdep.getImportedPackageInterfaceName()%>.eINSTANCE);
+    <%}%>
+
+  <%}%>
+  <%if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {%>
+		// Load packages
+    <%if (genPackage.isLoadingInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.loadPackage();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {%>
+      <%if (interdep.isLoadingInitialization()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.loadPackage();
+      <%}%>
+    <%}%>
+
+  <%}%>
+  <%if (!genPackage.isLoadedInitialization() || !genPackage.getPackageBuildInterDependencies().isEmpty()) {%>
+		// Create package meta-data objects
+    <%if (!genPackage.isLoadedInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.createPackageContents();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.createPackageContents();
+    <%}%>
+
+		// Initialize created meta-data
+    <%if (!genPackage.isLoadedInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.initializePackageContents();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.initializePackageContents();
+    <%}%>
+
+  <%}%>
+  <%if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {%>
+		// Fix loaded packages
+    <%if (genPackage.isLoadedInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.fixPackageContents();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.fixPackageContents();
+    <%}%>
+
+  <%}%>
+  <%if (genPackage.hasConstraints()) {%>
+		// Register package validator
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EValidator")%>.Registry.INSTANCE.put
+			(the<%=genPackage.getBasicPackageName()%>,
+			 new <%=genModel.getImportedName("org.eclipse.emf.ecore.EValidator")%>.Descriptor()
+			 {
+ <%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				 @Override
+ <%}%>
+				 public <%=genModel.getImportedName("org.eclipse.emf.ecore.EValidator")%> getEValidator()
+				 {
+					 return <%=genPackage.getImportedValidatorClassName()%>.INSTANCE;
+				 }
+			 });
+
+  <%}%>
+  <%if (!genPackage.isEcorePackage()) {%>
+		// Mark meta-data to indicate it can't be changed
+		the<%=genPackage.getBasicPackageName()%>.freeze();
+
+  <%}%>
+		// Update the registry and return the package
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.put(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI, the<%=genPackage.getBasicPackageName()%>);
+		return the<%=genPackage.getBasicPackageName()%>;
+	}
+  <%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void initializeRegistryHelpers()
+	{
+    <%Set<String> helpers = new HashSet<String>(); for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+      <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+        <%if (!genClass.isDynamic()) { String theClass = genClass.isMapEntry() ? genClass.getImportedClassName() : genClass.getRawImportedInterfaceName(); if (helpers.add(theClass)) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.register
+			(<%=theClass%>.class,
+			 new <%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.Helper()
+			 {
+				 public boolean isInstance(Object instance)
+				 {
+					 return instance instanceof <%=genClass.isMapEntry() ? genClass.getImportedClassName() : genClass.getRawImportedInterfaceName() + genClass.getInterfaceWildTypeArguments()%>;
+				 }
+
+				 public Object newArrayInstance(int size)
+				 {
+					 return new <%=theClass%>[size];
+				 }
+			 });
+        <%}}%>
+      <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+        <%if (!genDataType.isPrimitiveType() && !genDataType.isObjectType()) { String theClass = genDataType.getRawImportedInstanceClassName(); if (helpers.add(theClass)) { %>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.register
+			(<%=theClass%>.class,
+			 new <%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.Helper()
+			 {
+				 public boolean isInstance(Object instance)
+				 {
+					 return instance instanceof <%=theClass%>;
+				 }
+
+				 public Object newArrayInstance(int size)
+				 {
+        <%if (genDataType.isArrayType()) { String componentType = theClass; String indices = ""; while(componentType.endsWith("[]")) { componentType = componentType.substring(0, componentType.length() - 2); indices += "[]";}%>
+					 return new <%=componentType%>[size]<%=indices%>;
+        <%} else {%>
+					 return new <%=theClass%>[size];
+        <%}%>
+				 }
+		});
+        <%}}%>
+      <%}%>
+    <%}%>
+	}
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class WhiteList implements <%=genModel.getImportedName("com.google.gwt.user.client.rpc.IsSerializable")%>, EBasicWhiteList
+	{
+    <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+      <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+        <%if (!genClass.isDynamic()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=genClass.isMapEntry() ? genClass.getImportedClassName() : genClass.getImportedWildcardInstanceClassName()%> <%=genClass.getSafeUncapName()%>;
+
+        <%}%>
+      <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+        <%if (!genDataType.isObjectType() && genDataType.isSerializable()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=genDataType.getImportedWildcardInstanceClassName()%> <%=genDataType.getSafeUncapName()%>;
+
+        <%}%>
+      <%}%>
+    <%}%>
+	}
+  <%}%>
+
+<%}%>
+<%if (isInterface) { // TODO REMOVE THIS BOGUS EMPTY LINE%>
+
+<%}%>
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+<%if (isInterface) {%>
+	/**
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+	 * Returns the meta object for class '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em><%=genClass.getFormattedName()%></em>'.
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%>
+      <%if (!genModel.isSuppressEMFModelTags() && (genClass.isExternalInterface() || genClass.isDynamic())) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+        <%} else {%>
+	 *        <%=modelInfo%>
+        <%}} if (first) {%>
+	 * @model
+      <%}}%>
+    <%} else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;%>
+	 * Returns the meta object for enum '{@link <%=genEnum.getQualifiedName()%> <em><%=genEnum.getFormattedName()%></em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em><%=genEnum.getFormattedName()%></em>'.
+	 * @see <%=genEnum.getQualifiedName()%>
+    <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+      <%if (genDataType.isPrimitiveType() || genDataType.isArrayType()) {%>
+	 * Returns the meta object for data type '<em><%=genDataType.getFormattedName()%></em>'.
+      <%} else {%>
+	 * Returns the meta object for data type '{@link <%=genDataType.getRawInstanceClassName()%> <em><%=genDataType.getFormattedName()%></em>}'.
+      <%}%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+      <%if (genDataType.hasDocumentation()) {%>
+     * <!-- begin-model-doc -->
+     * <%=genDataType.getDocumentation(genModel.getIndentation(stringBuffer))%>
+     * <!-- end-model-doc -->
+      <%}%>
+	 * @return the meta object for data type '<em><%=genDataType.getFormattedName()%></em>'.
+      <%if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {%>
+	 * @see <%=genDataType.getRawInstanceClassName()%>
+      <%}%>
+      <%if (!genModel.isSuppressEMFModelTags()) {boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genDataType.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+      <%} else {%>
+	 *        <%=modelInfo%>
+      <%}} if (first) {%>
+	 * @model
+      <%}}%>
+    <%}%>
+  <%if ((genClassifier instanceof GenClass || genClassifier instanceof GenEnum) && genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+<%}%>
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+<%if (isImplementation) {%>
+ <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+ <%}%>
+	public <%=genClassifier.getImportedMetaType()%> get<%=genClassifier.getClassifierAccessorName()%>()
+	{
+    <%if (genPackage.isLoadedInitialization()) {%>
+		if (<%=genClassifier.getClassifierInstanceName()%> == null)
+		{
+			<%=genClassifier.getClassifierInstanceName()%> = (<%=genClassifier.getImportedMetaType()%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI).getEClassifiers().get(<%=genPackage.getLocalClassifierIndex(genClassifier)%>);
+		}
+    <%}%>
+		return <%=genClassifier.getClassifierInstanceName()%>;
+	}
+
+<%} else {%>
+	<%=genClassifier.getImportedMetaType()%> get<%=genClassifier.getClassifierAccessorName()%>();
+
+<%}%>
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+<%if (isInterface) {%>
+	/**
+	 * Returns the meta object for the <%=genFeature.getFeatureKind()%> '{@link <%=genClass.getRawQualifiedInterfaceName()%><%if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {%>#<%=genFeature.getGetAccessor()%><%}%> <em><%=genFeature.getFormattedName()%></em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the <%=genFeature.getFeatureKind()%> '<em><%=genFeature.getFormattedName()%></em>'.
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%><%if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {%>#<%=genFeature.getGetAccessor()%>()<%}%>
+	 * @see #get<%=genClass.getClassifierAccessorName()%>()
+    <%if (genFeature.hasImplicitAPITags()) {%>
+	 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasImplicitAPITags()) {%>
+	 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%}%>
+<%if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+   <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+   <%}%>
+	public <%=genFeature.getImportedMetaType()%> get<%=genFeature.getFeatureAccessorName()%>()
+	{
+        <%if (!genPackage.isLoadedInitialization()) {%>
+		return (<%=genFeature.getImportedMetaType()%>)<%=genClass.getClassifierInstanceName()%>.getEStructuralFeatures().get(<%=genClass.getLocalFeatureIndex(genFeature)%>);
+        <%} else {%>
+        return (<%=genFeature.getImportedMetaType()%>)get<%=genClassifier.getClassifierAccessorName()%>().getEStructuralFeatures().get(<%=genClass.getLocalFeatureIndex(genFeature)%>);
+        <%}%>
+	}
+<%} else {%>
+	<%=genFeature.getImportedMetaType()%> get<%=genFeature.getFeatureAccessorName()%>();
+<%}%>
+
+      <%}%>
+      <%if (genModel.isOperationReflection()) {%>
+        <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+<%if (isInterface) {%>
+	/**
+	 * Returns the meta object for the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em><%=genOperation.getFormattedName()%></em>' operation.
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+    <%if (genOperation.hasImplicitAPITags()) {%>
+	 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genOperation.hasImplicitAPITags()) {%>
+	 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%}%>
+<%if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+   <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+   <%}%>
+	public <%=genOperation.getImportedMetaType()%> get<%=genOperation.getOperationAccessorName()%>()
+	{
+        <%if (!genPackage.isLoadedInitialization()) {%>
+		return <%=genClass.getClassifierInstanceName()%>.getEOperations().get(<%=genClass.getLocalOperationIndex(genOperation)%>);
+        <%} else {%>
+        return get<%=genClassifier.getClassifierAccessorName()%>().getEOperations().get(<%=genClass.getLocalOperationIndex(genOperation)%>);
+        <%}%>
+	}
+<%} else {%>
+	<%=genOperation.getImportedMetaType()%> get<%=genOperation.getOperationAccessorName()%>();
+<%}%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+<%if (isInterface) {%>
+	/**
+	 * 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
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%}%>
+<%if (isImplementation) {%>
+   <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+   <%}%>
+	public <%=genPackage.getImportedFactoryInterfaceName()%> get<%=genPackage.getFactoryName()%>()
+	{
+		return (<%=genPackage.getImportedFactoryInterfaceName()%>)getEFactoryInstance();
+	}
+<%} else {%>
+	<%=genPackage.getFactoryInterfaceName()%> get<%=genPackage.getFactoryName()%>();
+<%}%>
+
+<%if (isImplementation) {%>
+  <%if (!genPackage.isLoadedInitialization()) {%>
+	/**
+	 * <!-- 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
+	 */
+    <%{boolean needsSuppressDeprecation = false; if (!packageNeedsSuppressDeprecation && isJDK50 && !genModel.isSuppressEMFMetaData()) { LOOP: for (GenClass genClass : genPackage.getGenClasses()) { for (GenFeature genFeature : genClass.getGenFeatures()) { if (genFeature.hasAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}
+      for (GenOperation genOperation : genClass.getGenOperations()) { if (genOperation.hasAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}} if (needsSuppressDeprecation) {%>
+	@SuppressWarnings("deprecation")
+    <%}}}%>
+	public void createPackageContents()
+	{
+		if (isCreated) return;
+		isCreated = true;
+    <%if (!genPackage.getGenClasses().isEmpty()) {%>
+
+		// Create classes and their features
+      <%for (Iterator<GenClass> c=genPackage.getGenClasses().iterator(); c.hasNext();) { GenClass genClass = c.next();%>
+		<%=genClass.getClassifierInstanceName()%> = create<%=genClass.getMetaType()%>(<%=genClass.getClassifierID()%>);
+        <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+		create<%=genFeature.getMetaType()%>(<%=genClass.getClassifierInstanceName()%>, <%=genClass.getFeatureID(genFeature)%>);
+        <%}%>
+        <%if (genModel.isOperationReflection()) {%>
+          <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+		createEOperation(<%=genClass.getClassifierInstanceName()%>, <%=genClass.getOperationID(genOperation, false)%>);
+          <%}%>
+        <%}%>
+        <%if (c.hasNext()) {%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenEnums().isEmpty()) {%>
+
+		// Create enums
+      <%for (GenEnum genEnum : genPackage.getGenEnums()) {%>
+		<%=genEnum.getClassifierInstanceName()%> = createEEnum(<%=genEnum.getClassifierID()%>);
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenDataTypes().isEmpty()) {%>
+
+		// Create data types
+      <%for (GenDataType genDataType : genPackage.getGenDataTypes()) {%>
+		<%=genDataType.getClassifierInstanceName()%> = createEDataType(<%=genDataType.getClassifierID()%>);
+      <%}%>
+    <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+<%
+///////////////////////
+class Information
+{
+  @SuppressWarnings("unused")
+  EGenericType eGenericType;
+  int depth;
+  String type;
+  String accessor;
+}
+
+class InformationIterator
+{
+  Iterator<Object> iterator;
+  InformationIterator(EGenericType eGenericType)
+  {
+    iterator = EcoreUtil.getAllContents(Collections.singleton(eGenericType));
+  }
+
+  boolean hasNext()
+  {
+    return iterator.hasNext();
+  }
+
+  Information next()
+  {
+    Information information = new Information();
+    EGenericType eGenericType = information.eGenericType = (EGenericType)iterator.next();
+    for (EObject container = eGenericType.eContainer(); container instanceof EGenericType; container = container.eContainer())
+    {
+      ++information.depth;
+    }
+    if (eGenericType.getEClassifier() != null )
+    {
+      GenClassifier genClassifier = genModel.findGenClassifier(eGenericType.getEClassifier());
+      information.type = genPackage.getPackageInstanceVariable(genClassifier.getGenPackage()) + ".get" + genClassifier.getClassifierAccessorName() + "()";
+    }
+    else if (eGenericType.getETypeParameter() != null)
+    {
+      ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
+      if (eTypeParameter.eContainer() instanceof EClass)
+      {
+        information.type = genModel.findGenClassifier((EClass)eTypeParameter.eContainer()).getClassifierInstanceName() + "_" + eGenericType.getETypeParameter().getName();
+      }
+      else
+      {
+        information.type = "t" + (((EOperation)eTypeParameter.eContainer()).getETypeParameters().indexOf(eTypeParameter) + 1);
+      }
+    }
+    else
+    {
+      information.type ="";
+    }
+    if (information.depth > 0)
+    {
+      if (eGenericType.eContainmentFeature().isMany())
+      {
+        information.accessor = "getE" + eGenericType.eContainmentFeature().getName().substring(1) + "().add";
+      }
+      else
+      {
+        information.accessor = "setE" + eGenericType.eContainmentFeature().getName().substring(1);
+      }
+    }
+    return information;
+  }
+}
+///////////////////////
+int maxGenericTypeAssignment = 0;
+%>
+	/**
+	 * 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
+	 */
+    <%{boolean needsSuppressDeprecation = false; if (!packageNeedsSuppressDeprecation && isJDK50) { LOOP: for (GenEnum genEnum : genPackage.getGenEnums()) { for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) { if (genEnumLiteral.hasAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}} if (needsSuppressDeprecation) {%>
+	@SuppressWarnings("deprecation")
+    <%}}}%>
+	public void initializePackageContents()
+	{
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+    <%if (!genPackage.getPackageInitializationDependencies().isEmpty()) {%>
+
+		// Obtain other dependent packages
+      <%for (GenPackage dep : genPackage.getPackageInitializationDependencies()) {%>
+		<%=dep.getImportedPackageInterfaceName()%> <%=genPackage.getPackageInstanceVariable(dep)%> = (<%=dep.getImportedPackageInterfaceName()%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=dep.getImportedPackageInterfaceName()%>.eNS_URI);
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getSubGenPackages().isEmpty()) {%>
+
+		// Add subpackages
+      <%for (GenPackage sub : genPackage.getSubGenPackages()) {%>
+		getESubpackages().add(<%=genPackage.getPackageInstanceVariable(sub)%>);
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenClasses().isEmpty()) { boolean firstOperationAssignment = true; int maxTypeParameterAssignment = 0;%>
+      <%if (genModel.useGenerics()) {%>
+
+		// Create type parameters
+        <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+          <%for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {%>
+            <%if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty() || genTypeParameter.isUsed()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter")%> <%=genClassifier.getClassifierInstanceName()%>_<%=genTypeParameter.getName()%> = addETypeParameter(<%=genClassifier.getClassifierInstanceName()%>, "<%=genTypeParameter.getName()%>");<%=genModel.getNonNLS()%>
+            <%} else {%>
+		addETypeParameter(<%=genClassifier.getClassifierInstanceName()%>, "<%=genTypeParameter.getName()%>");<%=genModel.getNonNLS()%>
+            <%}%>
+          <%}%>
+        <%}%>
+      <%}%>
+      <%if (genModel.useGenerics()) {%>
+
+		// Set bounds for type parameters
+        <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+          <%for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {%>
+            <%for (EGenericType bound : genTypeParameter.getEcoreTypeParameter().getEBounds()) {%>
+              <%for (InformationIterator i=new InformationIterator(bound); i.hasNext(); ) { Information info = i.next(); String prefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=prefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                <%}%>
+              <%}%>
+		<%=genClassifier.getClassifierInstanceName()%>_<%=genTypeParameter.getName()%>.getEBounds().add(g1);
+            <%}%>
+          <%}%>
+        <%}%>
+      <%}%>
+
+		// Add supertypes to classes
+      <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+        <%if (!genClass.hasGenericSuperTypes()) {%>
+          <%for (GenClass baseGenClass : genClass.getBaseGenClasses()) {%>
+		<%=genClass.getClassifierInstanceName()%>.getESuperTypes().add(<%=genPackage.getPackageInstanceVariable(baseGenClass.getGenPackage())%>.get<%=baseGenClass.getClassifierAccessorName()%>());
+          <%}%>
+        <%} else {%>
+          <%for (EGenericType superType : genClass.getEcoreClass().getEGenericSuperTypes()) {%>
+            <%for (InformationIterator i=new InformationIterator(superType); i.hasNext(); ) { Information info = i.next(); String prefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=prefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+              <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+              <%}%>
+            <%}%>
+		<%=genClass.getClassifierInstanceName()%>.getEGenericSuperTypes().add(g1);
+          <%}%>
+        <%}%>
+      <%}%>
+
+		// Initialize classes<%if (genModel.isOperationReflection()) {%>, features, and operations; add parameters<%} else {%> and features; add operations and parameters<%}%>
+      <%for (Iterator<GenClass> c=genPackage.getGenClasses().iterator(); c.hasNext();) { GenClass genClass = c.next(); boolean hasInstanceTypeName = genModel.useGenerics() && genClass.getEcoreClass().getInstanceTypeName() != null && genClass.getEcoreClass().getInstanceTypeName().contains("<");%>
+		initEClass(<%=genClass.getClassifierInstanceName()%>, <%if (genClass.isDynamic()) {%>null<%} else {%><%=genClass.getRawImportedInterfaceName()%>.class<%}%>, "<%=genClass.getName()%>", <%=genClass.getAbstractFlag()%>, <%=genClass.getInterfaceFlag()%>, <%=genClass.getGeneratedInstanceClassFlag()%><%if (hasInstanceTypeName) {%>, "<%=genClass.getEcoreClass().getInstanceTypeName()%>"<%}%>);<%=genModel.getNonNLS()%><%if (hasInstanceTypeName) {%><%=genModel.getNonNLS(2)%><%}%>
+        <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+          <%if (genFeature.hasGenericType()) {%>
+            <%for (InformationIterator i=new InformationIterator(genFeature.getEcoreFeature().getEGenericType()); i.hasNext(); ) { Information info = i.next(); String prefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=prefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+              <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+              <%}%>
+            <%}%>
+          <%}%>
+          <%if (genFeature.isReferenceType()) { GenFeature reverseGenFeature = genFeature.getReverse();%>
+          <%String reverse = reverseGenFeature == null ? "null" : genPackage.getPackageInstanceVariable(reverseGenFeature.getGenPackage()) + ".get" + reverseGenFeature.getFeatureAccessorName() + "()";%>
+		initEReference(get<%=genFeature.getFeatureAccessorName()%>(), <%if (genFeature.hasGenericType()) {%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage())%>.get<%=genFeature.getTypeClassifierAccessorName()%>()<%}%>, <%=reverse%>, "<%=genFeature.getName()%>", <%=genFeature.getDefaultValue()%>, <%=genFeature.getLowerBound()%>, <%=genFeature.getUpperBound()%>, <%=genFeature.getContainerClass()%>, <%=genFeature.getTransientFlag()%>, <%=genFeature.getVolatileFlag()%>, <%=genFeature.getChangeableFlag()%>, <%=genFeature.getContainmentFlag()%>, <%=genFeature.getResolveProxiesFlag()%>, <%=genFeature.getUnsettableFlag()%>, <%=genFeature.getUniqueFlag()%>, <%=genFeature.getDerivedFlag()%>, <%=genFeature.getOrderedFlag()%>);<%=genModel.getNonNLS()%><%=genModel.getNonNLS(genFeature.getDefaultValue(), 2)%>
+            <%for (GenFeature keyFeature : genFeature.getKeys()) {%>
+		get<%=genFeature.getFeatureAccessorName()%>().getEKeys().add(<%=genPackage.getPackageInstanceVariable(keyFeature.getGenPackage())%>.get<%=keyFeature.getFeatureAccessorName()%>());
+            <%}%>
+          <%} else {%>
+		initEAttribute(get<%=genFeature.getFeatureAccessorName()%>(), <%if (genFeature.hasGenericType()) {%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage())%>.get<%=genFeature.getTypeClassifierAccessorName()%>()<%}%>, "<%=genFeature.getName()%>", <%=genFeature.getDefaultValue()%>, <%=genFeature.getLowerBound()%>, <%=genFeature.getUpperBound()%>, <%=genFeature.getContainerClass()%>, <%=genFeature.getTransientFlag()%>, <%=genFeature.getVolatileFlag()%>, <%=genFeature.getChangeableFlag()%>, <%=genFeature.getUnsettableFlag()%>, <%=genFeature.getIDFlag()%>, <%=genFeature.getUniqueFlag()%>, <%=genFeature.getDerivedFlag()%>, <%=genFeature.getOrderedFlag()%>);<%=genModel.getNonNLS()%><%=genModel.getNonNLS(genFeature.getDefaultValue(), 2)%>
+          <%}%>
+        <%}%>
+        <%for (GenOperation genOperation : genClass.getGenOperations()) {String prefix = ""; if (genOperation.hasGenericType() || !genOperation.getGenParameters().isEmpty() || !genOperation.getGenExceptions().isEmpty() || !genOperation.getGenTypeParameters().isEmpty()) { if (firstOperationAssignment) { firstOperationAssignment = false; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EOperation") + " op = "; } else { prefix = "op = "; }} %>
+
+          <%if (genModel.useGenerics()) {%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, <%if (genOperation.isVoid() || genOperation.hasGenericType()) {%>null<%} else {%><%=genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage())%>.get<%=genOperation.getTypeClassifierAccessorName()%>()<%}%>, "<%=genOperation.getName()%>", <%=genOperation.getLowerBound()%>, <%=genOperation.getUpperBound()%>, <%=genOperation.getUniqueFlag()%>, <%=genOperation.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+          <%} else if (!genOperation.isVoid()) {%>
+            <%if (!genOperation.getEcoreOperation().isOrdered() || !genOperation.getEcoreOperation().isUnique()) { needsAddEOperation = true;%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, <%=genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage())%>.get<%=genOperation.getTypeClassifierAccessorName()%>(), "<%=genOperation.getName()%>", <%=genOperation.getLowerBound()%>, <%=genOperation.getUpperBound()%>, <%=genOperation.getUniqueFlag()%>, <%=genOperation.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+            <%} else {%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, <%=genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage())%>.get<%=genOperation.getTypeClassifierAccessorName()%>(), "<%=genOperation.getName()%>", <%=genOperation.getLowerBound()%>, <%=genOperation.getUpperBound()%>);<%=genModel.getNonNLS()%>
+            <%}%>
+          <%} else {%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, null, "<%=genOperation.getName()%>");<%=genModel.getNonNLS()%>
+          <%}%>
+          <%if (genModel.useGenerics()) {%>
+            <%for (ListIterator<GenTypeParameter> t=genOperation.getGenTypeParameters().listIterator(); t.hasNext(); ) { GenTypeParameter genTypeParameter = t.next(); String typeParameterVariable = ""; if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty() || genTypeParameter.isUsed()) { if (maxTypeParameterAssignment <= t.previousIndex()) { ++maxTypeParameterAssignment; typeParameterVariable = genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter") + " t" + t.nextIndex() + " = "; } else { typeParameterVariable = "t" + t.nextIndex() + " = "; }} %>
+		<%=typeParameterVariable%>addETypeParameter(op, "<%=genTypeParameter.getName()%>");<%=genModel.getNonNLS()%>
+              <%for (EGenericType typeParameter : genTypeParameter.getEcoreTypeParameter().getEBounds()) {%>
+                <%for (InformationIterator i=new InformationIterator(typeParameter); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                  <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                  <%}%>
+                <%}%>
+		t<%=t.nextIndex()%>.getEBounds().add(g1);
+              <%}%>
+            <%}%>
+          <%}%>
+          <%for (GenParameter genParameter : genOperation.getGenParameters()) {%>
+            <%if (genParameter.hasGenericType()) {%>
+              <%for (InformationIterator i=new InformationIterator(genParameter.getEcoreParameter().getEGenericType()); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                <%}%>
+              <%}%>
+            <%}%>
+            <%if (genModel.useGenerics()) {%>
+		addEParameter(op, <%if (genParameter.hasGenericType()){%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genParameter.getTypeGenPackage())%>.get<%=genParameter.getTypeClassifierAccessorName()%>()<%}%>, "<%=genParameter.getName()%>", <%=genParameter.getLowerBound()%>, <%=genParameter.getUpperBound()%>, <%=genParameter.getUniqueFlag()%>, <%=genParameter.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+            <%} else if (!genParameter.getEcoreParameter().isOrdered() || !genParameter.getEcoreParameter().isUnique()) { needsAddEParameter = true;%>
+		addEParameter(op, <%if (genParameter.hasGenericType()){%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genParameter.getTypeGenPackage())%>.get<%=genParameter.getTypeClassifierAccessorName()%>()<%}%>, "<%=genParameter.getName()%>", <%=genParameter.getLowerBound()%>, <%=genParameter.getUpperBound()%>, <%=genParameter.getUniqueFlag()%>, <%=genParameter.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+            <%} else {%>
+		addEParameter(op, <%if (genParameter.hasGenericType()){%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genParameter.getTypeGenPackage())%>.get<%=genParameter.getTypeClassifierAccessorName()%>()<%}%>, "<%=genParameter.getName()%>", <%=genParameter.getLowerBound()%>, <%=genParameter.getUpperBound()%>);<%=genModel.getNonNLS()%>
+            <%}%>
+          <%}%>
+          <%if (genOperation.hasGenericExceptions()) {%>
+              <%for (EGenericType genericExceptions : genOperation.getEcoreOperation().getEGenericExceptions()) {%>
+                <%for (InformationIterator i=new InformationIterator(genericExceptions); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                  <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                  <%}%>
+		addEException(op, g<%=info.depth + 1%>);
+                <%}%>
+              <%}%>
+          <%} else {%>
+            <%for (GenClassifier genException : genOperation.getGenExceptions()) {%>
+		addEException(op, <%=genPackage.getPackageInstanceVariable(genException.getGenPackage())%>.get<%=genException.getClassifierAccessorName()%>());
+            <%}%>
+          <%}%>
+          <%if (!genOperation.isVoid() && genOperation.hasGenericType()) {%>
+            <%for (InformationIterator i=new InformationIterator(genOperation.getEcoreOperation().getEGenericType()); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+              <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+              <%}%>
+            <%}%>
+		initEOperation(op, g1);
+          <%}%>
+        <%}%>
+        <%if (c.hasNext()) {%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenEnums().isEmpty()) {%>
+
+		// Initialize enums and add enum literals
+      <%for (Iterator<GenEnum> e=genPackage.getGenEnums().iterator(); e.hasNext();) { GenEnum genEnum = e.next();%>
+		initEEnum(<%=genEnum.getClassifierInstanceName()%>, <%=genEnum.getImportedName()%>.class, "<%=genEnum.getName()%>");<%=genModel.getNonNLS()%>
+        <%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+		addEEnumLiteral(<%=genEnum.getClassifierInstanceName()%>, <%=genEnum.getImportedName().equals(genEnum.getClassifierID()) ? genEnum.getQualifiedName() : genEnum.getImportedName()%>.<%=genEnumLiteral.getEnumLiteralInstanceConstantName()%>);
+        <%}%>
+        <%if (e.hasNext()) {%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenDataTypes().isEmpty()) {%>
+
+		// Initialize data types
+      <%for (GenDataType genDataType : genPackage.getGenDataTypes()) {boolean hasInstanceTypeName = genModel.useGenerics() && genDataType.getEcoreDataType().getInstanceTypeName() != null && genDataType.getEcoreDataType().getInstanceTypeName().contains("<");%>
+		initEDataType(<%=genDataType.getClassifierInstanceName()%>, <%=genDataType.getRawImportedInstanceClassName()%>.class, "<%=genDataType.getName()%>", <%=genDataType.getSerializableFlag()%>, <%=genDataType.getGeneratedInstanceClassFlag()%><%if (hasInstanceTypeName) {%>, "<%=genDataType.getEcoreDataType().getInstanceTypeName()%>"<%}%>);<%=genModel.getNonNLS()%><%if (hasInstanceTypeName) {%><%=genModel.getNonNLS(2)%><%}%>
+      <%}%>
+    <%}%>
+    <%if (genPackage.getSuperGenPackage() == null) {%>
+
+		// Create resource
+		createResource(<%=genPackage.getSchemaLocation()%>);
+    <%}%>
+    <%if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {%>
+
+		// Create annotations
+      <%for (String annotationSource : genPackage.getAnnotationSources()) {%>
+		// <%=annotationSource%>
+		create<%=genPackage.getAnnotationSourceIdentifier(annotationSource)%>Annotations();
+      <%}%>
+    <%}%>
+	}
+
+    <%for (String annotationSource : genPackage.getAnnotationSources()) {%>
+	/**
+	 * Initializes the annotations for <b><%=annotationSource%></b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void create<%=genPackage.getAnnotationSourceIdentifier(annotationSource)%>Annotations()
+	{
+		String source = <%if (annotationSource == null) {%>null;<%} else {%>"<%=annotationSource%>";<%=genModel.getNonNLS()%><%}%>
+      <%for (EAnnotation eAnnotation : genPackage.getAllAnnotations()) { List<GenPackage.AnnotationReferenceData> annotationReferenceDataList = genPackage.getReferenceData(eAnnotation);%>
+        <%if (annotationSource == null ? eAnnotation.getSource() == null : annotationSource.equals(eAnnotation.getSource())) {%>
+		addAnnotation
+		  (<%=genPackage.getAnnotatedModelElementAccessor(eAnnotation)%>,
+		   source,
+		   new String[]
+		   {
+          <%for (Iterator<Map.Entry<String, String>> k = eAnnotation.getDetails().iterator(); k.hasNext();) { Map.Entry<String, String> detail = k.next(); String key = Literals.toStringLiteral(detail.getKey(), genModel); String value = Literals.toStringLiteral(detail.getValue(), genModel);%>
+			   <%=key%>, <%=value%><%=k.hasNext() ? "," : ""%><%=genModel.getNonNLS(key + value)%>
+          <%}%>
+		   }<%if (annotationReferenceDataList.isEmpty()) {%>);<%} else {%>,<%}%>
+          <%if (!annotationReferenceDataList.isEmpty()) {%>
+		   new <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>[]
+		   {
+            <%for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList.iterator(); k.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = k.next();%>
+			 <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(<%if (annotationReferenceData.containingGenPackage != genPackage) {%><%=annotationReferenceData.containingGenPackage.getImportedPackageInterfaceName()%>.<%}%>eNS_URI).appendFragment("<%=annotationReferenceData.uriFragment%>")<%if (k.hasNext()) {%>,<%}%><%=genModel.getNonNLS()%>
+            <%}%>
+		   });
+          <%}%>
+          <%for (EAnnotation nestedEAnnotation : genPackage.getAllNestedAnnotations(eAnnotation)) {String nestedAnnotationSource = nestedEAnnotation.getSource();  int depth = 0; boolean nonContentAnnotation = false; StringBuilder path = new StringBuilder();  for (EObject eContainer = nestedEAnnotation.eContainer(), child = nestedEAnnotation; child != eAnnotation; child = eContainer, eContainer = eContainer.eContainer())  {  boolean nonContentChild = child.eContainmentFeature() != EcorePackage.Literals.EANNOTATION__CONTENTS; if (path.length() != 0) { path.insert(0, ", ");  } path.insert(0, nonContentChild); if (nonContentChild) { nonContentAnnotation = true; } ++depth;  } List<GenPackage.AnnotationReferenceData> nestedAnnotationReferenceDataList = genPackage.getReferenceData(nestedEAnnotation);%>
+		addAnnotation
+		  (<%=genPackage.getAnnotatedModelElementAccessor(eAnnotation)%>,
+		   <%if (nonContentAnnotation && genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {%>new boolean[] { <%=path.toString()%> }<%} else {%><%=depth%><%}%>,
+		   <%if (nestedAnnotationSource == null) {%>null,<%} else {%>"<%=nestedAnnotationSource%>",<%=genModel.getNonNLS()%><%}%>
+		   new String[]
+		   {
+            <%for (Iterator<Map.Entry<String, String>> l = nestedEAnnotation.getDetails().iterator(); l.hasNext();) { Map.Entry<String, String> detail = l.next(); String key = Literals.toStringLiteral(detail.getKey(), genModel); String value = Literals.toStringLiteral(detail.getValue(), genModel);%>
+			   <%=key%>, <%=value%><%=l.hasNext() ? "," : ""%><%=genModel.getNonNLS(key + value)%>
+            <%}%>
+		   }<%if (nestedAnnotationReferenceDataList.isEmpty()) {%>);<%} else {%>,<%}%>
+            <%if (!nestedAnnotationReferenceDataList.isEmpty()) {%>
+		   new <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>[]
+		   {
+            <%for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList.iterator(); l.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = l.next();%>
+			 <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(<%if (annotationReferenceData.containingGenPackage != genPackage) {%><%=annotationReferenceData.containingGenPackage.getImportedPackageInterfaceName()%>.<%}%>eNS_URI).appendFragment("<%=annotationReferenceData.uriFragment%>")<%if (l.hasNext()) {%>,<%}%><%=genModel.getNonNLS()%>
+            <%}%>
+		   });
+            <%}%>
+          <%}%>
+        <%}%>
+      <%}%>
+	}
+
+    <%}%>
+  <%} else {%>
+    <%if (genPackage.isLoadingInitialization()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isLoaded = false;
+
+	/**
+	 * Laods the package and any sub-packages from their serialized form.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void loadPackage()
+	{
+		if (isLoaded) return;
+		isLoaded = true;
+
+		<%=genModel.getImportedName("java.net.URL")%> url = getClass().getResource(packageFilename);
+		if (url == null)
+		{
+			throw new RuntimeException("Missing serialized package: " + packageFilename);<%=genModel.getNonNLS()%>
+		}
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%> uri = <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(url.toString());
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource")%> resource = new <%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl")%>().createResource(uri);
+		try
+		{
+			resource.load(null);
+		}
+		catch (<%=genModel.getImportedName("java.io.IOException")%> exception)
+		{
+			throw new <%=genModel.getImportedName("org.eclipse.emf.common.util.WrappedException")%>(exception);
+		}
+		initializeFromLoadedEPackage(this, (<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>)resource.getContents().get(0));
+		createResource(eNS_URI);
+	}
+
+    <%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isFixed = false;
+
+	/**
+	 * Fixes up the loaded package, to make it appear as if it had been programmatically built.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void fixPackageContents()
+	{
+		if (isFixed) return;
+		isFixed = true;
+		fixEClassifiers();
+	}
+
+	/**
+	 * Sets the instance class on the given classifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+    <%}%>
+	protected void fixInstanceClass(<%=genModel.getImportedName("org.eclipse.emf.ecore.EClassifier")%> eClassifier)
+	{
+		if (eClassifier.getInstanceClassName() == null)
+		{
+    <%ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>(); for (GenClass genClass : genPackage.getGenClasses()) { if (genClass.isDynamic()) { dynamicGenClasses.add(genClass); } }%>
+    <%if (dynamicGenClasses.isEmpty()) {%>
+			eClassifier.setInstanceClassName("<%=genPackage.getInterfacePackageName()%>." + eClassifier.getName());<%=genModel.getNonNLS()%>
+			setGeneratedClassName(eClassifier);
+    <%} else {%>
+			switch (eClassifier.getClassifierID())
+			{
+      <%for (GenClass genClass : dynamicGenClasses) {%>
+        <%if (genClass.isDynamic()) {%>
+				case <%=genPackage.getClassifierID(genClass)%>:
+        <%}%>
+      <%}%>
+				{
+					break;
+				}
+				default:
+				{
+					eClassifier.setInstanceClassName("<%=genPackage.getInterfacePackageName()%>." + eClassifier.getName());<%=genModel.getNonNLS()%>
+					setGeneratedClassName(eClassifier);
+					break;
+				}
+			}
+    <%}%>
+		}
+	}
+
+  <%}%>
+  <%if (needsAddEOperation) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> addEOperation(<%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> owner, <%=genModel.getImportedName("org.eclipse.emf.ecore.EClassifier")%> type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)
+	{
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> o = addEOperation(owner, type, name, lowerBound, upperBound);
+		o.setUnique(isUnique);
+		o.setOrdered(isOrdered);
+		return o;
+	}
+
+  <%}%>
+  <%if (needsAddEParameter) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EParameter")%> addEParameter(<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> owner, <%=genModel.getImportedName("org.eclipse.emf.ecore.EClassifier")%> type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)
+	{
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EParameter")%> p = ecoreFactory.createEParameter();
+		p.setEType(type);
+		p.setName(name);
+		p.setLowerBound(lowerBound);
+		p.setUpperBound(upperBound);
+		p.setUnique(isUnique);
+		p.setOrdered(isOrdered);
+		owner.getEParameters().add(p);
+		return p;
+	}
+
+  <%}%>
+<%}%>
+<%if (isInterface && genPackage.isLiteralsInterface()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+  <%if (genModel.isOperationReflection()) {%>
+	 *   <li>each operation of each class,</li>
+  <%}%>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%if (isImplementation) {%>public <%}%>interface Literals
+	{
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+		/**
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%if (!genClass.isInterface()) {%>
+		 * The meta object literal for the '{@link <%=genClass.getQualifiedClassName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see <%=genClass.getQualifiedClassName()%>
+      <%} else {%>
+		 * The meta object literal for the '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see <%=genClass.getRawQualifiedInterfaceName()%>
+      <%}%>
+    <%} else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;%>
+		 * The meta object literal for the '{@link <%=genEnum.getQualifiedName()%> <em><%=genEnum.getFormattedName()%></em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see <%=genEnum.getQualifiedName()%>
+    <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+		 * The meta object literal for the '<em><%=genDataType.getFormattedName()%></em>' data type.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+      <%if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {%>
+		 * @see <%=genDataType.getRawInstanceClassName()%>
+      <%}%>
+    <%}%>
+		 * @see <%=genPackage.getQualifiedPackageClassName()%>#get<%=genClassifier.getClassifierAccessorName()%>()
+    <%if (genClassifier.hasAPITags()) {%>
+		 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+		 * @generated
+		 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+		@Deprecated
+  <%}%>
+		<%=publicStaticFinalFlag%><%=genClassifier.getImportedMetaType()%> <%=genPackage.getClassifierID(genClassifier)%> = eINSTANCE.get<%=genClassifier.getClassifierAccessorName()%>();
+
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+		/**
+		 * The meta object literal for the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%> feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+        <%if (genFeature.hasImplicitAPITags()) {%>
+		 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+        <%}%>
+		 * @generated
+		 */
+        <%if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {%>
+		@Deprecated
+        <%}%>
+		<%=publicStaticFinalFlag%><%=genFeature.getImportedMetaType()%> <%=genClass.getFeatureID(genFeature)%> = eINSTANCE.get<%=genFeature.getFeatureAccessorName()%>();
+
+      <%}%>
+      <%if (genModel.isOperationReflection()) {%>
+        <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+		/**
+		 * The meta object literal for the '<em><b><%=genOperation.getFormattedName()%></b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+          <%if (genOperation.hasImplicitAPITags()) {%>
+		 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+          <%}%>
+		 * @generated
+		 */
+        <%if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {%>
+		@Deprecated
+        <%}%>
+		<%=publicStaticFinalFlag%><%=genOperation.getImportedMetaType()%> <%=genClass.getOperationID(genOperation, false)%> = eINSTANCE.get<%=genOperation.getOperationAccessorName()%>();
+
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+	}
+
+<%}%>
+} //<%=isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._StPj2GKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._StPj2GKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..77ee084
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PdzQgDG0Ed-kc8dEZsdm2w/method._StPj2GKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = ((Object[]) new Object[]{new Object[]{genPackage,genPackage.getGenModel().isSuppressEMFMetaData() || genPackage.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE,Boolean.TRUE}})[0];
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._0767AmKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._0767AmKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._0767AmKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._9hr7NHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._9hr7NHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..51fe0f0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._9hr7NHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.getResource().getValue() == GenResourceKind.XML);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8cjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8cjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8cjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8czG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8czG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8czG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..12cd9d3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8dzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getUtilitiesPackageName();
+className = genPackage.getXMLProcessorClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8eTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8eTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..2958f4c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._PeP8eTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,84 @@
+
+<%
+/**
+ * Copyright (c) 2005-2006 IBM Corporation and others. 
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getUtilitiesPackageName()%>;
+
+<%genModel.getImportedName("java.util.Map");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This class contains helper methods to serialize and deserialize XML documents
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public class <%=genPackage.getXMLProcessorClassName()%> extends <%=genPackage.getImportedXMLProcessorBaseClassName()%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+
+	/**
+	 * Public constructor to instantiate the helper.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getXMLProcessorClassName()%>()
+	{
+<%if (genPackage.hasExtendedMetaData() && !genPackage.hasTargetNamespace()) {%>
+		super(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageRegistryImpl")%>(<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE));
+		extendedMetaData.putPackage(null, <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE);
+<%} else {%>
+		super((<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE));
+		<%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE.eClass();
+<%}%>
+	}
+	
+	/**
+	 * Register for "*" and "xml" file extensions the <%=genPackage.getResourceFactoryClassName()%> factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected Map<%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {%><<%=genModel.getImportedName("java.lang.String")%>, <%=genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource")%>.Factory><%}%> getRegistrations()
+	{
+		if (registrations == null)
+		{
+			super.getRegistrations();
+			registrations.put(XML_EXTENSION, new <%=genPackage.getResourceFactoryClassName()%>());
+			registrations.put(STAR_EXTENSION, new <%=genPackage.getResourceFactoryClassName()%>());
+		}
+		return registrations;
+	}
+
+} //<%=genPackage.getXMLProcessorClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._SspG4mKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._SspG4mKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PeP8cDG0Ed-kc8dEZsdm2w/method._SspG4mKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._08EE9mKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._08EE9mKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._08EE9mKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._9DSvBHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._9DSvBHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..54897c3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._9DSvBHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenClass genClass = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (!genClass.isInterface());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jUzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d2471ca
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jVzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenClass genClass = parameter;
+targetPath = genClass.getGenModel().getModelDirectory();
+packageName = genClass.getGenPackage().getClassPackageName();
+className = genClass.getClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jWTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jWTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..8047b4c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Pe_jWTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,989 @@
+
+<%
+/**
+ * Copyright (c) 2002-2019 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+ */
+%>
+<%final GenClass genClass = (GenClass)((Object[])argument)[0]; final GenPackage genPackage = genClass.getGenPackage(); final GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%final boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); final boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]); final boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+<%final boolean isGWT = genModel.getRuntimePlatform() == GenRuntimePlatform.GWT;%>
+<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();final String indentDefaultCase = forceDefaultCase ? "\t\t" : "";%>
+<%final String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+<%final String singleWildcard = isJDK50 ? "<?>" : "";%>
+<%final String negativeOffsetCorrection = genClass.hasOffsetCorrection() ? " - " + genClass.getOffsetCorrectionField(null) : "";%>
+<%final String positiveOffsetCorrection = genClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(null) : "";%>
+<%final String negativeOperationOffsetCorrection = genClass.hasOffsetCorrection() ? " - EOPERATION_OFFSET_CORRECTION" : "";%>
+<%final String positiveOperationOffsetCorrection = genClass.hasOffsetCorrection() ? " + EOPERATION_OFFSET_CORRECTION" : "";%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%if (isInterface) {%>
+package <%=genPackage.getInterfacePackageName()%>;
+<%} else {%>
+package <%=genPackage.getClassPackageName()%>;
+<%}%>
+
+<%genModel.markImportLocation(stringBuffer, genPackage);%>
+<%if (isImplementation) { genClass.addClassPsuedoImports(); }%>
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.interface.javadoc.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/interface.javadoc.override.javajetinc%>
+<%} else {%>
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
+ * <!-- end-user-doc -->
+<%if (!genClass.getImplementedGenFeatures().isEmpty()) {%>
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+<%for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {%>
+ *   <li>{@link <%=genClass.getQualifiedClassName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
+<%}%>
+ * </ul>
+<%}%>
+ *
+<%if (genClass.hasImplicitAPITags()) {%>
+ * <%=genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%}%>
+<%if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+<%if (isJDK50 && !genClass.hasAPIDeprecatedTag() && GenModelUtil.hasImplicitAPIDeprecatedTag(genClass.getEGetGenFeatures(), genClass.getEIsSetGenFeatures(), genClass.getESetGenFeatures(), genClass.getEUnsetGenFeatures(), genClass.getEInverseAddGenFeatures(), genClass.getEInverseRemoveGenFeatures(), genClass.getEBasicRemoveFromContainerGenFeatures(), genClass.getToStringGenFeatures())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public<%if (genClass.isAbstract()) {%> abstract<%}%> class <%=genClass.getClassName()%><%=genClass.getTypeParameters().trim()%><%=genClass.getClassExtends()%><%=genClass.getClassImplements()%>
+<%} else {%>
+public interface <%=genClass.getInterfaceName()%><%=genClass.getTypeParameters().trim()%><%=genClass.getInterfaceExtends()%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isImplementation && genModel.getDriverNumber() != null) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> mofDriverNumber = "<%=genModel.getDriverNumber()%>";<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isImplementation && genClass.isJavaIOSerializable()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final long serialVersionUID = 1L;
+
+<%}%>
+<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
+  <%if (eVirtualValuesField != null) {%>
+	/**
+	 * An array of objects representing the values of non-primitive features.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected Object[] <%=eVirtualValuesField%>;
+
+  <%}%>
+  <%{ List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());%>
+    <%if (!eVirtualIndexBitFields.isEmpty()) {%>
+      <%for (String eVirtualIndexBitField : eVirtualIndexBitFields) {%>
+	/**
+	 * A bit field representing the indices of non-primitive feature values.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=eVirtualIndexBitField%>;
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (isImplementation && genClass.isModelRoot() && genModel.isBooleanFlagsEnabled() && genModel.getBooleanFlagsReservedBits() == -1) {%>
+	/**
+	 * A set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=genModel.getBooleanFlagsField()%> = 0;
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation()) {%>
+  <%for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {%>
+      <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String rawListItemType = genFeature.getRawListItemType(genClass); int index = rawListItemType.indexOf('['); String head = rawListItemType; String tail = ""; if (index != -1) { head = rawListItemType.substring(0, index); tail = rawListItemType.substring(index); } %>
+	/**
+	 * The empty value for the '{@link #<%=genFeature.getGetArrayAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' array accessor.
+	 * This is specialized for the more specific element type known in this context.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetArrayAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+        <%if (genFeature.getQualifiedListItemType(genClass).contains("<") || genFeature.getArrayItemType(genClass).contains("<")) {%>
+	@SuppressWarnings("rawtypes")
+        <%}%>
+	protected static final <%=rawListItemType%>[] <%=genFeature.getUpperName()%>_EEMPTY_ARRAY = new <%=head%> [0]<%=tail%>;
+
+      <%}%>
+  <%}%>
+  <%for (GenFeature genFeature : genClass.getDeclaredFieldGenFeatures()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.declaredFieldGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/declaredFieldGenFeature.override.javajetinc%>
+  <%}%>
+<%}%>
+<%if (isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final int <%=genClass.getOffsetCorrectionField(null)%> = <%=genClass.getQualifiedClassifierAccessor()%>.getFeatureID(<%=genClass.getImplementedGenFeatures().get(0).getQualifiedFeatureAccessor()%>) - <%=genClass.getQualifiedFeatureID(genClass.getImplementedGenFeatures().get(0))%>;
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation()) {%>
+  <%for (GenFeature genFeature : genClass.getImplementedGenFeatures()) { GenFeature reverseFeature = genFeature.getReverse();%>
+    <%if (reverseFeature != null && reverseFeature.getGenClass().hasOffsetCorrection()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	private static final int <%=genClass.getOffsetCorrectionField(genFeature)%> = <%=reverseFeature.getGenClass().getQualifiedClassifierAccessor()%>.getFeatureID(<%=reverseFeature.getQualifiedFeatureAccessor()%>) - <%=reverseFeature.getGenClass().getQualifiedFeatureID(reverseFeature)%>;
+
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.isOperationReflection() && isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenOperations().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final int EOPERATION_OFFSET_CORRECTION = <%=genClass.getQualifiedClassifierAccessor()%>.getOperationID(<%=genClass.getImplementedGenOperations().get(0).getQualifiedOperationAccessor()%>) - <%=genClass.getQualifiedOperationID(genClass.getImplementedGenOperations().get(0))%>;
+
+<%}%>
+<%if (isImplementation) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%if (genModel.isPublicConstructors()) {%>public<%} else {%>protected<%}%> <%=genClass.getClassName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.egfCustom.constructor.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+  <%for (GenFeature genFeature : genClass.getFlagGenFeaturesWithDefault()) {%>
+		<%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG<%if (!genFeature.isBooleanType()) {%>_DEFAULT<%}%>;
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> eStaticClass()
+	{
+		return <%=genClass.getQualifiedClassifierAccessor()%>;
+	}
+
+<%}%>
+<%if (isImplementation && genModel.isDynamicDelegation()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.dynamicDelegation" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.reflectiveDelegation.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/reflectiveDelegation.override.javajetinc%>
+<%if (isImplementation) {%>
+<%new Runnable() { public void run() { GenClass classExtendsGenClass = genClass.getClassExtendsGenClass(); List<GenFeature> classExtendsAllGenFeatures = classExtendsGenClass == null? Collections.<GenFeature>emptyList() : classExtendsGenClass.getAllGenFeatures();%>
+  <%for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeatureReified.override" args="genFeature:genFeature,classExtendsGenClass:classExtendsGenClass,classExtendsAllGenFeatures:classExtendsAllGenFeatures,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/genFeatureReified.override.javajetinc%>
+<%}}}.run();}%>
+<%new Runnable() { public void run() {%>
+<%for (GenFeature genFeature : (isImplementation ? genClass.getImplementedGenFeatures() : genClass.getDeclaredGenFeatures())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/genFeature.override.javajetinc%>
+<%}//for%>
+<%}}.run();%>
+<%for (GenOperation genOperation : (isImplementation ? genClass.getImplementedGenOperations() : genClass.getDeclaredGenOperations())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.genOperation.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/implementedGenOperation.override.javajetinc%>
+<%}//for%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseAddGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+    <%for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {%>
+      <%if (genFeature.isUncheckedCast(genClass)) {%>
+	@SuppressWarnings("unchecked")
+      <%break; }%>
+    <%}%>
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseAdd(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.isListType()) { String cast = "("  + genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList") + (!genModel.useGenerics() ? ")" : "<" + genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject") + ">)(" + genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList") + "<?>)");%>
+    <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
+				return ((<%=cast%>(<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap()).basicAdd(otherEnd, msgs);
+    <%} else {%>
+				return (<%=cast%><%=genFeature.getGetAccessor()%>()).basicAdd(otherEnd, msgs);
+    <%}%>
+  <%} else if (genFeature.isContainer()) {%>
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+    <%if (genFeature.isBasicSet()) {%>
+				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)otherEnd, msgs);
+    <%} else {%>
+				return eBasicSetContainer(otherEnd, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+    <%}%>
+  <%} else {%>
+    <%if (genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+    <%} else if (genFeature.isVolatile() || genClass.getImplementingGenModel(genFeature).isDynamicDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = <%if (genFeature.isResolveProxies()) {%>basicGet<%=genFeature.getAccessorName()%><%} else {%><%=genFeature.getGetAccessor()%><%}%>();
+    <%}%>
+				if (<%=genFeature.getSafeName()%> != null)
+    <%if (genFeature.isEffectiveContains()) {%>
+					msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+    <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+					msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+    <%}%>
+				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)otherEnd, msgs);
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eInverseAdd(otherEnd, featureID, msgs);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicInverseAdd(otherEnd, featureID, msgs);
+<%}%>
+<%if (forceDefaultCase) {%>
+		}
+<%}%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseRemoveGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseRemove(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEInverseRemoveGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.isListType()) {%>
+    <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%><%=singleWildcard%>)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap()).basicRemove(otherEnd, msgs);
+    <%} else if (genFeature.isWrappedFeatureMapType()) {%>
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%><%=singleWildcard%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).basicRemove(otherEnd, msgs);
+    <%} else {%>
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%><%=singleWildcard%>)<%=genFeature.getGetAccessor()%>()).basicRemove(otherEnd, msgs);
+    <%}%>
+  <%} else if (genFeature.isContainer() && !genFeature.isBasicSet()) {%>
+				return eBasicSetContainer(null, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+  <%} else if (genFeature.isUnsettable()) {%>
+				return basicUnset<%=genFeature.getAccessorName()%>(msgs);
+  <%} else {%>
+				return basicSet<%=genFeature.getAccessorName()%>(null, msgs);
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eInverseRemove(otherEnd, featureID, msgs);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicInverseRemove(otherEnd, featureID, msgs);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEBasicRemoveFromContainerGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eBasicRemoveFromContainerFeature(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		switch (eContainerFeatureID()<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEBasicRemoveFromContainerGenFeatures()) {%>
+  <%GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+				return eInternalContainer().eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eBasicRemoveFromContainerFeature(msgs);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicBasicRemoveFromContainer(msgs);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEGetGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Object eGet(int featureID, boolean resolve, boolean coreType)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEGetGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.isPrimitiveType()) {%>
+    <%if (isJDK50) {%>
+				return <%=genFeature.getGetAccessor()%>();
+    <%} else if (genFeature.isBooleanType()) {%>
+				return <%=genFeature.getGetAccessor()%>() ? Boolean.TRUE : Boolean.FALSE;
+    <%} else {%>
+				return new <%=genFeature.getObjectType(genClass)%>(<%=genFeature.getGetAccessor()%>());
+    <%}%>
+  <%} else if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
+				if (resolve) return <%=genFeature.getGetAccessor()%>();
+				return basicGet<%=genFeature.getAccessorName()%>();
+  <%} else if (genFeature.isMapType()) {%>
+    <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
+				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap();
+				else return <%=genFeature.getGetAccessor()%>();
+    <%} else {%>
+				if (coreType) return <%=genFeature.getGetAccessor()%>();
+				else return <%=genFeature.getGetAccessor()%>().map();
+    <%}%>
+  <%} else if (genFeature.isWrappedFeatureMapType()) {%>
+				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap();
+				return <%=genFeature.getGetAccessor()%>();
+  <%} else if (genFeature.isFeatureMapType()) {%>
+				if (coreType) return <%=genFeature.getGetAccessor()%>();
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).getWrapper();
+  <%} else {%>
+				return <%=genFeature.getGetAccessor()%>();
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eGet(featureID, resolve, coreType);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicGet(featureID, resolve, coreType);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getESetGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+    <%for (GenFeature genFeature : genClass.getESetGenFeatures()) {%>
+      <%if (genFeature.isUncheckedCast(genClass) && !genFeature.isFeatureMapType() && !genFeature.isMapType()) {%>
+	@SuppressWarnings("unchecked")
+      <%break; }%>
+    <%}%>
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public void eSet(int featureID, Object newValue)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+  <%for (GenFeature genFeature : genClass.getESetGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%if (genFeature.isListType()) {%>
+      <%if (genFeature.isWrappedFeatureMapType()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).set(newValue);
+      <%} else if (genFeature.isFeatureMapType()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).set(newValue);
+      <%} else if (genFeature.isMapType()) {%>
+        <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap()).set(newValue);
+        <%} else {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)<%=genFeature.getGetAccessor()%>()).set(newValue);
+        <%}%>
+      <%} else {%>
+				<%=genFeature.getGetAccessor()%>().clear();
+				<%=genFeature.getGetAccessor()%>().addAll((<%=genModel.getImportedName("java.util.Collection")%><%if (isJDK50) {%><? extends <%=genFeature.getListItemType(genClass)%>><%}%>)newValue);
+      <%}%>
+    <%} else if (!isJDK50 && genFeature.isPrimitiveType()) {%>
+				set<%=genFeature.getAccessorName()%>(((<%=genFeature.getObjectType(genClass)%>)newValue).<%=genFeature.getPrimitiveValueFunction()%>());
+    <%} else {%>
+				set<%=genFeature.getAccessorName()%>(<%if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType() || !genFeature.getRawType().equals(genFeature.getType(genClass))) {%>(<%=genFeature.getObjectType(genClass)%>)<%}%>newValue);
+    <%}%>
+				return;
+  <%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+  <%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		super.eSet(featureID, newValue);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%} else {%>
+<%=indentDefaultCase%>		eDynamicSet(featureID, newValue);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEUnsetGenFeatures())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.eUnset.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/eUnset.override.javajetinc%>
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEIsSetGenFeatures())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.eIsSet.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/eIsSet.override.javajetinc%>
+<%}%>
+<%if (isImplementation && (!genClass.getMixinGenFeatures().isEmpty() || genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty())) {%>
+  <%if (!genClass.getMixinGenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+    <%}%>
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<%=singleWildcard%> baseClass)
+	{
+    <%for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {%>
+		if (baseClass == <%=mixinGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (derivedFeatureID<%=negativeOffsetCorrection%>)
+			{
+      <%for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {%>
+				case <%=genClass.getQualifiedFeatureID(genFeature)%>: return <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>;
+      <%}%>
+				default: return -1;
+			}
+		}
+    <%}%>
+		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+	}
+  <%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<%=singleWildcard%> baseClass)
+	{
+  <%for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {%>
+		if (baseClass == <%=mixinGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseFeatureID)
+			{
+    <%for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {%>
+				case <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>: return <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+  <%if (genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty()) {%>
+		if (baseClass == <%=genClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseFeatureID<%=negativeOffsetCorrection%>)
+			{
+    <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+				case <%=genClass.getQualifiedFeatureID(genFeature)%>: return <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+	}
+
+<%}%>
+<%if (genModel.isOperationReflection() && isImplementation && (!genClass.getMixinGenOperations().isEmpty() || !genClass.getOverrideGenOperations(genClass.getExtendedGenOperations(), genClass.getImplementedGenOperations()).isEmpty() || genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public int eDerivedOperationID(int baseOperationID, Class<%=singleWildcard%> baseClass)
+	{
+  <%for (GenClass extendedGenClass : genClass.getExtendedGenClasses()) { List<GenOperation> extendedImplementedGenOperations = extendedGenClass.getImplementedGenOperations(); List<GenOperation> implementedGenOperations = genClass.getImplementedGenOperations();%>
+    <%if (!genClass.getOverrideGenOperations(extendedImplementedGenOperations, implementedGenOperations).isEmpty()) {%>
+		if (baseClass == <%=extendedGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseOperationID)
+			{
+      <%for (GenOperation genOperation : extendedImplementedGenOperations) { GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);%>
+        <%if (implementedGenOperations.contains(overrideGenOperation)) {%>
+				case <%=extendedGenClass.getQualifiedOperationID(genOperation)%>: return <%=genClass.getQualifiedOperationID(overrideGenOperation)%><%=positiveOperationOffsetCorrection%>;
+        <%}%>
+      <%}%>
+				default: return super.eDerivedOperationID(baseOperationID, baseClass);
+			}
+		}
+    <%}%>
+  <%}%>
+  <%for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {%>
+		if (baseClass == <%=mixinGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseOperationID)
+			{
+    <%for (GenOperation genOperation : mixinGenClass.getGenOperations()) { GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);%>
+				case <%=mixinGenClass.getQualifiedOperationID(genOperation)%>: return <%=genClass.getQualifiedOperationID(overrideGenOperation != null ? overrideGenOperation : genOperation)%><%=positiveOperationOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+  <%if (genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty()) {%>
+		if (baseClass == <%=genClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseOperationID<%=negativeOperationOffsetCorrection%>)
+			{
+    <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+				case <%=genClass.getQualifiedOperationID(genOperation)%>: return <%=genClass.getQualifiedOperationID(genOperation)%><%=positiveOperationOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+		return super.eDerivedOperationID(baseOperationID, baseClass);
+	}
+
+<%}%>
+<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
+  <%if (eVirtualValuesField != null) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected Object[] eVirtualValues()
+	{
+		return <%=eVirtualValuesField%>;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected void eSetVirtualValues(Object[] newValues)
+	{
+		<%=eVirtualValuesField%> = newValues;
+	}
+
+  <%}%>
+  <%{ List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());%>
+    <%if (!eVirtualIndexBitFields.isEmpty()) { List<String> allEVirtualIndexBitFields = genClass.getAllEVirtualIndexBitFields(new ArrayList<String>());%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected int eVirtualIndexBits(int offset)
+	{
+		switch (offset)
+		{
+      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
+			case <%=i%> :
+				return <%=allEVirtualIndexBitFields.get(i)%>;
+      <%}%>
+			default :
+				throw new IndexOutOfBoundsException();
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected void eSetVirtualIndexBits(int offset, int newIndexBits)
+	{
+		switch (offset)
+		{
+      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
+			case <%=i%> :
+				<%=allEVirtualIndexBitFields.get(i)%> = newIndexBits;
+				break;
+      <%}%>
+			default :
+				throw new IndexOutOfBoundsException();
+		}
+	}
+
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.isOperationReflection() && isImplementation && !genClass.getImplementedGenOperations().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+  <%if (genModel.useGenerics()) {%>
+    <%boolean isUnchecked = false; boolean isRaw = false; LOOP: for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods() ? genClass.getImplementedGenOperations() : genClass.getAllGenOperations())) { for (GenParameter genParameter : genOperation.getGenParameters()) { if (genParameter.isUncheckedCast()) { if (genParameter.getTypeGenDataType() == null || !genParameter.getTypeGenDataType().isObjectType()) { isUnchecked = true; } if (genParameter.usesOperationTypeParameters() && !genParameter.getEcoreParameter().getEGenericType().getETypeArguments().isEmpty()) { isRaw = true; break LOOP; }}}}%>
+    <%if (isUnchecked) {%>
+	@SuppressWarnings(<%if (!isRaw) {%>"unchecked"<%} else {%>{"rawtypes", "unchecked" }<%}%>)
+    <%}%>
+  <%}%>
+	public Object eInvoke(int operationID, <%=genModel.getImportedName("org.eclipse.emf.common.util.EList")%><%=singleWildcard%> arguments) throws <%=genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException" : "java.lang.reflect.InvocationTargetException")%>
+	{
+		switch (operationID<%=negativeOperationOffsetCorrection%>)
+		{
+<%for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods() ? genClass.getImplementedGenOperations() : genClass.getAllGenOperations())) { List<GenParameter> genParameters = genOperation.getGenParameters(); int size = genParameters.size();  boolean hasCheckedException = genOperation.hasCheckedException(); String indent = hasCheckedException ? "\t" : ""; GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);%>
+			case <%=genClass.getQualifiedOperationID(overrideGenOperation != null ? overrideGenOperation : genOperation)%>:
+  <%if (hasCheckedException) {%>
+				try
+				{
+  <%/*}*/}%>
+  <%if (genOperation.isVoid()) {%>
+				<%=indent%><%=genOperation.getName()%>(<%for (int i = 0; i < size; i++) { GenParameter genParameter = genParameters.get(i);%><%if (!isJDK50 && genParameter.isPrimitiveType()) {%>(<%}%><%if (genParameter.getTypeGenDataType() == null || !genParameter.getTypeGenDataType().isObjectType() || !genParameter.usesOperationTypeParameters() && !genParameter.getRawType().equals(genParameter.getType(genClass))) {%>(<%=genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType() : genParameter.getObjectType(genClass)%>)<%}%>arguments.get(<%=i%>)<%if (!isJDK50 && genParameter.isPrimitiveType()) {%>).<%=genParameter.getPrimitiveValueFunction()%>()<%}%><%if (i < (size - 1)) {%>, <%}%><%}%>);
+				<%=indent%>return null;
+  <%} else {%>
+				<%=indent%>return <%if (!isJDK50 && genOperation.isPrimitiveType()) {%>new <%=genOperation.getObjectType(genClass)%>(<%}%><%=genOperation.getName()%>(<%for (int i = 0; i < size; i++) { GenParameter genParameter = genParameters.get(i);%><%if (!isJDK50 && genParameter.isPrimitiveType()) {%>(<%}%><%if (genParameter.getTypeGenDataType() == null || !genParameter.getTypeGenDataType().isObjectType() || !genParameter.usesOperationTypeParameters() && !genParameter.getRawType().equals(genParameter.getType(genClass))) {%>(<%=genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType() : genParameter.getObjectType(genClass)%>)<%}%>arguments.get(<%=i%>)<%if (!isJDK50 && genParameter.isPrimitiveType()) {%>).<%=genParameter.getPrimitiveValueFunction()%>()<%}%><%if (i < (size - 1)) {%>, <%}%><%}%>)<%if (!isJDK50 && genOperation.isPrimitiveType()) {%>)<%}%>;
+  <%}%>
+  <%if (hasCheckedException) {/*{*/%>
+				}
+				catch (<%=genModel.getImportedName("java.lang.Throwable")%> throwable)
+				{
+					throw new <%=genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException" : "java.lang.reflect.InvocationTargetException")%>(throwable);
+				}
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eInvoke(operationID, arguments);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicInvoke(operationID, arguments);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (!genClass.hasImplementedToStringGenOperation() && isImplementation && !genModel.isReflectiveDelegation() && !genModel.isDynamicDelegation() && !genClass.getToStringGenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public String toString()
+	{
+		if (eIsProxy()) return super.toString();
+
+		<%=genModel.useGenerics() ? "StringBuilder" : "StringBuffer"%> result = new <%=genModel.useGenerics() ? "StringBuilder" : "StringBuffer"%>(super.toString());
+  <%{ boolean first = true;%>
+    <%for (GenFeature genFeature : genClass.getToStringGenFeatures()) {%>
+      <%if (first) { first = false;%>
+		result.append(" (<%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
+      <%} else {%>
+		result.append(", <%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
+      <%}%>
+      <%if (genFeature.isUnsettable() && !genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		if (eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>)) result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>)); else result.append("<unset>");<%=genModel.getNonNLS()%>
+        <%} else {%>
+          <%if (genClass.isFlag(genFeature)) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0); else result.append("<unset>");<%=genModel.getNonNLS()%>
+            <%} else {%>
+		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append(<%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET]); else result.append("<unset>");<%=genModel.getNonNLS()%>
+            <%}%>
+          <%} else {%>
+		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append(<%=genFeature.getSafeName()%>); else result.append("<unset>");<%=genModel.getNonNLS()%>
+          <%}%>
+        <%}%>
+      <%} else {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%><%if (!genFeature.isListType() && !genFeature.isReferenceType()){%>, <%=genFeature.getEDefault()%><%}%>));
+        <%} else {%>
+          <%if (genClass.isFlag(genFeature)) {%>
+          <%if (genFeature.isBooleanType()) {%>
+		result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0);
+          <%} else {%>
+		result.append(<%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET]);
+          <%}%>
+          <%} else {%>
+		result.append(<%=genFeature.getSafeName()%>);
+          <%}%>
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+		result.append(')');
+		return result.toString();
+	}
+
+<%}%>
+<%if (isImplementation && genClass.isMapEntry()) { GenFeature keyFeature = genClass.getMapEntryKeyFeature(); GenFeature valueFeature = genClass.getMapEntryValueFeature();%>
+<%String objectType = genModel.getImportedName("java.lang.Object");%>
+<%String keyType = isJDK50 ? keyFeature.getObjectType(genClass) : objectType;%>
+<%String valueType = isJDK50 ? valueFeature.getObjectType(genClass) : objectType;%>
+<%String eMapType = genModel.getImportedName("org.eclipse.emf.common.util.EMap") + (isJDK50 ? "<" + keyType + ", " + valueType + ">" : "");%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int hash = -1;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public int getHash()
+	{
+		if (hash == -1)
+		{
+			<%=objectType%> theKey = getKey();
+			hash = (theKey == null ? 0 : theKey.hashCode());
+		}
+		return hash;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public void setHash(int hash)
+	{
+		this.hash = hash;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=keyType%> getKey()
+	{
+  <%if (!isJDK50 && keyFeature.isPrimitiveType()) {%>
+		return new <%=keyFeature.getObjectType(genClass)%>(getTypedKey());
+  <%} else {%>
+		return getTypedKey();
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public void setKey(<%=keyType%> key)
+	{
+  <%if (keyFeature.isListType()) {%>
+		getTypedKey().addAll(<%if (!genModel.useGenerics()) {%>(<%=genModel.getImportedName("java.util.Collection")%>)<%}%>key);
+  <%} else if (isJDK50) {%>
+		setTypedKey(key);
+  <%} else if (keyFeature.isPrimitiveType()) {%>
+		setTypedKey(((<%=keyFeature.getObjectType(genClass)%>)key).<%=keyFeature.getPrimitiveValueFunction()%>());
+  <%} else {%>
+		setTypedKey((<%=keyFeature.getImportedType(genClass)%>)key);
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=valueType%> getValue()
+	{
+  <%if (!isJDK50 && valueFeature.isPrimitiveType()) {%>
+		return new <%=valueFeature.getObjectType(genClass)%>(getTypedValue());
+  <%} else {%>
+		return getTypedValue();
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=valueType%> setValue(<%=valueType%> value)
+	{
+		<%=valueType%> oldValue = getValue();
+  <%if (valueFeature.isListType()) {%>
+		getTypedValue().clear();
+		getTypedValue().addAll(<%if (!genModel.useGenerics()) {%>(<%=genModel.getImportedName("java.util.Collection")%>)<%}%>value);
+  <%} else if (isJDK50) {%>
+		setTypedValue(value);
+  <%} else if (valueFeature.isPrimitiveType()) {%>
+		setTypedValue(((<%=valueFeature.getObjectType(genClass)%>)value).<%=valueFeature.getPrimitiveValueFunction()%>());
+  <%} else {%>
+		setTypedValue((<%=valueFeature.getImportedType(genClass)%>)value);
+  <%}%>
+		return oldValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+	public <%=eMapType%> getEMap()
+	{
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%> container = eContainer();
+		return container == null ? null : (<%=eMapType%>)container.eGet(eContainmentFeature());
+	}
+
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+} //<%=isInterface ? " " + genClass.getInterfaceName() : genClass.getClassName()%>
+<%// TODO fix the space above%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Sr5gCGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Sr5gCGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..678d71c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pe_jUDG0Ed-kc8dEZsdm2w/method._Sr5gCGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenClass genClass = parameter;
+argument = ((Object[]) new Object[]{new Object[]{genClass,genClass.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE,Boolean.TRUE}})[0];
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._07nZCWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._07nZCWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._07nZCWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._9fJklHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._9fJklHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..274f829
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._9fJklHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genModel.hasModelPluginClass());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejecjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejecjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejecjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeczG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeczG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeczG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ce3be04
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejedzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getModelDirectory();
+packageName = genModel.getModelPluginPackageName();
+className = genModel.getModelPluginClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeeTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeeTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ece8cce
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._PejeeTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,155 @@
+
+<%
+/**
+ * Copyright (c) 2002-2004 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getModelPluginPackageName()%>;
+
+<%genModel.addImport("org.eclipse.emf.common.EMFPlugin");%>
+<%genModel.addImport("org.eclipse.emf.common.util.ResourceLocator");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This is the central singleton for the <%=genModel.getModelName()%> model plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genModel.hasAPITags()) {%>
+ * <%=genModel.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genModel.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public final class <%=genModel.getModelPluginClassName()%> extends EMFPlugin
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getModelPluginClassName()%> INSTANCE = new <%=genModel.getModelPluginClassName()%>();
+
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+	/**
+	 * 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 <%=genModel.getModelPluginClassName()%>()
+	{
+		super(new ResourceLocator [] {});
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public ResourceLocator getPluginResourceLocator()
+	{
+<%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+		return null;
+<%} else {%>
+		return plugin;
+<%}%>
+	}
+
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+	/**
+	 * 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 -->
+<%if (genModel.needsRuntimeCompatibility()) {%>
+		 * @param descriptor the description of the plugin.
+<%}%>
+		 * @generated
+		 */
+		public Implementation(<%if (genModel.needsRuntimeCompatibility()) {%><%=genModel.getImportedName("org.eclipse.core.runtime.IPluginDescriptor")%> descriptor<%}%>)
+		{
+			super(<%if (genModel.needsRuntimeCompatibility()) {%>descriptor<%}%>);
+
+			// Remember the static instance.
+			//
+			plugin = this;
+		}
+<%if (genModel.isOSGiCompatible()) {%>
+	
+		/**
+		 * The actual implementation of the purely OSGi-compatible <b>Bundle Activator</b>.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public static final class Activator extends <%=genModel.getImportedName("org.eclipse.emf.common.EMFPlugin")%>.OSGiDelegatingBundleActivator
+		{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			protected <%=genModel.getImportedName("org.osgi.framework.BundleActivator")%> createBundle()
+			{
+				return new Implementation();
+			}
+		}
+<%}%>
+	}
+
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._SsWL8WKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._SsWL8WKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PejecDG0Ed-kc8dEZsdm2w/method._SsWL8WKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._063yImKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._063yImKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._063yImKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._9AAxhHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._9AAxhHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..1e675a3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._9AAxhHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.getResource() != GenResourceKind.NONE_LITERAL);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoYzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..9b2987b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoZzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getUtilitiesPackageName();
+className = genPackage.getResourceFactoryClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoaTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoaTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..faad011
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._PesoaTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,96 @@
+
+<%
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getUtilitiesPackageName()%>;
+
+<%genModel.getImportedName("org.eclipse.emf.common.util.URI");%>
+<%genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource Factory</b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see <%=genPackage.getQualifiedResourceClassName()%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public class <%=genPackage.getResourceFactoryClassName()%> extends <%=genPackage.getImportedResourceFactoryBaseClassName()%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (genPackage.hasExtendedMetaData() && !genPackage.hasTargetNamespace()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData")%> extendedMetaData;
+
+<%} else if (genPackage.hasXMLMap()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource$XMLMap")%> xmlMap = new <%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.XMLMapImpl")%>();
+
+<%}%>
+	/**
+	 * Creates an instance of the resource factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getResourceFactoryClassName()%>()
+	{
+		super();
+<%if (genPackage.hasExtendedMetaData() && !genPackage.hasTargetNamespace()) {%>
+		extendedMetaData = new <%=genModel.getImportedName("org.eclipse.emf.ecore.util.BasicExtendedMetaData")%>(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageRegistryImpl")%>(<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE));
+		extendedMetaData.putPackage(null, <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE);
+<%} else if (genPackage.hasXMLMap() && !genPackage.hasTargetNamespace()) {%>
+		xmlMap.setNoNamespacePackage(<%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE);
+<%}%>
+	}
+
+	/**
+	 * Creates an instance of the resource.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Resource createResource(URI uri)
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.ResourceFactoryClass.ResourceFactoryClass.createResource.override" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ResourceFactoryClass/createResource.override.javajetinc%>
+	}
+
+} //<%=genPackage.getResourceFactoryClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._StFy12KPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._StFy12KPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PesoYDG0Ed-kc8dEZsdm2w/method._StFy12KPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._07UeGWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._07UeGWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._07UeGWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._9QQM9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._9QQM9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..483dc38
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._9QQM9HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenEnum genEnum = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47MzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..aa45bf0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47NzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenEnum genEnum = parameter;
+targetPath = genEnum.getGenModel().getModelDirectory();
+packageName = genEnum.getGenPackage().getInterfacePackageName();
+className = genEnum.getName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47OTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47OTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..48f408e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._Pf47OTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,355 @@
+
+<%
+/**
+ * Copyright (c) 2002-2019 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+ */
+%>
+<%GenEnum genEnum = (GenEnum)argument; GenPackage genPackage = genEnum.getGenPackage(); GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getInterfacePackageName()%>;
+
+<%genModel.addImport("java.util.Arrays");%>
+<%genModel.addImport("java.util.List");%>
+<%genModel.addImport("java.util.Collections");%>
+<%genModel.markImportLocation(stringBuffer, genPackage);%>
+<%boolean isEnum = genModel.useGenerics();%>
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b><%=genEnum.getFormattedName()%></b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+<%if (genEnum.hasDocumentation()) {%>
+ * <!-- begin-model-doc -->
+ * <%=genEnum.getDocumentation(genModel.getIndentation(stringBuffer))%>
+ * <!-- end-model-doc -->
+<%}%>
+ * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genEnum.getName()%>()
+<%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genEnum.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+ * @model <%=modelInfo%>
+<%} else {%>
+ *        <%=modelInfo%>
+<%}} if (first) {%>
+ * @model
+<%}}%>
+<%if (genEnum.hasImplicitAPITags(true)) {%>
+ * <%=genEnum.getImplicitAPITags(genModel.getIndentation(stringBuffer), true)%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genEnum.hasImplicitAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public <%if (isEnum) {%>enum<%} else {%>final class<%}%> <%=genEnum.getName()%> <%if (isEnum) {%>implements<%} else {%>extends<%}%> <%=genModel.isSuppressEMFMetaData() && !genModel.isSuppressInterfaces() ? "Internal" + genEnum.getName() : genModel.getImportedName(isEnum ? "org.eclipse.emf.common.util.Enumerator" : "org.eclipse.emf.common.util.AbstractEnumerator")%>
+{
+<%if (isEnum) {%>
+  <%if (genEnum.getGenEnumLiterals().isEmpty()) {%>
+	;
+
+  <%}else {%>
+    <%for (Iterator<GenEnumLiteral> l = genEnum.getGenEnumLiterals().iterator(); l.hasNext(); ) { GenEnumLiteral genEnumLiteral = l.next(); %>
+	/**
+	 * The '<em><b><%=genEnumLiteral.getFormattedName()%></b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+<%if (genEnumLiteral.hasDocumentation()) {%>
+	 * <!-- begin-model-doc -->
+	 * <%=genEnumLiteral.getDocumentation(genModel.getIndentation(stringBuffer))%>
+	 * <!-- end-model-doc -->
+<%}%>
+	 * @see #<%=genEnumLiteral.getEnumLiteralValueConstantName()%>
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isJDK50 && genEnumLiteral.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+      <%}%>
+	<%=genEnumLiteral.getEnumLiteralInstanceConstantName()%>(<%=genEnumLiteral.getValue()%>, "<%=genEnumLiteral.getName()%>", <%=Literals.toStringLiteral(genEnumLiteral.getLiteral(), genModel)%>)<%if (l.hasNext()) {%>,<%} else {%>;<%}%><%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+	/**
+	 * The '<em><b><%=genEnumLiteral.getFormattedName()%></b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+<%if (genEnumLiteral.hasDocumentation()) {%>
+	 * <!-- begin-model-doc -->
+	 * <%=genEnumLiteral.getDocumentation(genModel.getIndentation(stringBuffer))%>
+	 * <!-- end-model-doc -->
+<%}%>
+	 * @see #<%=genEnumLiteral.getEnumLiteralInstanceConstantName()%>
+<%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genEnumLiteral.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+<%} else {%>
+	 *        <%=modelInfo%>
+<%}} if (first) {%>
+	 * @model
+<%}}%>
+	 * @generated
+	 * @ordered
+	 */
+<%if (isJDK50 && genEnumLiteral.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+	public static final int <%=genEnumLiteral.getEnumLiteralValueConstantName()%> = <%=genEnumLiteral.getValue()%>;
+
+<%}%>
+<%if (!isEnum) for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+	/**
+	 * The '<em><b><%=genEnumLiteral.getFormattedName()%></b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genEnumLiteral.getEnumLiteralValueConstantName()%>
+  <%if (genEnumLiteral.hasAPITags()) {%>
+	 * <%=genEnumLiteral.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 * @ordered
+	 */
+<%if (isJDK50 && genEnumLiteral.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+	public static final <%=genEnum.getName()%> <%=genEnumLiteral.getEnumLiteralInstanceConstantName()%> = new <%=genEnum.getName()%>(<%=genEnumLiteral.getEnumLiteralValueConstantName()%>, "<%=genEnumLiteral.getName()%>", <%=Literals.toStringLiteral(genEnumLiteral.getLiteral(), genModel)%>);<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+
+<%}%>
+	/**
+	 * An array of all the '<em><b><%=genEnum.getFormattedName()%></b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final <%=genEnum.getName()%>[] VALUES_ARRAY =
+		new <%=genEnum.getName()%>[]
+		{
+<%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+			<%=genEnumLiteral.getEnumLiteralInstanceConstantName()%>,
+<%}%>
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b><%=genEnum.getFormattedName()%></b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<%if (isEnum) {%><<%=genEnum.getName()%>><%}%> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b><%=genEnum.getFormattedName()%></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 <%=genEnum.getName()%> get(<%=genModel.getImportedName("java.lang.String")%> literal)
+	{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i)
+		{
+			<%=genEnum.getName()%> result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal))
+			{
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b><%=genEnum.getFormattedName()%></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 <%=genEnum.getName()%> getByName(<%=genModel.getImportedName("java.lang.String")%> name)
+	{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i)
+		{
+			<%=genEnum.getName()%> result = VALUES_ARRAY[i];
+			if (result.getName().equals(name))
+			{
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b><%=genEnum.getFormattedName()%></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 <%=genEnum.getName()%> get(int value)
+	{
+		switch (value)
+		{
+<%for (GenEnumLiteral genEnumLiteral : genEnum.getUniqueValuedGenEnumLiterals()) {%>
+			case <%=genEnumLiteral.getEnumLiteralValueConstantName()%>: return <%=genEnumLiteral.getEnumLiteralInstanceConstantName()%>;
+<%}%>
+<%if (forceDefaultCase) { // {%>
+			default: return null;
+		}
+<%} else { // {%>
+		}
+		return null;
+<%} // }%>
+	}
+
+<%if (isEnum) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final <%=genModel.getImportedName("java.lang.String")%> name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final <%=genModel.getImportedName("java.lang.String")%> literal;
+
+<%}%>
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private <%=genEnum.getName()%>(int value, <%=genModel.getImportedName("java.lang.String")%> name, <%=genModel.getImportedName("java.lang.String")%> literal)
+	{
+<%if (isEnum) {%>
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+<%} else {%>
+		super(value, name, literal);
+<%}%>
+	}
+
+<%if (isEnum) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public int getValue()
+	{
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("java.lang.String")%> getName()
+	{
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("java.lang.String")%> getLiteral()
+	{
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("java.lang.String")%> toString()
+	{
+		return literal;
+	}
+	
+<%}%>
+} //<%=genEnum.getName()%>
+<%if (genModel.isSuppressEMFMetaData()&& !genModel.isSuppressInterfaces() ) {%>
+
+  <%if (isEnum) {%>
+/**
+ * A private implementation interface used to hide the inheritance from Enumerator.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+interface Internal<%=genEnum.getName()%> extends org.eclipse.emf.common.util.Enumerator
+{
+	// Empty 
+}
+  <%} else {%>
+/**
+ * A private implementation class to construct the instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+class Internal<%=genEnum.getName()%> extends org.eclipse.emf.common.util.AbstractEnumerator
+{
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Internal<%=genEnum.getName()%>(int value, <%=genModel.getImportedName("java.lang.String")%> name, <%=genModel.getImportedName("java.lang.String")%> literal)
+	{
+		super(value, name, literal);
+	}
+}
+  <%}%>
+<%}%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._SrwWGGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._SrwWGGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..0812d67
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pf47MDG0Ed-kc8dEZsdm2w/method._SrwWGGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenEnum genEnum = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._07LUKWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._07LUKWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._07LUKWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._9cLJFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._9cLJFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..449324b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._9cLJFHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPQzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..91246c9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfcPRzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getReflectionClassPackageName();
+className = genPackage.getFactoryClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfmAQTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfmAQTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..0848dae
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._PfmAQTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,792 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)((Object[])argument)[0]; GenModel genModel=genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]); boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+<%String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%if (isInterface || genModel.isSuppressInterfaces()) {%>
+package <%=genPackage.getReflectionPackageName()%>;
+<%} else {%>
+package <%=genPackage.getClassPackageName()%>;
+<%}%>
+
+<%if (isImplementation) {%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EClass");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EObject");%>
+<%if (!genPackage.hasJavaLangConflict() && !genPackage.hasInterfaceImplConflict() && !genPackage.getClassPackageName().equals(genPackage.getInterfacePackageName())) genModel.addImport(genPackage.getInterfacePackageName() + ".*");%>
+<%}%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+<%if (isInterface) {%>
+/**
+ * <!-- 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 -->
+<%if (!genModel.isSuppressEMFMetaData()) {%>
+ * @see <%=genPackage.getQualifiedPackageInterfaceName()%>
+<%}%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%} else {%>
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%}%>
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+  <%if (isJDK50 && !genPackage.hasAPIDeprecatedTag()) { List<GenClassifier> genClassifiers = new ArrayList<GenClassifier>(genPackage.getGenClassifiers()); for (Iterator<GenClassifier> i = genClassifiers.iterator(); i.hasNext(); ) { GenClassifier genClassifier = i.next(); if (genClassifier instanceof GenClass && ((GenClass)genClassifier).isAbstract()) i.remove(); } if (GenModelUtil.hasAPIDeprecatedTag(genClassifiers)) {%>
+@SuppressWarnings("deprecation")
+  <%}}%>
+public class <%=genPackage.getFactoryClassName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.EFactoryImpl")%><%if (!genModel.isSuppressInterfaces()) {%> implements <%=genPackage.getImportedFactoryInterfaceName()%><%}%>
+<%} else {%>
+public interface <%=genPackage.getFactoryInterfaceName()%><%if (!genModel.isSuppressEMFMetaData()) {%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.EFactory")%><%}%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isImplementation && (genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces())) {%>
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getFactoryClassName()%> eINSTANCE = init();
+
+<%}%>
+<%if (isInterface && genModel.isSuppressEMFMetaData()) {%>
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getFactoryInterfaceName()%> INSTANCE = <%=genPackage.getQualifiedFactoryClassName()%>.eINSTANCE;
+
+<%} else if (isInterface && !genModel.isSuppressInterfaces()) {%>
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getFactoryInterfaceName()%> eINSTANCE = <%=genPackage.getQualifiedFactoryClassName()%>.init();
+
+<%}%>
+<%if (isImplementation) {%>
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%String factoryType = genModel.isSuppressEMFMetaData() ? genPackage.getFactoryClassName() : genPackage.getImportedFactoryInterfaceName();%>
+	public static <%=factoryType%> init()
+	{
+		try
+		{
+			<%=factoryType%> the<%=genPackage.getFactoryName()%> = (<%=factoryType%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEFactory(<%=genPackage.getPackageInterfaceName()%>.eNS_URI);
+			if (the<%=genPackage.getFactoryName()%> != null)
+			{
+				return the<%=genPackage.getFactoryName()%>;
+			}
+		}
+		catch (Exception exception)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.log(exception);
+		}
+		return new <%=genPackage.getImportedFactoryClassName()%>();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getFactoryClassName()%>()
+	{
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public EObject create(EClass eClass)
+	{
+		switch (eClass.getClassifierID())
+		{
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%if (!genClass.isAbstract()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genClass.getClassifierID()%>: return <%=!genClass.isEObjectExtension() ? "(EObject)" : "" %>create<%=genClass.getName()%>();
+<%}%>
+<%}%>
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+	}
+
+<%if (!genPackage.getAllGenDataTypes().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Object createFromString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, String initialValue)
+	{
+		switch (eDataType.getClassifierID())
+		{
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+  <%if (genDataType.isSerializable()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genDataType.getClassifierID()%>:
+				return create<%=genDataType.getName()%>FromString(eDataType, initialValue);
+  <%}%>
+<%}%>
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public String convertToString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, Object instanceValue)
+	{
+		switch (eDataType.getClassifierID())
+		{
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+  <%if (genDataType.isSerializable()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genDataType.getClassifierID()%>:
+				return convert<%=genDataType.getName()%>ToString(eDataType, instanceValue);
+  <%}%>
+<%}%>
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+	}
+
+<%}%>
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+  <%if (!genClass.isAbstract()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()) {%>
+	@Override
+<%}%>
+	public <%=genClass.getTypeParameters()%><%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> create<%=genClass.getName()%>()
+	{
+    <%if (genClass.isDynamic()) {%>
+		<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> <%=genClass.getSafeUncapName()%> = <%=genClass.getCastFromEObject()%>super.create(<%=genClass.getQualifiedClassifierAccessor()%>);
+    <%} else {%>
+		<%=genClass.getImportedClassName()%><%=genClass.getClassTypeArguments()%> <%=genClass.getSafeUncapName()%> = new <%=genClass.getImportedClassName()%><%=genClass.getClassTypeArguments()%>()<%if (genModel.isSuppressInterfaces() && !genPackage.getReflectionPackageName().equals(genPackage.getInterfacePackageName())) {%>{}<%}%>;
+    <%}%>
+		return <%=genClass.getSafeUncapName()%>;
+	}
+
+  <%}%>
+<%}%>
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+  <%if (genDataType.isSerializable()) {%>
+<%if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) { String eDataType = genDataType.getQualifiedClassifierAccessor();%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+    <%if (genModel.useGenerics() && genDataType.isUncheckedCast() && !genDataType.hasCreatorBody()) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+  <%if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=genDataType.getImportedParameterizedInstanceClassName()%> create<%=genDataType.getName()%>(<%if (genDataType.hasCreatorBody()) {%>final <%}%>String <%if (genDataType.hasCreatorBody()) {%>it<%} else {%>literal<%}%>)
+	{
+    <%if (genDataType.hasCreatorBody()) {%>
+		<%=genDataType.getCreatorBody(genModel.getIndentation(stringBuffer))%>
+    <%} else if (genDataType instanceof GenEnum) {%>
+		<%=genDataType.getImportedInstanceClassName()%> result = <%=genDataType.getImportedInstanceClassName()%>.get(literal);
+		if (result == null) throw new IllegalArgumentException("The value '" + literal + "' is not a valid enumerator of '" + <%=eDataType%>.getName() + "'");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+		return result;
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); boolean isPrimitiveConversion = !genDataType.isPrimitiveType() && genBaseType.isPrimitiveType();%>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+        <%if (isPrimitiveConversion && !isJDK50) {%>
+		return new <%=genDataType.getObjectInstanceClassName()%>(create<%=genBaseType.getName()%>(literal));
+        <%} else {%>
+		return create<%=genBaseType.getName()%>(literal);
+        <%}%>
+      <%} else if (genBaseType.getGenPackage().isDataTypeConverters()) {%>
+        <%if (isPrimitiveConversion && !isJDK50) {%>
+		return new <%=genDataType.getObjectInstanceClassName()%>(<%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genBaseType.getName()%>(literal));
+        <%} else {%>
+		return <%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genBaseType.getName()%>(literal);
+        <%}%>
+      <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%><%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genBaseType.getQualifiedClassifierAccessor()%>, literal);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+		if (literal == null) return null;
+		<%=genDataType.getImportedParameterizedInstanceClassName()%> result = new <%=genModel.getImportedName("java.util.ArrayList")%><%if (genModel.useGenerics()) {%><<%=genItemType.getObjectType().getImportedParameterizedInstanceClassName()%>><%}%>();
+      <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+		for (<%=genModel.getImportedName("java.util.StringTokenizer")%> stringTokenizer = new <%=genModel.getImportedName("java.util.StringTokenizer")%>(literal); stringTokenizer.hasMoreTokens(); )
+      <%} else {%>
+		for (String item : split(literal))
+      <%}%>
+		{
+      <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+			String item = stringTokenizer.nextToken();
+      <%}%>
+      <%if (genItemType.getGenPackage() == genPackage) {%>
+        <%if (genPackage.isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.add(create<%=genItemType.getName()%>(item));
+        <%} else {%>
+			result.add(create<%=genItemType.getName()%>FromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+        <%}%>
+      <%} else {%>
+        <%if (genItemType.getGenPackage().isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.add(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genItemType.getName()%>(item));
+        <%} else {%>
+			result.add(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+        <%}%>
+      <%}%>
+		}
+		return result;
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+		if (literal == null) return <%=genDataType.getStaticValue(null)%>;
+		<%=genDataType.getImportedInstanceClassName()%> result = <%=genDataType.getStaticValue(null)%>;
+		RuntimeException exception = null;
+      <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		try
+		{
+      <%if (genMemberType.getGenPackage() == genPackage) {%>
+        <%if (genPackage.isDataTypeConverters()) { if (!genDataType.isPrimitiveType()) genMemberType = genMemberType.getObjectType();%>
+			result = create<%=genMemberType.getName()%>(literal);
+        <%} else {%>
+			result = (<%=genDataType.getObjectInstanceClassName()%>)create<%=genMemberType.getName()%>FromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, literal);
+        <%}%>
+      <%} else {%>
+        <%if (genPackage.isDataTypeConverters()) { if (!genDataType.isPrimitiveType()) genMemberType = genMemberType.getObjectType();%>
+			result = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genMemberType.getName()%>(literal);
+        <%} else {%>
+			result = (<%=genDataType.getObjectInstanceClassName()%>)<%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, literal);
+        <%}%>
+      <%}%>
+			if (<%if (!genDataType.isPrimitiveType()) {%>result != null && <%}%><%=genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician")%>.INSTANCE.validate(<%=eDataType%>, <%if (genDataType.isPrimitiveType() && !isJDK50) {%>new <%=genDataType.getObjectInstanceClassName()%>(result)<%} else {%>result<%}%>, null, null))
+			{
+				return result;
+			}
+		}
+		catch (RuntimeException e)
+		{
+			exception = e;
+		}
+      <%}%>
+		if (<%if (!genDataType.isPrimitiveType()) {%>result != null || <%}%>exception == null) return result;
+    
+		throw exception;
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return (<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)super.createFromString(literal);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else if (genDataType.isPrimitiveType() && !isJDK50) {%>
+		return ((<%=genDataType.getObjectInstanceClassName()%>)super.createFromString(<%=eDataType%>, literal)).<%=genDataType.getPrimitiveValueFunction()%>();
+    <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)<%}%>super.createFromString(<%=eDataType%>, literal);
+    <%}%>
+	}
+
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+    <%if (!genPackage.isDataTypeConverters() && genModel.useGenerics() && genDataType.isUncheckedCast() && !genDataType.hasCreatorBody()) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+	public <%=genDataType.getImportedParameterizedObjectInstanceClassName()%> create<%=genDataType.getName()%>FromString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, String initialValue)
+	{
+    <%if (genDataType instanceof GenEnum) {%>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {%>
+		return create<%=genDataType.getName()%>(initialValue);
+      <%} else {%>
+		<%=((GenEnum)genDataType).getImportedInstanceClassName()%> result = <%=((GenEnum)genDataType).getImportedInstanceClassName()%>.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+		return result;
+      <%}%>
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); %>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+		return <%if (!genDataType.getObjectInstanceClassName().equals(genBaseType.getObjectInstanceClassName())) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%>create<%=genBaseType.getName()%>FromString(<%=genBaseType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%><%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genBaseType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+      <%if (genPackage.isDataTypeConverters()) {%>
+		return create<%=genDataType.getName()%>(initialValue);
+      <%} else {%>
+		if (initialValue == null) return null;
+		<%=genDataType.getImportedParameterizedObjectInstanceClassName()%> result = new <%=genModel.getImportedName("java.util.ArrayList")%><%if (genModel.useGenerics()) {%><<%=genItemType.getObjectType().getImportedParameterizedInstanceClassName()%>><%}%>();
+        <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+		for (<%=genModel.getImportedName("java.util.StringTokenizer")%> stringTokenizer = new <%=genModel.getImportedName("java.util.StringTokenizer")%>(initialValue); stringTokenizer.hasMoreTokens(); )
+        <%} else {%>
+		for (String item : split(initialValue))
+        <%}%>
+		{
+        <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+			String item = stringTokenizer.nextToken();
+        <%}%>
+      <%if (genItemType.getGenPackage() == genPackage) {%>
+			result.add(create<%=genItemType.getName()%>FromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+      <%} else {%>
+			result.add(<%if (!genItemType.isObjectType()) {%>(<%=genItemType.getObjectInstanceClassName()%>)<%}%><%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+      <%}%>
+		}
+		return result;
+      <%}%>
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+      <%if (genPackage.isDataTypeConverters()) {%>
+        <%if (genDataType.isPrimitiveType() && !isJDK50) {%>
+		return new <%=genDataType.getObjectInstanceClassName()%>(create<%=genDataType.getName()%>(initialValue));
+        <%} else {%>
+		return create<%=genDataType.getName()%>(initialValue);
+        <%}%>
+      <%} else {%>
+		if (initialValue == null) return null;
+		<%=genDataType.getObjectInstanceClassName()%> result = null;
+		RuntimeException exception = null;
+      <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		try
+		{
+      <%if (genMemberType.getGenPackage() == genPackage) {%>
+			result = <%if (!genDataType.isObjectType() && !genDataType.getObjectInstanceClassName().equals(genMemberType.getObjectInstanceClassName())) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%>create<%=genMemberType.getName()%>FromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%} else {%>
+			result = <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%><%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%}%>
+			if (result != null && <%=genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician")%>.INSTANCE.validate(eDataType, result, null, null))
+			{
+				return result;
+			}
+		}
+		catch (RuntimeException e)
+		{
+			exception = e;
+		}
+      <%}%>
+		if (result != null || exception == null) return result;
+    
+		throw exception;
+      <%}%>
+    <%} else if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {%>
+		return create<%=genDataType.getName()%>(initialValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)<%}%>super.createFromString(initialValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)<%}%>super.createFromString(eDataType, initialValue);
+    <%}%>
+	}
+
+<%if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) { String eDataType = genDataType.getQualifiedClassifierAccessor();%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+  <%if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public String convert<%=genDataType.getName()%>(<%if (genDataType.hasCreatorBody()) {%>final <%}%><%=genDataType.getImportedBoundedWildcardInstanceClassName()%> <%if (genDataType.hasConverterBody()) {%>it<%} else {%>instanceValue<%}%>)
+	{
+    <%if (genDataType.hasConverterBody()) {%>
+		<%=genDataType.getConverterBody(genModel.getIndentation(stringBuffer))%>
+    <%} else if (genDataType instanceof GenEnum) {%>
+		return instanceValue == null ? null : instanceValue.toString();
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); boolean isPrimitiveConversion = !genDataType.isPrimitiveType() && genBaseType.isPrimitiveType();%>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+        <%if (isPrimitiveConversion) {%>
+		return instanceValue == null ? null : convert<%=genBaseType.getName()%>(instanceValue<%if (!isJDK50) {%>.<%=genBaseType.getPrimitiveValueFunction()%>()<%}%>);
+        <%} else {%>
+		return convert<%=genBaseType.getName()%>(instanceValue);
+        <%}%>
+      <%} else if (genBaseType.getGenPackage().isDataTypeConverters()) {%>
+		return <%=genBaseType.getGenPackage().getQualifiedFactoryInstanceAccessor()%>.convert<%=genBaseType.getName()%>(instanceValue);
+      <%} else {%>
+		return <%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genBaseType.getQualifiedClassifierAccessor()%>, instanceValue);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+		if (instanceValue == null) return null;
+		if (instanceValue.isEmpty()) return "";
+		<%=genModel.getImportedName(genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer")%> result = new <%=genModel.getImportedName(genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer")%>();
+        <%String item; if (!genModel.useGenerics()) { item = "i.next()"; %>
+		for (<%=genModel.getImportedName("java.util.Iterator")%> i = instanceValue.iterator(); i.hasNext(); )
+        <%} else { item = "item";%>
+		for (<%=genModel.getImportedName("java.lang.Object")%> item : instanceValue)
+        <%}%>
+		{
+      <%if (genItemType.getGenPackage() == genPackage) {%>
+        <%if (genPackage.isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.append(convert<%=genItemType.getName()%>((<%=genItemType.getObjectInstanceClassName()%>)<%=item%>));
+        <%} else {%>
+			result.append(convert<%=genItemType.getName()%>ToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%}%>
+      <%} else {%>
+        <%if (genItemType.getGenPackage().isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.append(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convert<%=genItemType.getName()%>((<%=genItemType.getObjectInstanceClassName()%>)<%=item%>));
+        <%} else {%>
+			result.append(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%}%>
+      <%}%>
+			result.append(' ');
+		}
+		return result.substring(0, result.length() - 1);
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+      <%if (!genDataType.isPrimitiveType()) {%>
+		if (instanceValue == null) return null;
+        <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		if (<%=genMemberType.getQualifiedClassifierAccessor()%>.isInstance(instanceValue))
+		{
+			try
+			{
+          <%if (genMemberType.getGenPackage() == genPackage) {%>
+            <%if (genPackage.isDataTypeConverters()) {%>
+              <%if (genMemberType.getQualifiedInstanceClassName().equals(genDataType.getQualifiedInstanceClassName())) {%>
+				String value = convert<%=genMemberType.getName()%>(instanceValue);
+              <%} else if (genMemberType.isPrimitiveType() && !isJDK50) {%>
+				String value = convert<%=genMemberType.getName()%>(((<%=genMemberType.getObjectType().getImportedInstanceClassName()%>)instanceValue).<%=genMemberType.getPrimitiveValueFunction()%>());
+              <%} else {%>
+				String value = convert<%=genMemberType.getName()%>((<%=genMemberType.getObjectType().getImportedBoundedWildcardInstanceClassName()%>)instanceValue);
+              <%}%>
+            <%} else {%>
+				String value = convert<%=genMemberType.getName()%>ToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+            <%}%>
+          <%} else {%>
+            <%if (genMemberType.getGenPackage().isDataTypeConverters()) { genMemberType = genMemberType.getObjectType();%>
+				String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convert<%=genMemberType.getName()%>((<%=genMemberType.getObjectInstanceClassName()%>)instanceValue);
+            <%} else {%>
+				String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+            <%}%>
+          <%}%>
+				if (value != null) return value;
+			}
+			catch (Exception e)
+			{
+				// Keep trying other member types until all have failed.
+			}
+		}
+        <%}%>
+      <%} else {%>
+        <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		try
+		{
+          <%if (genMemberType.getGenPackage() == genPackage) {%>
+            <%if (genPackage.isDataTypeConverters()) {%>
+			String value = convert<%=genMemberType.getName()%>(instanceValue);
+            <%} else {%>
+			String value = convert<%=genMemberType.getName()%>ToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, <%if (!isJDK50) {%>new <%=genMemberType.getObjectInstanceClassName()%>(instanceValue)<%} else {%>instanceValue<%}%>);
+            <%}%>
+          <%} else {%>
+            <%if (genMemberType.getGenPackage().isDataTypeConverters()) {%>
+			String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convert<%=genMemberType.getName()%>(instanceValue);
+            <%} else {%>
+			String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, <%if (!isJDK50) {%>new <%=genMemberType.getObjectInstanceClassName()%>(instanceValue)<%} else {%>instanceValue<%}%>);
+            <%}%>
+          <%}%>
+			if (value != null) return value;
+		}
+		catch (Exception e)
+		{
+			// Keep trying other member types until all have failed.
+		}
+        <%}%>
+      <%}%>
+		throw new IllegalArgumentException("Invalid value: '"+instanceValue+"' for datatype :"+<%=eDataType%>.getName());
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return super.convertToString(instanceValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else if (genDataType.isPrimitiveType() && !isJDK50) {%>
+		return super.convertToString(<%=eDataType%>, new <%=genDataType.getObjectInstanceClassName()%>(instanceValue));
+    <%} else {%>
+		return super.convertToString(<%=eDataType%>, instanceValue);
+    <%}%>
+	}
+
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+    <%if (genModel.useGenerics() && (genDataType.getItemType() != null || genDataType.isUncheckedCast()) && (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody())) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	public String convert<%=genDataType.getName()%>ToString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, Object instanceValue)
+	{
+    <%if (genDataType instanceof GenEnum) {%>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {%>
+		return convert<%=genDataType.getName()%>((<%=genDataType.getImportedInstanceClassName()%>)instanceValue);
+      <%} else {%>
+		return instanceValue == null ? null : instanceValue.toString();
+      <%}%>
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); %>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+		return convert<%=genBaseType.getName()%>ToString(<%=genBaseType.getQualifiedClassifierAccessor()%>, instanceValue);
+      <%} else {%>
+		return <%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genBaseType.getQualifiedClassifierAccessor()%>, instanceValue);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {%>
+		return convert<%=genDataType.getName()%>((<%=genDataType.getImportedBoundedWildcardInstanceClassName()%>)instanceValue);
+      <%} else { final String singleWildcard = genModel.useGenerics() ? "<?>" : "";%>
+		if (instanceValue == null) return null;
+		<%=genModel.getImportedName("java.util.List")%><%=singleWildcard%> list = (<%=genModel.getImportedName("java.util.List")%><%=singleWildcard%>)instanceValue;
+		if (list.isEmpty()) return "";
+		<%=genModel.getImportedName("java.lang.StringBuffer")%> result = new <%=genModel.getImportedName("java.lang.StringBuffer")%>();
+        <%String item; if (!genModel.useGenerics()) { item = "i.next()"; %>
+		for (<%=genModel.getImportedName("java.util.Iterator")%> i = list.iterator(); i.hasNext(); )
+        <%} else { item = "item";%>
+		for (<%=genModel.getImportedName("java.lang.Object")%> item : list)
+        <%}%>
+		{
+        <%if (genItemType.getGenPackage() == genPackage) {%>
+			result.append(convert<%=genItemType.getName()%>ToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%} else {%>
+			result.append(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%}%>
+			result.append(' ');
+		}
+		return result.substring(0, result.length() - 1);
+      <%}%>
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {%>
+        <%if (genDataType.isPrimitiveType()) {%>
+		return instanceValue == null ? null : convert<%=genDataType.getName()%>(((<%=genDataType.getObjectInstanceClassName()%>)instanceValue)<%if (!isJDK50) {%>.<%=genDataType.getPrimitiveValueFunction()%>()<%}%>);
+        <%} else {%>
+		return convert<%=genDataType.getName()%>(instanceValue);
+        <%}%>
+      <%} else {%>
+		if (instanceValue == null) return null;
+        <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		if (<%=genMemberType.getQualifiedClassifierAccessor()%>.isInstance(instanceValue))
+		{
+			try
+			{
+        <%if (genMemberType.getGenPackage() == genPackage) {%>
+				String value = convert<%=genMemberType.getName()%>ToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+        <%} else {%>
+				String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+        <%}%>
+				if (value != null) return value;
+			}
+			catch (Exception e)
+			{
+				// Keep trying other member types until all have failed.
+			}
+		}
+        <%}%>
+		throw new IllegalArgumentException("Invalid value: '"+instanceValue+"' for datatype :"+eDataType.getName());
+      <%}%>
+    <%} else if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {%>
+        <%if (genDataType.isPrimitiveType()) {%>
+		return instanceValue == null ? null : convert<%=genDataType.getName()%>(<%if (!isJDK50) {%>(<%}%>(<%=genDataType.getObjectInstanceClassName()%>)instanceValue<%if (!isJDK50) {%>).<%=genDataType.getPrimitiveValueFunction()%>()<%}%>);
+        <%} else {%>
+		return convert<%=genDataType.getName()%>((<%=genDataType.getImportedBoundedWildcardInstanceClassName()%>)instanceValue);
+        <%}%>
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return super.convertToString(instanceValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else {%>
+		return super.convertToString(eDataType, instanceValue);
+    <%}%>
+	}
+
+  <%}%>
+<%}%>
+<%} else {%>
+  <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+    <%if (genClass.hasFactoryInterfaceCreateMethod()) {%>
+	/**
+	 * Returns a new object of class '<em><%=genClass.getFormattedName()%></em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em><%=genClass.getFormattedName()%></em>'.
+      <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+<%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+	<%=genClass.getTypeParameters()%><%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> create<%=genClass.getName()%>();
+
+    <%}%>
+  <%}%>
+  <%if (genPackage.isDataTypeConverters()) {%>
+    <%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+      <%if (genDataType.isSerializable()) {%>
+	/**
+	 * Returns an instance of data type '<em><%=genDataType.getFormattedName()%></em>' corresponding the given literal.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal a literal of the data type.
+	 * @return a new instance value of the data type.
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=genDataType.getImportedParameterizedInstanceClassName()%> create<%=genDataType.getName()%>(String literal);
+
+	/**
+	 * Returns a literal representation of an instance of data type '<em><%=genDataType.getFormattedName()%></em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param instanceValue an instance value of the data type.
+	 * @return a literal representation of the instance value.
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	String convert<%=genDataType.getName()%>(<%=genDataType.getImportedBoundedWildcardInstanceClassName()%> instanceValue);
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (!isImplementation && !genModel.isSuppressEMFMetaData()) {%>
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	<%=genPackage.getPackageInterfaceName()%> get<%=genPackage.getBasicPackageName()%>();
+
+<%} else if (isImplementation) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+ <%if (useInterfaceOverrideAnnotation && !genModel.isSuppressEMFMetaData()) {%>
+	@Override
+ <%}%>
+	public <%=genPackage.getImportedPackageInterfaceName()%> get<%=genPackage.getBasicPackageName()%>()
+	{
+		return (<%=genPackage.getImportedPackageInterfaceName()%>)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Deprecated
+  <%}%>
+	public static <%=genPackage.getImportedPackageInterfaceName()%> getPackage()
+	{
+		return <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE;
+	}
+
+<%}%>
+} //<%=isInterface ? genPackage.getFactoryInterfaceName() : genPackage.getFactoryClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._StZU2GKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._StZU2GKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..b9705be
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PfcPQDG0Ed-kc8dEZsdm2w/method._StZU2GKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = ((Object[]) new Object[]{new Object[]{genPackage,genPackage.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE,Boolean.TRUE}})[0];
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._08Xm-WKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._08Xm-WKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._08Xm-WKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._9Kva1HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._9Kva1HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..15c07fb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._9Kva1HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenClass genClass = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (!genClass.isExternalInterface() && (!genModel.isSuppressInterfaces() || genClass.isInterface()));
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EEzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e33395b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EFzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenClass genClass = parameter;
+targetPath = genClass.getGenModel().getModelDirectory();
+packageName = genClass.getGenPackage().getInterfacePackageName();
+className = genClass.getInterfaceName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EGTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EGTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..56d4bbd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._Pg8EGTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,989 @@
+
+<%
+/**
+ * Copyright (c) 2002-2019 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+ */
+%>
+<%final GenClass genClass = (GenClass)((Object[])argument)[0]; final GenPackage genPackage = genClass.getGenPackage(); final GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%final boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); final boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]); final boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+<%final boolean isGWT = genModel.getRuntimePlatform() == GenRuntimePlatform.GWT;%>
+<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();final String indentDefaultCase = forceDefaultCase ? "\t\t" : "";%>
+<%final String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+<%final String singleWildcard = isJDK50 ? "<?>" : "";%>
+<%final String negativeOffsetCorrection = genClass.hasOffsetCorrection() ? " - " + genClass.getOffsetCorrectionField(null) : "";%>
+<%final String positiveOffsetCorrection = genClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(null) : "";%>
+<%final String negativeOperationOffsetCorrection = genClass.hasOffsetCorrection() ? " - EOPERATION_OFFSET_CORRECTION" : "";%>
+<%final String positiveOperationOffsetCorrection = genClass.hasOffsetCorrection() ? " + EOPERATION_OFFSET_CORRECTION" : "";%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%if (isInterface) {%>
+package <%=genPackage.getInterfacePackageName()%>;
+<%} else {%>
+package <%=genPackage.getClassPackageName()%>;
+<%}%>
+
+<%genModel.markImportLocation(stringBuffer, genPackage);%>
+<%if (isImplementation) { genClass.addClassPsuedoImports(); }%>
+
+<%if (isInterface) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.interface.javadoc.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/interface.javadoc.override.javajetinc%>
+<%} else {%>
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
+ * <!-- end-user-doc -->
+<%if (!genClass.getImplementedGenFeatures().isEmpty()) {%>
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+<%for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {%>
+ *   <li>{@link <%=genClass.getQualifiedClassName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
+<%}%>
+ * </ul>
+<%}%>
+ *
+<%if (genClass.hasImplicitAPITags()) {%>
+ * <%=genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%}%>
+<%if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+<%if (isJDK50 && !genClass.hasAPIDeprecatedTag() && GenModelUtil.hasImplicitAPIDeprecatedTag(genClass.getEGetGenFeatures(), genClass.getEIsSetGenFeatures(), genClass.getESetGenFeatures(), genClass.getEUnsetGenFeatures(), genClass.getEInverseAddGenFeatures(), genClass.getEInverseRemoveGenFeatures(), genClass.getEBasicRemoveFromContainerGenFeatures(), genClass.getToStringGenFeatures())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public<%if (genClass.isAbstract()) {%> abstract<%}%> class <%=genClass.getClassName()%><%=genClass.getTypeParameters().trim()%><%=genClass.getClassExtends()%><%=genClass.getClassImplements()%>
+<%} else {%>
+public interface <%=genClass.getInterfaceName()%><%=genClass.getTypeParameters().trim()%><%=genClass.getInterfaceExtends()%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isImplementation && genModel.getDriverNumber() != null) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> mofDriverNumber = "<%=genModel.getDriverNumber()%>";<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isImplementation && genClass.isJavaIOSerializable()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final long serialVersionUID = 1L;
+
+<%}%>
+<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
+  <%if (eVirtualValuesField != null) {%>
+	/**
+	 * An array of objects representing the values of non-primitive features.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected Object[] <%=eVirtualValuesField%>;
+
+  <%}%>
+  <%{ List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());%>
+    <%if (!eVirtualIndexBitFields.isEmpty()) {%>
+      <%for (String eVirtualIndexBitField : eVirtualIndexBitFields) {%>
+	/**
+	 * A bit field representing the indices of non-primitive feature values.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=eVirtualIndexBitField%>;
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (isImplementation && genClass.isModelRoot() && genModel.isBooleanFlagsEnabled() && genModel.getBooleanFlagsReservedBits() == -1) {%>
+	/**
+	 * A set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int <%=genModel.getBooleanFlagsField()%> = 0;
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation()) {%>
+  <%for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {%>
+      <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String rawListItemType = genFeature.getRawListItemType(genClass); int index = rawListItemType.indexOf('['); String head = rawListItemType; String tail = ""; if (index != -1) { head = rawListItemType.substring(0, index); tail = rawListItemType.substring(index); } %>
+	/**
+	 * The empty value for the '{@link #<%=genFeature.getGetArrayAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' array accessor.
+	 * This is specialized for the more specific element type known in this context.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #<%=genFeature.getGetArrayAccessor()%>()
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 * @ordered
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+        <%if (genFeature.getQualifiedListItemType(genClass).contains("<") || genFeature.getArrayItemType(genClass).contains("<")) {%>
+	@SuppressWarnings("rawtypes")
+        <%}%>
+	protected static final <%=rawListItemType%>[] <%=genFeature.getUpperName()%>_EEMPTY_ARRAY = new <%=head%> [0]<%=tail%>;
+
+      <%}%>
+  <%}%>
+  <%for (GenFeature genFeature : genClass.getDeclaredFieldGenFeatures()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.declaredFieldGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/declaredFieldGenFeature.override.javajetinc%>
+  <%}%>
+<%}%>
+<%if (isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final int <%=genClass.getOffsetCorrectionField(null)%> = <%=genClass.getQualifiedClassifierAccessor()%>.getFeatureID(<%=genClass.getImplementedGenFeatures().get(0).getQualifiedFeatureAccessor()%>) - <%=genClass.getQualifiedFeatureID(genClass.getImplementedGenFeatures().get(0))%>;
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation()) {%>
+  <%for (GenFeature genFeature : genClass.getImplementedGenFeatures()) { GenFeature reverseFeature = genFeature.getReverse();%>
+    <%if (reverseFeature != null && reverseFeature.getGenClass().hasOffsetCorrection()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+       <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+       <%}%>
+	 * @generated
+	 */
+        <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+        <%}%>
+	private static final int <%=genClass.getOffsetCorrectionField(genFeature)%> = <%=reverseFeature.getGenClass().getQualifiedClassifierAccessor()%>.getFeatureID(<%=reverseFeature.getQualifiedFeatureAccessor()%>) - <%=reverseFeature.getGenClass().getQualifiedFeatureID(reverseFeature)%>;
+
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.isOperationReflection() && isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenOperations().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final int EOPERATION_OFFSET_CORRECTION = <%=genClass.getQualifiedClassifierAccessor()%>.getOperationID(<%=genClass.getImplementedGenOperations().get(0).getQualifiedOperationAccessor()%>) - <%=genClass.getQualifiedOperationID(genClass.getImplementedGenOperations().get(0))%>;
+
+<%}%>
+<%if (isImplementation) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%if (genModel.isPublicConstructors()) {%>public<%} else {%>protected<%}%> <%=genClass.getClassName()%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.egfCustom.constructor.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+  <%for (GenFeature genFeature : genClass.getFlagGenFeaturesWithDefault()) {%>
+		<%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG<%if (!genFeature.isBooleanType()) {%>_DEFAULT<%}%>;
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> eStaticClass()
+	{
+		return <%=genClass.getQualifiedClassifierAccessor()%>;
+	}
+
+<%}%>
+<%if (isImplementation && genModel.isDynamicDelegation()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.dynamicDelegation" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.reflectiveDelegation.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/reflectiveDelegation.override.javajetinc%>
+<%if (isImplementation) {%>
+<%new Runnable() { public void run() { GenClass classExtendsGenClass = genClass.getClassExtendsGenClass(); List<GenFeature> classExtendsAllGenFeatures = classExtendsGenClass == null? Collections.<GenFeature>emptyList() : classExtendsGenClass.getAllGenFeatures();%>
+  <%for (GenFeature genFeature : genClass.getReifiedGenFeatures()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeatureReified.override" args="genFeature:genFeature,classExtendsGenClass:classExtendsGenClass,classExtendsAllGenFeatures:classExtendsAllGenFeatures,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/genFeatureReified.override.javajetinc%>
+<%}}}.run();}%>
+<%new Runnable() { public void run() {%>
+<%for (GenFeature genFeature : (isImplementation ? genClass.getImplementedGenFeatures() : genClass.getDeclaredGenFeatures())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/genFeature.override.javajetinc%>
+<%}//for%>
+<%}}.run();%>
+<%for (GenOperation genOperation : (isImplementation ? genClass.getImplementedGenOperations() : genClass.getDeclaredGenOperations())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.genOperation.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/implementedGenOperation.override.javajetinc%>
+<%}//for%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseAddGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+    <%for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {%>
+      <%if (genFeature.isUncheckedCast(genClass)) {%>
+	@SuppressWarnings("unchecked")
+      <%break; }%>
+    <%}%>
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseAdd(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEInverseAddGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.isListType()) { String cast = "("  + genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList") + (!genModel.useGenerics() ? ")" : "<" + genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject") + ">)(" + genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList") + "<?>)");%>
+    <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
+				return ((<%=cast%>(<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap()).basicAdd(otherEnd, msgs);
+    <%} else {%>
+				return (<%=cast%><%=genFeature.getGetAccessor()%>()).basicAdd(otherEnd, msgs);
+    <%}%>
+  <%} else if (genFeature.isContainer()) {%>
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+    <%if (genFeature.isBasicSet()) {%>
+				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)otherEnd, msgs);
+    <%} else {%>
+				return eBasicSetContainer(otherEnd, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+    <%}%>
+  <%} else {%>
+    <%if (genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+    <%} else if (genFeature.isVolatile() || genClass.getImplementingGenModel(genFeature).isDynamicDelegation()) {%>
+				<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = <%if (genFeature.isResolveProxies()) {%>basicGet<%=genFeature.getAccessorName()%><%} else {%><%=genFeature.getGetAccessor()%><%}%>();
+    <%}%>
+				if (<%=genFeature.getSafeName()%> != null)
+    <%if (genFeature.isEffectiveContains()) {%>
+					msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%><%=negativeOffsetCorrection%>, null, msgs);
+    <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+					msgs = <%=genFeature.getAsInternalEObject(genFeature.getSafeName(), true)%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+    <%}%>
+				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(genClass)%>)otherEnd, msgs);
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eInverseAdd(otherEnd, featureID, msgs);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicInverseAdd(otherEnd, featureID, msgs);
+<%}%>
+<%if (forceDefaultCase) {%>
+		}
+<%}%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseRemoveGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseRemove(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEInverseRemoveGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.isListType()) {%>
+    <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%><%=singleWildcard%>)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap()).basicRemove(otherEnd, msgs);
+    <%} else if (genFeature.isWrappedFeatureMapType()) {%>
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%><%=singleWildcard%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).basicRemove(otherEnd, msgs);
+    <%} else {%>
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%><%=singleWildcard%>)<%=genFeature.getGetAccessor()%>()).basicRemove(otherEnd, msgs);
+    <%}%>
+  <%} else if (genFeature.isContainer() && !genFeature.isBasicSet()) {%>
+				return eBasicSetContainer(null, <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, msgs);
+  <%} else if (genFeature.isUnsettable()) {%>
+				return basicUnset<%=genFeature.getAccessorName()%>(msgs);
+  <%} else {%>
+				return basicSet<%=genFeature.getAccessorName()%>(null, msgs);
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eInverseRemove(otherEnd, featureID, msgs);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicInverseRemove(otherEnd, featureID, msgs);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEBasicRemoveFromContainerGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eBasicRemoveFromContainerFeature(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		switch (eContainerFeatureID()<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEBasicRemoveFromContainerGenFeatures()) {%>
+  <%GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass(); String reverseOffsetCorrection = targetClass.hasOffsetCorrection() ? " + " + genClass.getOffsetCorrectionField(genFeature) : "";%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+				return eInternalContainer().eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%><%=reverseOffsetCorrection%>, <%=targetClass.getRawImportedInterfaceName()%>.class, msgs);
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eBasicRemoveFromContainerFeature(msgs);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicBasicRemoveFromContainer(msgs);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEGetGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Object eGet(int featureID, boolean resolve, boolean coreType)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+<%for (GenFeature genFeature : genClass.getEGetGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+  <%if (genFeature.isPrimitiveType()) {%>
+    <%if (isJDK50) {%>
+				return <%=genFeature.getGetAccessor()%>();
+    <%} else if (genFeature.isBooleanType()) {%>
+				return <%=genFeature.getGetAccessor()%>() ? Boolean.TRUE : Boolean.FALSE;
+    <%} else {%>
+				return new <%=genFeature.getObjectType(genClass)%>(<%=genFeature.getGetAccessor()%>());
+    <%}%>
+  <%} else if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
+				if (resolve) return <%=genFeature.getGetAccessor()%>();
+				return basicGet<%=genFeature.getAccessorName()%>();
+  <%} else if (genFeature.isMapType()) {%>
+    <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
+				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap();
+				else return <%=genFeature.getGetAccessor()%>();
+    <%} else {%>
+				if (coreType) return <%=genFeature.getGetAccessor()%>();
+				else return <%=genFeature.getGetAccessor()%>().map();
+    <%}%>
+  <%} else if (genFeature.isWrappedFeatureMapType()) {%>
+				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap();
+				return <%=genFeature.getGetAccessor()%>();
+  <%} else if (genFeature.isFeatureMapType()) {%>
+				if (coreType) return <%=genFeature.getGetAccessor()%>();
+				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).getWrapper();
+  <%} else {%>
+				return <%=genFeature.getGetAccessor()%>();
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eGet(featureID, resolve, coreType);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicGet(featureID, resolve, coreType);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getESetGenFeatures())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+    <%for (GenFeature genFeature : genClass.getESetGenFeatures()) {%>
+      <%if (genFeature.isUncheckedCast(genClass) && !genFeature.isFeatureMapType() && !genFeature.isMapType()) {%>
+	@SuppressWarnings("unchecked")
+      <%break; }%>
+    <%}%>
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public void eSet(int featureID, Object newValue)
+	{
+		switch (featureID<%=negativeOffsetCorrection%>)
+		{
+  <%for (GenFeature genFeature : genClass.getESetGenFeatures()) {%>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%if (genFeature.isListType()) {%>
+      <%if (genFeature.isWrappedFeatureMapType()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).set(newValue);
+      <%} else if (genFeature.isFeatureMapType()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).set(newValue);
+      <%} else if (genFeature.isMapType()) {%>
+        <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView<%=genFeature.getImportedMapTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>()).eMap()).set(newValue);
+        <%} else {%>
+				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)<%=genFeature.getGetAccessor()%>()).set(newValue);
+        <%}%>
+      <%} else {%>
+				<%=genFeature.getGetAccessor()%>().clear();
+				<%=genFeature.getGetAccessor()%>().addAll((<%=genModel.getImportedName("java.util.Collection")%><%if (isJDK50) {%><? extends <%=genFeature.getListItemType(genClass)%>><%}%>)newValue);
+      <%}%>
+    <%} else if (!isJDK50 && genFeature.isPrimitiveType()) {%>
+				set<%=genFeature.getAccessorName()%>(((<%=genFeature.getObjectType(genClass)%>)newValue).<%=genFeature.getPrimitiveValueFunction()%>());
+    <%} else {%>
+				set<%=genFeature.getAccessorName()%>(<%if (genFeature.getTypeGenDataType() == null || !genFeature.getTypeGenDataType().isObjectType() || !genFeature.getRawType().equals(genFeature.getType(genClass))) {%>(<%=genFeature.getObjectType(genClass)%>)<%}%>newValue);
+    <%}%>
+				return;
+  <%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+  <%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		super.eSet(featureID, newValue);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%} else {%>
+<%=indentDefaultCase%>		eDynamicSet(featureID, newValue);
+<%if (forceDefaultCase) {%>
+				return;
+<%}%>
+  <%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEUnsetGenFeatures())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.eUnset.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/eUnset.override.javajetinc%>
+<%}%>
+<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEIsSetGenFeatures())) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.eIsSet.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%><%//Class/eIsSet.override.javajetinc%>
+<%}%>
+<%if (isImplementation && (!genClass.getMixinGenFeatures().isEmpty() || genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty())) {%>
+  <%if (!genClass.getMixinGenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+    <%}%>
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<%=singleWildcard%> baseClass)
+	{
+    <%for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {%>
+		if (baseClass == <%=mixinGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (derivedFeatureID<%=negativeOffsetCorrection%>)
+			{
+      <%for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {%>
+				case <%=genClass.getQualifiedFeatureID(genFeature)%>: return <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>;
+      <%}%>
+				default: return -1;
+			}
+		}
+    <%}%>
+		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+	}
+  <%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<%=singleWildcard%> baseClass)
+	{
+  <%for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {%>
+		if (baseClass == <%=mixinGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseFeatureID)
+			{
+    <%for (GenFeature genFeature : mixinGenClass.getGenFeatures()) {%>
+				case <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>: return <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+  <%if (genClass.hasOffsetCorrection() && !genClass.getGenFeatures().isEmpty()) {%>
+		if (baseClass == <%=genClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseFeatureID<%=negativeOffsetCorrection%>)
+			{
+    <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+				case <%=genClass.getQualifiedFeatureID(genFeature)%>: return <%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+	}
+
+<%}%>
+<%if (genModel.isOperationReflection() && isImplementation && (!genClass.getMixinGenOperations().isEmpty() || !genClass.getOverrideGenOperations(genClass.getExtendedGenOperations(), genClass.getImplementedGenOperations()).isEmpty() || genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public int eDerivedOperationID(int baseOperationID, Class<%=singleWildcard%> baseClass)
+	{
+  <%for (GenClass extendedGenClass : genClass.getExtendedGenClasses()) { List<GenOperation> extendedImplementedGenOperations = extendedGenClass.getImplementedGenOperations(); List<GenOperation> implementedGenOperations = genClass.getImplementedGenOperations();%>
+    <%if (!genClass.getOverrideGenOperations(extendedImplementedGenOperations, implementedGenOperations).isEmpty()) {%>
+		if (baseClass == <%=extendedGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseOperationID)
+			{
+      <%for (GenOperation genOperation : extendedImplementedGenOperations) { GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);%>
+        <%if (implementedGenOperations.contains(overrideGenOperation)) {%>
+				case <%=extendedGenClass.getQualifiedOperationID(genOperation)%>: return <%=genClass.getQualifiedOperationID(overrideGenOperation)%><%=positiveOperationOffsetCorrection%>;
+        <%}%>
+      <%}%>
+				default: return super.eDerivedOperationID(baseOperationID, baseClass);
+			}
+		}
+    <%}%>
+  <%}%>
+  <%for (GenClass mixinGenClass : genClass.getMixinGenClasses()) {%>
+		if (baseClass == <%=mixinGenClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseOperationID)
+			{
+    <%for (GenOperation genOperation : mixinGenClass.getGenOperations()) { GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);%>
+				case <%=mixinGenClass.getQualifiedOperationID(genOperation)%>: return <%=genClass.getQualifiedOperationID(overrideGenOperation != null ? overrideGenOperation : genOperation)%><%=positiveOperationOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+  <%if (genClass.hasOffsetCorrection() && !genClass.getGenOperations().isEmpty()) {%>
+		if (baseClass == <%=genClass.getRawImportedInterfaceName()%>.class)
+		{
+			switch (baseOperationID<%=negativeOperationOffsetCorrection%>)
+			{
+    <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+				case <%=genClass.getQualifiedOperationID(genOperation)%>: return <%=genClass.getQualifiedOperationID(genOperation)%><%=positiveOperationOffsetCorrection%>;
+    <%}%>
+				default: return -1;
+			}
+		}
+  <%}%>
+		return super.eDerivedOperationID(baseOperationID, baseClass);
+	}
+
+<%}%>
+<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
+  <%if (eVirtualValuesField != null) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected Object[] eVirtualValues()
+	{
+		return <%=eVirtualValuesField%>;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected void eSetVirtualValues(Object[] newValues)
+	{
+		<%=eVirtualValuesField%> = newValues;
+	}
+
+  <%}%>
+  <%{ List<String> eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList<String>());%>
+    <%if (!eVirtualIndexBitFields.isEmpty()) { List<String> allEVirtualIndexBitFields = genClass.getAllEVirtualIndexBitFields(new ArrayList<String>());%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected int eVirtualIndexBits(int offset)
+	{
+		switch (offset)
+		{
+      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
+			case <%=i%> :
+				return <%=allEVirtualIndexBitFields.get(i)%>;
+      <%}%>
+			default :
+				throw new IndexOutOfBoundsException();
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected void eSetVirtualIndexBits(int offset, int newIndexBits)
+	{
+		switch (offset)
+		{
+      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
+			case <%=i%> :
+				<%=allEVirtualIndexBitFields.get(i)%> = newIndexBits;
+				break;
+      <%}%>
+			default :
+				throw new IndexOutOfBoundsException();
+		}
+	}
+
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.isOperationReflection() && isImplementation && !genClass.getImplementedGenOperations().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+  <%if (genModel.useGenerics()) {%>
+    <%boolean isUnchecked = false; boolean isRaw = false; LOOP: for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods() ? genClass.getImplementedGenOperations() : genClass.getAllGenOperations())) { for (GenParameter genParameter : genOperation.getGenParameters()) { if (genParameter.isUncheckedCast()) { if (genParameter.getTypeGenDataType() == null || !genParameter.getTypeGenDataType().isObjectType()) { isUnchecked = true; } if (genParameter.usesOperationTypeParameters() && !genParameter.getEcoreParameter().getEGenericType().getETypeArguments().isEmpty()) { isRaw = true; break LOOP; }}}}%>
+    <%if (isUnchecked) {%>
+	@SuppressWarnings(<%if (!isRaw) {%>"unchecked"<%} else {%>{"rawtypes", "unchecked" }<%}%>)
+    <%}%>
+  <%}%>
+	public Object eInvoke(int operationID, <%=genModel.getImportedName("org.eclipse.emf.common.util.EList")%><%=singleWildcard%> arguments) throws <%=genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException" : "java.lang.reflect.InvocationTargetException")%>
+	{
+		switch (operationID<%=negativeOperationOffsetCorrection%>)
+		{
+<%for (GenOperation genOperation : (genModel.isMinimalReflectiveMethods() ? genClass.getImplementedGenOperations() : genClass.getAllGenOperations())) { List<GenParameter> genParameters = genOperation.getGenParameters(); int size = genParameters.size();  boolean hasCheckedException = genOperation.hasCheckedException(); String indent = hasCheckedException ? "\t" : ""; GenOperation overrideGenOperation = genClass.getOverrideGenOperation(genOperation);%>
+			case <%=genClass.getQualifiedOperationID(overrideGenOperation != null ? overrideGenOperation : genOperation)%>:
+  <%if (hasCheckedException) {%>
+				try
+				{
+  <%/*}*/}%>
+  <%if (genOperation.isVoid()) {%>
+				<%=indent%><%=genOperation.getName()%>(<%for (int i = 0; i < size; i++) { GenParameter genParameter = genParameters.get(i);%><%if (!isJDK50 && genParameter.isPrimitiveType()) {%>(<%}%><%if (genParameter.getTypeGenDataType() == null || !genParameter.getTypeGenDataType().isObjectType() || !genParameter.usesOperationTypeParameters() && !genParameter.getRawType().equals(genParameter.getType(genClass))) {%>(<%=genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType() : genParameter.getObjectType(genClass)%>)<%}%>arguments.get(<%=i%>)<%if (!isJDK50 && genParameter.isPrimitiveType()) {%>).<%=genParameter.getPrimitiveValueFunction()%>()<%}%><%if (i < (size - 1)) {%>, <%}%><%}%>);
+				<%=indent%>return null;
+  <%} else {%>
+				<%=indent%>return <%if (!isJDK50 && genOperation.isPrimitiveType()) {%>new <%=genOperation.getObjectType(genClass)%>(<%}%><%=genOperation.getName()%>(<%for (int i = 0; i < size; i++) { GenParameter genParameter = genParameters.get(i);%><%if (!isJDK50 && genParameter.isPrimitiveType()) {%>(<%}%><%if (genParameter.getTypeGenDataType() == null || !genParameter.getTypeGenDataType().isObjectType() || !genParameter.usesOperationTypeParameters() && !genParameter.getRawType().equals(genParameter.getType(genClass))) {%>(<%=genParameter.usesOperationTypeParameters() ? genParameter.getRawImportedType() : genParameter.getObjectType(genClass)%>)<%}%>arguments.get(<%=i%>)<%if (!isJDK50 && genParameter.isPrimitiveType()) {%>).<%=genParameter.getPrimitiveValueFunction()%>()<%}%><%if (i < (size - 1)) {%>, <%}%><%}%>)<%if (!isJDK50 && genOperation.isPrimitiveType()) {%>)<%}%>;
+  <%}%>
+  <%if (hasCheckedException) {/*{*/%>
+				}
+				catch (<%=genModel.getImportedName("java.lang.Throwable")%> throwable)
+				{
+					throw new <%=genModel.getImportedName(isGWT ? "org.eclipse.emf.common.util.InvocationTargetException" : "java.lang.reflect.InvocationTargetException")%>(throwable);
+				}
+  <%}%>
+<%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%if (genModel.isMinimalReflectiveMethods()) {%>
+<%=indentDefaultCase%>		return super.eInvoke(operationID, arguments);
+<%} else {%>
+<%=indentDefaultCase%>		return eDynamicInvoke(operationID, arguments);
+<%}%>
+<%if (forceDefaultCase) { // {%>
+		}
+<%} // }%>
+	}
+
+<%}%>
+<%if (!genClass.hasImplementedToStringGenOperation() && isImplementation && !genModel.isReflectiveDelegation() && !genModel.isDynamicDelegation() && !genClass.getToStringGenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public String toString()
+	{
+		if (eIsProxy()) return super.toString();
+
+		<%=genModel.useGenerics() ? "StringBuilder" : "StringBuffer"%> result = new <%=genModel.useGenerics() ? "StringBuilder" : "StringBuffer"%>(super.toString());
+  <%{ boolean first = true;%>
+    <%for (GenFeature genFeature : genClass.getToStringGenFeatures()) {%>
+      <%if (first) { first = false;%>
+		result.append(" (<%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
+      <%} else {%>
+		result.append(", <%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
+      <%}%>
+      <%if (genFeature.isUnsettable() && !genFeature.isListType()) {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		if (eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>)) result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>)); else result.append("<unset>");<%=genModel.getNonNLS()%>
+        <%} else {%>
+          <%if (genClass.isFlag(genFeature)) {%>
+            <%if (genFeature.isBooleanType()) {%>
+		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0); else result.append("<unset>");<%=genModel.getNonNLS()%>
+            <%} else {%>
+		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append(<%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET]); else result.append("<unset>");<%=genModel.getNonNLS()%>
+            <%}%>
+          <%} else {%>
+		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append(<%=genFeature.getSafeName()%>); else result.append("<unset>");<%=genModel.getNonNLS()%>
+          <%}%>
+        <%}%>
+      <%} else {%>
+        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
+		result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%><%if (!genFeature.isListType() && !genFeature.isReferenceType()){%>, <%=genFeature.getEDefault()%><%}%>));
+        <%} else {%>
+          <%if (genClass.isFlag(genFeature)) {%>
+          <%if (genFeature.isBooleanType()) {%>
+		result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0);
+          <%} else {%>
+		result.append(<%=genFeature.getUpperName()%>_EFLAG_VALUES[(<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) >>> <%=genFeature.getUpperName()%>_EFLAG_OFFSET]);
+          <%}%>
+          <%} else {%>
+		result.append(<%=genFeature.getSafeName()%>);
+          <%}%>
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+		result.append(')');
+		return result.toString();
+	}
+
+<%}%>
+<%if (isImplementation && genClass.isMapEntry()) { GenFeature keyFeature = genClass.getMapEntryKeyFeature(); GenFeature valueFeature = genClass.getMapEntryValueFeature();%>
+<%String objectType = genModel.getImportedName("java.lang.Object");%>
+<%String keyType = isJDK50 ? keyFeature.getObjectType(genClass) : objectType;%>
+<%String valueType = isJDK50 ? valueFeature.getObjectType(genClass) : objectType;%>
+<%String eMapType = genModel.getImportedName("org.eclipse.emf.common.util.EMap") + (isJDK50 ? "<" + keyType + ", " + valueType + ">" : "");%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+      <%if (isGWT) {%>
+	@<%=genModel.getImportedName("com.google.gwt.user.client.rpc.GwtTransient")%>
+      <%}%>
+	protected int hash = -1;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public int getHash()
+	{
+		if (hash == -1)
+		{
+			<%=objectType%> theKey = getKey();
+			hash = (theKey == null ? 0 : theKey.hashCode());
+		}
+		return hash;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public void setHash(int hash)
+	{
+		this.hash = hash;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=keyType%> getKey()
+	{
+  <%if (!isJDK50 && keyFeature.isPrimitiveType()) {%>
+		return new <%=keyFeature.getObjectType(genClass)%>(getTypedKey());
+  <%} else {%>
+		return getTypedKey();
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public void setKey(<%=keyType%> key)
+	{
+  <%if (keyFeature.isListType()) {%>
+		getTypedKey().addAll(<%if (!genModel.useGenerics()) {%>(<%=genModel.getImportedName("java.util.Collection")%>)<%}%>key);
+  <%} else if (isJDK50) {%>
+		setTypedKey(key);
+  <%} else if (keyFeature.isPrimitiveType()) {%>
+		setTypedKey(((<%=keyFeature.getObjectType(genClass)%>)key).<%=keyFeature.getPrimitiveValueFunction()%>());
+  <%} else {%>
+		setTypedKey((<%=keyFeature.getImportedType(genClass)%>)key);
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=valueType%> getValue()
+	{
+  <%if (!isJDK50 && valueFeature.isPrimitiveType()) {%>
+		return new <%=valueFeature.getObjectType(genClass)%>(getTypedValue());
+  <%} else {%>
+		return getTypedValue();
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=valueType%> setValue(<%=valueType%> value)
+	{
+		<%=valueType%> oldValue = getValue();
+  <%if (valueFeature.isListType()) {%>
+		getTypedValue().clear();
+		getTypedValue().addAll(<%if (!genModel.useGenerics()) {%>(<%=genModel.getImportedName("java.util.Collection")%>)<%}%>value);
+  <%} else if (isJDK50) {%>
+		setTypedValue(value);
+  <%} else if (valueFeature.isPrimitiveType()) {%>
+		setTypedValue(((<%=valueFeature.getObjectType(genClass)%>)value).<%=valueFeature.getPrimitiveValueFunction()%>());
+  <%} else {%>
+		setTypedValue((<%=valueFeature.getImportedType(genClass)%>)value);
+  <%}%>
+		return oldValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useGenerics()) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+	public <%=eMapType%> getEMap()
+	{
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%> container = eContainer();
+		return container == null ? null : (<%=eMapType%>)container.eGet(eContainmentFeature());
+	}
+
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+} //<%=isInterface ? " " + genClass.getInterfaceName() : genClass.getClassName()%>
+<%// TODO fix the space above%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._SrmlGGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._SrmlGGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..679b588
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pg8EEDG0Ed-kc8dEZsdm2w/method._SrmlGGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenClass genClass = parameter;
+argument = ((Object[]) new Object[]{new Object[]{genClass,Boolean.TRUE,Boolean.FALSE}})[0];
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._08zr2WKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._08zr2WKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._08zr2WKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._9S7thHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._9S7thHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..d3a7554
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._9S7thHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && !genModel.isSuppressEMFMetaData() && !genModel.isSuppressInterfaces());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsMzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsNTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsNTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgCsNTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..c6fdc92
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getReflectionPackageName();
+className = genPackage.getPackageInterfaceName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..90684dd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._PgL2IjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,1348 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%final GenPackage genPackage = (GenPackage)((Object[])argument)[0]; final GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]);  boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+<%boolean packageNeedsSuppressDeprecation = isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getOrderedGenClassifiers()) && !genPackage.hasAPIDeprecatedTag() && !genModel.isSuppressEMFMetaData();%>
+<%String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+<%boolean needsAddEOperation = false;%>
+<%boolean needsAddEParameter = false;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%if (isImplementation && !genModel.isSuppressInterfaces()) {%>
+package <%=genPackage.getClassPackageName()%>;
+<%} else {%>
+package <%=genPackage.getReflectionPackageName()%>;
+<%}%>
+
+<%genModel.markImportLocation(stringBuffer, genPackage);%>
+<%if (isImplementation) {%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Registry");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Descriptor");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.EPackageImpl.EBasicWhiteList");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");%>
+  <%if (genPackage.isLiteralsInterface()) {%>
+<%genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + ".Literals");%>
+  <%}%>
+<%for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + "." + genPackage.getClassifierID(genClassifier));%>
+<%}%>
+<%if (isInterface) {%>
+
+/**
+ * <!-- 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>
+  <%if (genModel.isOperationReflection()) {%>
+ *   <li>each operation of each class,</li>
+  <%}%>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+<%if (genPackage.hasDocumentation()) {%>
+ * <!-- begin-model-doc -->
+ * <%=genPackage.getDocumentation(genModel.getIndentation(stringBuffer))%>
+ * <!-- end-model-doc -->
+<%}%>
+ * @see <%=genPackage.getQualifiedFactoryInterfaceName()%>
+  <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genPackage.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+ * @model <%=modelInfo%>
+  <%} else {%>
+ *        <%=modelInfo%>
+  <%}} if (first) {%>
+ * @model
+  <%}}%>
+ * @generated
+ */
+<%} else {%>
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%}%>
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+  <%if (packageNeedsSuppressDeprecation) {%>
+@SuppressWarnings("deprecation")
+  <%}%>
+public class <%=genPackage.getPackageClassName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageImpl")%><%if (!isInterface){%> implements <%=genPackage.getImportedPackageInterfaceName()%><%}%>
+<%} else {%>
+public interface <%=genPackage.getPackageInterfaceName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isInterface) {%>
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eNAME = "<%=genPackage.getPackageName()%>";<%=genModel.getNonNLS()%>
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eNS_URI = "<%=genPackage.getNSURI()%>";<%=genModel.getNonNLS()%>
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eNS_PREFIX = "<%=genPackage.getNSName()%>";<%=genModel.getNonNLS()%>
+  <%if (genPackage.isContentType()) {%>
+
+	/**
+	 * The package content type ID.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> eCONTENT_TYPE = "<%=genPackage.getContentTypeIdentifier()%>";<%=genModel.getNonNLS()%>
+  <%}%>
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getPackageInterfaceName()%> eINSTANCE = <%=genPackage.getQualifiedPackageClassName()%>.init();
+
+  <%for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) {%>
+	/**
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%if (!genClass.isInterface()) {%>
+	 * The meta object id for the '{@link <%=genClass.getQualifiedClassName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genClass.getQualifiedClassName()%>
+      <%} else {%>
+	 * The meta object id for the '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%>
+      <%}%>
+    <%} else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;%>
+	 * The meta object id for the '{@link <%=genEnum.getQualifiedName()%> <em><%=genEnum.getFormattedName()%></em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see <%=genEnum.getQualifiedName()%>
+    <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+	 * The meta object id for the '<em><%=genDataType.getFormattedName()%></em>' data type.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+      <%if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {%>
+	 * @see <%=genDataType.getRawInstanceClassName()%>
+      <%}%>
+    <%}%>
+	 * @see <%=genPackage.getQualifiedPackageClassName()%>#get<%=genClassifier.getClassifierAccessorName()%>()
+  <%if (genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genPackage.getClassifierID(genClassifier)%> = <%=genPackage.getClassifierValue(genClassifier)%>;
+
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%for (GenFeature genFeature : genClass.getAllGenFeatures()) {%>
+	/**
+	 * The feature id for the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasImplicitAPITags()) {%>
+	 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getFeatureID(genFeature)%> = <%=genClass.getFeatureValue(genFeature)%>;
+
+      <%}%>
+	/**
+	 * The number of structural features of the '<em><%=genClass.getFormattedName()%></em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getFeatureCountID()%> = <%=genClass.getFeatureCountValue()%>;
+
+      <%if (genModel.isOperationReflection()) {%>
+        <%for (GenOperation genOperation : genClass.getAllGenOperations(false)) {%>
+          <%if (genClass.getOverrideGenOperation(genOperation) == null) {%>
+	/**
+	 * The operation id for the '<em><%=genOperation.getFormattedName()%></em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genOperation.hasImplicitAPITags()) {%>
+	 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getOperationID(genOperation, false)%> = <%=genClass.getOperationValue(genOperation)%>;
+
+          <%}%>
+        <%}%>
+	/**
+	 * The number of operations of the '<em><%=genClass.getFormattedName()%></em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 * @ordered
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=publicStaticFinalFlag%>int <%=genClass.getOperationCountID()%> = <%=genClass.getOperationCountValue()%>;
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (isImplementation) {%>
+  <%if (genPackage.isLoadingInitialization()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected String packageFilename = "<%=genPackage.getSerializedPackageFilename()%>";<%=genModel.getNonNLS()%>
+
+  <%}%>
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClassifier.hasAPITags(true)) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer), true)%>
+    <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	private <%=genClassifier.getImportedMetaType()%> <%=genClassifier.getClassifierInstanceName()%> = 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 <%=genPackage.getQualifiedPackageInterfaceName()%>#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private <%=genPackage.getPackageClassName()%>()
+	{
+		super(eNS_URI, <%=genPackage.getQualifiedEFactoryInstanceAccessor()%>);
+	}
+
+	/**
+	 * <!-- 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 <%=genPackage.getImportedPackageInterfaceName()%>#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
+  <%if (!genPackage.isLoadedInitialization()) {%>
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+  <%}%>
+	 * @generated
+	 */
+	public static <%=genPackage.getImportedPackageInterfaceName()%> init()
+	{
+		if (isInited) return (<%=genPackage.getImportedPackageInterfaceName()%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI);
+
+    <%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+		initializeRegistryHelpers();
+
+    <%}%>
+		// Obtain or create and register package
+		Object registered<%=genPackage.getBasicPackageName()%> = <%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.get(eNS_URI);
+		<%=genPackage.getPackageClassName()%> the<%=genPackage.getBasicPackageName()%> = registered<%=genPackage.getBasicPackageName()%> instanceof <%=genPackage.getPackageClassName()%> ? (<%=genPackage.getPackageClassName()%>)registered<%=genPackage.getBasicPackageName()%> : new <%=genPackage.getPackageClassName()%>();
+
+		isInited = true;
+
+    <%if (!genPackage.getPackageSimpleDependencies().isEmpty()) {%>
+		// Initialize simple dependencies
+    <%for (GenPackage dep : genPackage.getPackageSimpleDependencies()) {%>
+		<%=dep.getImportedPackageInterfaceName()%>.eINSTANCE.eClass();
+    <%}%>
+
+  <%}%>
+  <%if (!genPackage.getPackageInterDependencies().isEmpty()) {%>
+		// Obtain or create and register interdependencies
+    <%for (ListIterator<GenPackage> i = genPackage.getPackageInterDependencies().listIterator(); i.hasNext(); ) { GenPackage interdep = i.next(); %>
+		<%if (i.previousIndex() == 0) {%>Object <%}%>registeredPackage = <%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=interdep.getImportedPackageInterfaceName()%>.eNS_URI);
+		<%=interdep.getImportedPackageClassName()%> <%=genPackage.getPackageInstanceVariable(interdep)%> = (<%=interdep.getImportedPackageClassName()%>)(registeredPackage instanceof <%=interdep.getImportedPackageClassName()%> ? registeredPackage : <%=interdep.getImportedPackageInterfaceName()%>.eINSTANCE);
+    <%}%>
+
+  <%}%>
+  <%if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {%>
+		// Load packages
+    <%if (genPackage.isLoadingInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.loadPackage();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {%>
+      <%if (interdep.isLoadingInitialization()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.loadPackage();
+      <%}%>
+    <%}%>
+
+  <%}%>
+  <%if (!genPackage.isLoadedInitialization() || !genPackage.getPackageBuildInterDependencies().isEmpty()) {%>
+		// Create package meta-data objects
+    <%if (!genPackage.isLoadedInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.createPackageContents();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.createPackageContents();
+    <%}%>
+
+		// Initialize created meta-data
+    <%if (!genPackage.isLoadedInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.initializePackageContents();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.initializePackageContents();
+    <%}%>
+
+  <%}%>
+  <%if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {%>
+		// Fix loaded packages
+    <%if (genPackage.isLoadedInitialization()) {%>
+		the<%=genPackage.getBasicPackageName()%>.fixPackageContents();
+    <%}%>
+    <%for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {%>
+		<%=genPackage.getPackageInstanceVariable(interdep)%>.fixPackageContents();
+    <%}%>
+
+  <%}%>
+  <%if (genPackage.hasConstraints()) {%>
+		// Register package validator
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EValidator")%>.Registry.INSTANCE.put
+			(the<%=genPackage.getBasicPackageName()%>,
+			 new <%=genModel.getImportedName("org.eclipse.emf.ecore.EValidator")%>.Descriptor()
+			 {
+ <%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				 @Override
+ <%}%>
+				 public <%=genModel.getImportedName("org.eclipse.emf.ecore.EValidator")%> getEValidator()
+				 {
+					 return <%=genPackage.getImportedValidatorClassName()%>.INSTANCE;
+				 }
+			 });
+
+  <%}%>
+  <%if (!genPackage.isEcorePackage()) {%>
+		// Mark meta-data to indicate it can't be changed
+		the<%=genPackage.getBasicPackageName()%>.freeze();
+
+  <%}%>
+		// Update the registry and return the package
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.put(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI, the<%=genPackage.getBasicPackageName()%>);
+		return the<%=genPackage.getBasicPackageName()%>;
+	}
+  <%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void initializeRegistryHelpers()
+	{
+    <%Set<String> helpers = new HashSet<String>(); for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+      <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+        <%if (!genClass.isDynamic()) { String theClass = genClass.isMapEntry() ? genClass.getImportedClassName() : genClass.getRawImportedInterfaceName(); if (helpers.add(theClass)) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.register
+			(<%=theClass%>.class,
+			 new <%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.Helper()
+			 {
+				 public boolean isInstance(Object instance)
+				 {
+					 return instance instanceof <%=genClass.isMapEntry() ? genClass.getImportedClassName() : genClass.getRawImportedInterfaceName() + genClass.getInterfaceWildTypeArguments()%>;
+				 }
+
+				 public Object newArrayInstance(int size)
+				 {
+					 return new <%=theClass%>[size];
+				 }
+			 });
+        <%}}%>
+      <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+        <%if (!genDataType.isPrimitiveType() && !genDataType.isObjectType()) { String theClass = genDataType.getRawImportedInstanceClassName(); if (helpers.add(theClass)) { %>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.register
+			(<%=theClass%>.class,
+			 new <%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.Helper()
+			 {
+				 public boolean isInstance(Object instance)
+				 {
+					 return instance instanceof <%=theClass%>;
+				 }
+
+				 public Object newArrayInstance(int size)
+				 {
+        <%if (genDataType.isArrayType()) { String componentType = theClass; String indices = ""; while(componentType.endsWith("[]")) { componentType = componentType.substring(0, componentType.length() - 2); indices += "[]";}%>
+					 return new <%=componentType%>[size]<%=indices%>;
+        <%} else {%>
+					 return new <%=theClass%>[size];
+        <%}%>
+				 }
+		});
+        <%}}%>
+      <%}%>
+    <%}%>
+	}
+
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class WhiteList implements <%=genModel.getImportedName("com.google.gwt.user.client.rpc.IsSerializable")%>, EBasicWhiteList
+	{
+    <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+      <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+        <%if (!genClass.isDynamic()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=genClass.isMapEntry() ? genClass.getImportedClassName() : genClass.getImportedWildcardInstanceClassName()%> <%=genClass.getSafeUncapName()%>;
+
+        <%}%>
+      <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+        <%if (!genDataType.isObjectType() && genDataType.isSerializable()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=genDataType.getImportedWildcardInstanceClassName()%> <%=genDataType.getSafeUncapName()%>;
+
+        <%}%>
+      <%}%>
+    <%}%>
+	}
+  <%}%>
+
+<%}%>
+<%if (isInterface) { // TODO REMOVE THIS BOGUS EMPTY LINE%>
+
+<%}%>
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+<%if (isInterface) {%>
+	/**
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+	 * Returns the meta object for class '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em><%=genClass.getFormattedName()%></em>'.
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%>
+      <%if (!genModel.isSuppressEMFModelTags() && (genClass.isExternalInterface() || genClass.isDynamic())) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+        <%} else {%>
+	 *        <%=modelInfo%>
+        <%}} if (first) {%>
+	 * @model
+      <%}}%>
+    <%} else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;%>
+	 * Returns the meta object for enum '{@link <%=genEnum.getQualifiedName()%> <em><%=genEnum.getFormattedName()%></em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em><%=genEnum.getFormattedName()%></em>'.
+	 * @see <%=genEnum.getQualifiedName()%>
+    <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+      <%if (genDataType.isPrimitiveType() || genDataType.isArrayType()) {%>
+	 * Returns the meta object for data type '<em><%=genDataType.getFormattedName()%></em>'.
+      <%} else {%>
+	 * Returns the meta object for data type '{@link <%=genDataType.getRawInstanceClassName()%> <em><%=genDataType.getFormattedName()%></em>}'.
+      <%}%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+      <%if (genDataType.hasDocumentation()) {%>
+     * <!-- begin-model-doc -->
+     * <%=genDataType.getDocumentation(genModel.getIndentation(stringBuffer))%>
+     * <!-- end-model-doc -->
+      <%}%>
+	 * @return the meta object for data type '<em><%=genDataType.getFormattedName()%></em>'.
+      <%if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {%>
+	 * @see <%=genDataType.getRawInstanceClassName()%>
+      <%}%>
+      <%if (!genModel.isSuppressEMFModelTags()) {boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genDataType.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
+	 * @model <%=modelInfo%>
+      <%} else {%>
+	 *        <%=modelInfo%>
+      <%}} if (first) {%>
+	 * @model
+      <%}}%>
+    <%}%>
+  <%if ((genClassifier instanceof GenClass || genClassifier instanceof GenEnum) && genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+<%}%>
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+<%if (isImplementation) {%>
+ <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+ <%}%>
+	public <%=genClassifier.getImportedMetaType()%> get<%=genClassifier.getClassifierAccessorName()%>()
+	{
+    <%if (genPackage.isLoadedInitialization()) {%>
+		if (<%=genClassifier.getClassifierInstanceName()%> == null)
+		{
+			<%=genClassifier.getClassifierInstanceName()%> = (<%=genClassifier.getImportedMetaType()%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI).getEClassifiers().get(<%=genPackage.getLocalClassifierIndex(genClassifier)%>);
+		}
+    <%}%>
+		return <%=genClassifier.getClassifierInstanceName()%>;
+	}
+
+<%} else {%>
+	<%=genClassifier.getImportedMetaType()%> get<%=genClassifier.getClassifierAccessorName()%>();
+
+<%}%>
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+<%if (isInterface) {%>
+	/**
+	 * Returns the meta object for the <%=genFeature.getFeatureKind()%> '{@link <%=genClass.getRawQualifiedInterfaceName()%><%if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {%>#<%=genFeature.getGetAccessor()%><%}%> <em><%=genFeature.getFormattedName()%></em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the <%=genFeature.getFeatureKind()%> '<em><%=genFeature.getFormattedName()%></em>'.
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%><%if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {%>#<%=genFeature.getGetAccessor()%>()<%}%>
+	 * @see #get<%=genClass.getClassifierAccessorName()%>()
+    <%if (genFeature.hasImplicitAPITags()) {%>
+	 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genFeature.hasImplicitAPITags()) {%>
+	 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%}%>
+<%if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+   <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+   <%}%>
+	public <%=genFeature.getImportedMetaType()%> get<%=genFeature.getFeatureAccessorName()%>()
+	{
+        <%if (!genPackage.isLoadedInitialization()) {%>
+		return (<%=genFeature.getImportedMetaType()%>)<%=genClass.getClassifierInstanceName()%>.getEStructuralFeatures().get(<%=genClass.getLocalFeatureIndex(genFeature)%>);
+        <%} else {%>
+        return (<%=genFeature.getImportedMetaType()%>)get<%=genClassifier.getClassifierAccessorName()%>().getEStructuralFeatures().get(<%=genClass.getLocalFeatureIndex(genFeature)%>);
+        <%}%>
+	}
+<%} else {%>
+	<%=genFeature.getImportedMetaType()%> get<%=genFeature.getFeatureAccessorName()%>();
+<%}%>
+
+      <%}%>
+      <%if (genModel.isOperationReflection()) {%>
+        <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+<%if (isInterface) {%>
+	/**
+	 * Returns the meta object for the '{@link <%=genClass.getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em><%=genOperation.getFormattedName()%></em>' operation.
+	 * @see <%=genClass.getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>)
+    <%if (genOperation.hasImplicitAPITags()) {%>
+	 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genOperation.hasImplicitAPITags()) {%>
+	 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%}%>
+<%if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+   <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+   <%}%>
+	public <%=genOperation.getImportedMetaType()%> get<%=genOperation.getOperationAccessorName()%>()
+	{
+        <%if (!genPackage.isLoadedInitialization()) {%>
+		return <%=genClass.getClassifierInstanceName()%>.getEOperations().get(<%=genClass.getLocalOperationIndex(genOperation)%>);
+        <%} else {%>
+        return get<%=genClassifier.getClassifierAccessorName()%>().getEOperations().get(<%=genClass.getLocalOperationIndex(genOperation)%>);
+        <%}%>
+	}
+<%} else {%>
+	<%=genOperation.getImportedMetaType()%> get<%=genOperation.getOperationAccessorName()%>();
+<%}%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+<%if (isInterface) {%>
+	/**
+	 * 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
+	 */
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%}%>
+<%if (isImplementation) {%>
+   <%if (useInterfaceOverrideAnnotation) {%>
+	@Override
+   <%}%>
+	public <%=genPackage.getImportedFactoryInterfaceName()%> get<%=genPackage.getFactoryName()%>()
+	{
+		return (<%=genPackage.getImportedFactoryInterfaceName()%>)getEFactoryInstance();
+	}
+<%} else {%>
+	<%=genPackage.getFactoryInterfaceName()%> get<%=genPackage.getFactoryName()%>();
+<%}%>
+
+<%if (isImplementation) {%>
+  <%if (!genPackage.isLoadedInitialization()) {%>
+	/**
+	 * <!-- 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
+	 */
+    <%{boolean needsSuppressDeprecation = false; if (!packageNeedsSuppressDeprecation && isJDK50 && !genModel.isSuppressEMFMetaData()) { LOOP: for (GenClass genClass : genPackage.getGenClasses()) { for (GenFeature genFeature : genClass.getGenFeatures()) { if (genFeature.hasAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}
+      for (GenOperation genOperation : genClass.getGenOperations()) { if (genOperation.hasAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}} if (needsSuppressDeprecation) {%>
+	@SuppressWarnings("deprecation")
+    <%}}}%>
+	public void createPackageContents()
+	{
+		if (isCreated) return;
+		isCreated = true;
+    <%if (!genPackage.getGenClasses().isEmpty()) {%>
+
+		// Create classes and their features
+      <%for (Iterator<GenClass> c=genPackage.getGenClasses().iterator(); c.hasNext();) { GenClass genClass = c.next();%>
+		<%=genClass.getClassifierInstanceName()%> = create<%=genClass.getMetaType()%>(<%=genClass.getClassifierID()%>);
+        <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+		create<%=genFeature.getMetaType()%>(<%=genClass.getClassifierInstanceName()%>, <%=genClass.getFeatureID(genFeature)%>);
+        <%}%>
+        <%if (genModel.isOperationReflection()) {%>
+          <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+		createEOperation(<%=genClass.getClassifierInstanceName()%>, <%=genClass.getOperationID(genOperation, false)%>);
+          <%}%>
+        <%}%>
+        <%if (c.hasNext()) {%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenEnums().isEmpty()) {%>
+
+		// Create enums
+      <%for (GenEnum genEnum : genPackage.getGenEnums()) {%>
+		<%=genEnum.getClassifierInstanceName()%> = createEEnum(<%=genEnum.getClassifierID()%>);
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenDataTypes().isEmpty()) {%>
+
+		// Create data types
+      <%for (GenDataType genDataType : genPackage.getGenDataTypes()) {%>
+		<%=genDataType.getClassifierInstanceName()%> = createEDataType(<%=genDataType.getClassifierID()%>);
+      <%}%>
+    <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+<%
+///////////////////////
+class Information
+{
+  @SuppressWarnings("unused")
+  EGenericType eGenericType;
+  int depth;
+  String type;
+  String accessor;
+}
+
+class InformationIterator
+{
+  Iterator<Object> iterator;
+  InformationIterator(EGenericType eGenericType)
+  {
+    iterator = EcoreUtil.getAllContents(Collections.singleton(eGenericType));
+  }
+
+  boolean hasNext()
+  {
+    return iterator.hasNext();
+  }
+
+  Information next()
+  {
+    Information information = new Information();
+    EGenericType eGenericType = information.eGenericType = (EGenericType)iterator.next();
+    for (EObject container = eGenericType.eContainer(); container instanceof EGenericType; container = container.eContainer())
+    {
+      ++information.depth;
+    }
+    if (eGenericType.getEClassifier() != null )
+    {
+      GenClassifier genClassifier = genModel.findGenClassifier(eGenericType.getEClassifier());
+      information.type = genPackage.getPackageInstanceVariable(genClassifier.getGenPackage()) + ".get" + genClassifier.getClassifierAccessorName() + "()";
+    }
+    else if (eGenericType.getETypeParameter() != null)
+    {
+      ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
+      if (eTypeParameter.eContainer() instanceof EClass)
+      {
+        information.type = genModel.findGenClassifier((EClass)eTypeParameter.eContainer()).getClassifierInstanceName() + "_" + eGenericType.getETypeParameter().getName();
+      }
+      else
+      {
+        information.type = "t" + (((EOperation)eTypeParameter.eContainer()).getETypeParameters().indexOf(eTypeParameter) + 1);
+      }
+    }
+    else
+    {
+      information.type ="";
+    }
+    if (information.depth > 0)
+    {
+      if (eGenericType.eContainmentFeature().isMany())
+      {
+        information.accessor = "getE" + eGenericType.eContainmentFeature().getName().substring(1) + "().add";
+      }
+      else
+      {
+        information.accessor = "setE" + eGenericType.eContainmentFeature().getName().substring(1);
+      }
+    }
+    return information;
+  }
+}
+///////////////////////
+int maxGenericTypeAssignment = 0;
+%>
+	/**
+	 * 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
+	 */
+    <%{boolean needsSuppressDeprecation = false; if (!packageNeedsSuppressDeprecation && isJDK50) { LOOP: for (GenEnum genEnum : genPackage.getGenEnums()) { for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) { if (genEnumLiteral.hasAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}} if (needsSuppressDeprecation) {%>
+	@SuppressWarnings("deprecation")
+    <%}}}%>
+	public void initializePackageContents()
+	{
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+    <%if (!genPackage.getPackageInitializationDependencies().isEmpty()) {%>
+
+		// Obtain other dependent packages
+      <%for (GenPackage dep : genPackage.getPackageInitializationDependencies()) {%>
+		<%=dep.getImportedPackageInterfaceName()%> <%=genPackage.getPackageInstanceVariable(dep)%> = (<%=dep.getImportedPackageInterfaceName()%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEPackage(<%=dep.getImportedPackageInterfaceName()%>.eNS_URI);
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getSubGenPackages().isEmpty()) {%>
+
+		// Add subpackages
+      <%for (GenPackage sub : genPackage.getSubGenPackages()) {%>
+		getESubpackages().add(<%=genPackage.getPackageInstanceVariable(sub)%>);
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenClasses().isEmpty()) { boolean firstOperationAssignment = true; int maxTypeParameterAssignment = 0;%>
+      <%if (genModel.useGenerics()) {%>
+
+		// Create type parameters
+        <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+          <%for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {%>
+            <%if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty() || genTypeParameter.isUsed()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter")%> <%=genClassifier.getClassifierInstanceName()%>_<%=genTypeParameter.getName()%> = addETypeParameter(<%=genClassifier.getClassifierInstanceName()%>, "<%=genTypeParameter.getName()%>");<%=genModel.getNonNLS()%>
+            <%} else {%>
+		addETypeParameter(<%=genClassifier.getClassifierInstanceName()%>, "<%=genTypeParameter.getName()%>");<%=genModel.getNonNLS()%>
+            <%}%>
+          <%}%>
+        <%}%>
+      <%}%>
+      <%if (genModel.useGenerics()) {%>
+
+		// Set bounds for type parameters
+        <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+          <%for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {%>
+            <%for (EGenericType bound : genTypeParameter.getEcoreTypeParameter().getEBounds()) {%>
+              <%for (InformationIterator i=new InformationIterator(bound); i.hasNext(); ) { Information info = i.next(); String prefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=prefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                <%}%>
+              <%}%>
+		<%=genClassifier.getClassifierInstanceName()%>_<%=genTypeParameter.getName()%>.getEBounds().add(g1);
+            <%}%>
+          <%}%>
+        <%}%>
+      <%}%>
+
+		// Add supertypes to classes
+      <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+        <%if (!genClass.hasGenericSuperTypes()) {%>
+          <%for (GenClass baseGenClass : genClass.getBaseGenClasses()) {%>
+		<%=genClass.getClassifierInstanceName()%>.getESuperTypes().add(<%=genPackage.getPackageInstanceVariable(baseGenClass.getGenPackage())%>.get<%=baseGenClass.getClassifierAccessorName()%>());
+          <%}%>
+        <%} else {%>
+          <%for (EGenericType superType : genClass.getEcoreClass().getEGenericSuperTypes()) {%>
+            <%for (InformationIterator i=new InformationIterator(superType); i.hasNext(); ) { Information info = i.next(); String prefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=prefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+              <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+              <%}%>
+            <%}%>
+		<%=genClass.getClassifierInstanceName()%>.getEGenericSuperTypes().add(g1);
+          <%}%>
+        <%}%>
+      <%}%>
+
+		// Initialize classes<%if (genModel.isOperationReflection()) {%>, features, and operations; add parameters<%} else {%> and features; add operations and parameters<%}%>
+      <%for (Iterator<GenClass> c=genPackage.getGenClasses().iterator(); c.hasNext();) { GenClass genClass = c.next(); boolean hasInstanceTypeName = genModel.useGenerics() && genClass.getEcoreClass().getInstanceTypeName() != null && genClass.getEcoreClass().getInstanceTypeName().contains("<");%>
+		initEClass(<%=genClass.getClassifierInstanceName()%>, <%if (genClass.isDynamic()) {%>null<%} else {%><%=genClass.getRawImportedInterfaceName()%>.class<%}%>, "<%=genClass.getName()%>", <%=genClass.getAbstractFlag()%>, <%=genClass.getInterfaceFlag()%>, <%=genClass.getGeneratedInstanceClassFlag()%><%if (hasInstanceTypeName) {%>, "<%=genClass.getEcoreClass().getInstanceTypeName()%>"<%}%>);<%=genModel.getNonNLS()%><%if (hasInstanceTypeName) {%><%=genModel.getNonNLS(2)%><%}%>
+        <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+          <%if (genFeature.hasGenericType()) {%>
+            <%for (InformationIterator i=new InformationIterator(genFeature.getEcoreFeature().getEGenericType()); i.hasNext(); ) { Information info = i.next(); String prefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=prefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+              <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+              <%}%>
+            <%}%>
+          <%}%>
+          <%if (genFeature.isReferenceType()) { GenFeature reverseGenFeature = genFeature.getReverse();%>
+          <%String reverse = reverseGenFeature == null ? "null" : genPackage.getPackageInstanceVariable(reverseGenFeature.getGenPackage()) + ".get" + reverseGenFeature.getFeatureAccessorName() + "()";%>
+		initEReference(get<%=genFeature.getFeatureAccessorName()%>(), <%if (genFeature.hasGenericType()) {%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage())%>.get<%=genFeature.getTypeClassifierAccessorName()%>()<%}%>, <%=reverse%>, "<%=genFeature.getName()%>", <%=genFeature.getDefaultValue()%>, <%=genFeature.getLowerBound()%>, <%=genFeature.getUpperBound()%>, <%=genFeature.getContainerClass()%>, <%=genFeature.getTransientFlag()%>, <%=genFeature.getVolatileFlag()%>, <%=genFeature.getChangeableFlag()%>, <%=genFeature.getContainmentFlag()%>, <%=genFeature.getResolveProxiesFlag()%>, <%=genFeature.getUnsettableFlag()%>, <%=genFeature.getUniqueFlag()%>, <%=genFeature.getDerivedFlag()%>, <%=genFeature.getOrderedFlag()%>);<%=genModel.getNonNLS()%><%=genModel.getNonNLS(genFeature.getDefaultValue(), 2)%>
+            <%for (GenFeature keyFeature : genFeature.getKeys()) {%>
+		get<%=genFeature.getFeatureAccessorName()%>().getEKeys().add(<%=genPackage.getPackageInstanceVariable(keyFeature.getGenPackage())%>.get<%=keyFeature.getFeatureAccessorName()%>());
+            <%}%>
+          <%} else {%>
+		initEAttribute(get<%=genFeature.getFeatureAccessorName()%>(), <%if (genFeature.hasGenericType()) {%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage())%>.get<%=genFeature.getTypeClassifierAccessorName()%>()<%}%>, "<%=genFeature.getName()%>", <%=genFeature.getDefaultValue()%>, <%=genFeature.getLowerBound()%>, <%=genFeature.getUpperBound()%>, <%=genFeature.getContainerClass()%>, <%=genFeature.getTransientFlag()%>, <%=genFeature.getVolatileFlag()%>, <%=genFeature.getChangeableFlag()%>, <%=genFeature.getUnsettableFlag()%>, <%=genFeature.getIDFlag()%>, <%=genFeature.getUniqueFlag()%>, <%=genFeature.getDerivedFlag()%>, <%=genFeature.getOrderedFlag()%>);<%=genModel.getNonNLS()%><%=genModel.getNonNLS(genFeature.getDefaultValue(), 2)%>
+          <%}%>
+        <%}%>
+        <%for (GenOperation genOperation : genClass.getGenOperations()) {String prefix = ""; if (genOperation.hasGenericType() || !genOperation.getGenParameters().isEmpty() || !genOperation.getGenExceptions().isEmpty() || !genOperation.getGenTypeParameters().isEmpty()) { if (firstOperationAssignment) { firstOperationAssignment = false; prefix = genModel.getImportedName("org.eclipse.emf.ecore.EOperation") + " op = "; } else { prefix = "op = "; }} %>
+
+          <%if (genModel.useGenerics()) {%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, <%if (genOperation.isVoid() || genOperation.hasGenericType()) {%>null<%} else {%><%=genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage())%>.get<%=genOperation.getTypeClassifierAccessorName()%>()<%}%>, "<%=genOperation.getName()%>", <%=genOperation.getLowerBound()%>, <%=genOperation.getUpperBound()%>, <%=genOperation.getUniqueFlag()%>, <%=genOperation.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+          <%} else if (!genOperation.isVoid()) {%>
+            <%if (!genOperation.getEcoreOperation().isOrdered() || !genOperation.getEcoreOperation().isUnique()) { needsAddEOperation = true;%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, <%=genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage())%>.get<%=genOperation.getTypeClassifierAccessorName()%>(), "<%=genOperation.getName()%>", <%=genOperation.getLowerBound()%>, <%=genOperation.getUpperBound()%>, <%=genOperation.getUniqueFlag()%>, <%=genOperation.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+            <%} else {%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, <%=genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage())%>.get<%=genOperation.getTypeClassifierAccessorName()%>(), "<%=genOperation.getName()%>", <%=genOperation.getLowerBound()%>, <%=genOperation.getUpperBound()%>);<%=genModel.getNonNLS()%>
+            <%}%>
+          <%} else {%>
+		<%=prefix%><%if (genModel.isOperationReflection()) {%>initEOperation(get<%=genOperation.getOperationAccessorName()%>()<%} else {%>addEOperation(<%=genClass.getClassifierInstanceName()%><%}%>, null, "<%=genOperation.getName()%>");<%=genModel.getNonNLS()%>
+          <%}%>
+          <%if (genModel.useGenerics()) {%>
+            <%for (ListIterator<GenTypeParameter> t=genOperation.getGenTypeParameters().listIterator(); t.hasNext(); ) { GenTypeParameter genTypeParameter = t.next(); String typeParameterVariable = ""; if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty() || genTypeParameter.isUsed()) { if (maxTypeParameterAssignment <= t.previousIndex()) { ++maxTypeParameterAssignment; typeParameterVariable = genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter") + " t" + t.nextIndex() + " = "; } else { typeParameterVariable = "t" + t.nextIndex() + " = "; }} %>
+		<%=typeParameterVariable%>addETypeParameter(op, "<%=genTypeParameter.getName()%>");<%=genModel.getNonNLS()%>
+              <%for (EGenericType typeParameter : genTypeParameter.getEcoreTypeParameter().getEBounds()) {%>
+                <%for (InformationIterator i=new InformationIterator(typeParameter); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                  <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                  <%}%>
+                <%}%>
+		t<%=t.nextIndex()%>.getEBounds().add(g1);
+              <%}%>
+            <%}%>
+          <%}%>
+          <%for (GenParameter genParameter : genOperation.getGenParameters()) {%>
+            <%if (genParameter.hasGenericType()) {%>
+              <%for (InformationIterator i=new InformationIterator(genParameter.getEcoreParameter().getEGenericType()); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                <%}%>
+              <%}%>
+            <%}%>
+            <%if (genModel.useGenerics()) {%>
+		addEParameter(op, <%if (genParameter.hasGenericType()){%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genParameter.getTypeGenPackage())%>.get<%=genParameter.getTypeClassifierAccessorName()%>()<%}%>, "<%=genParameter.getName()%>", <%=genParameter.getLowerBound()%>, <%=genParameter.getUpperBound()%>, <%=genParameter.getUniqueFlag()%>, <%=genParameter.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+            <%} else if (!genParameter.getEcoreParameter().isOrdered() || !genParameter.getEcoreParameter().isUnique()) { needsAddEParameter = true;%>
+		addEParameter(op, <%if (genParameter.hasGenericType()){%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genParameter.getTypeGenPackage())%>.get<%=genParameter.getTypeClassifierAccessorName()%>()<%}%>, "<%=genParameter.getName()%>", <%=genParameter.getLowerBound()%>, <%=genParameter.getUpperBound()%>, <%=genParameter.getUniqueFlag()%>, <%=genParameter.getOrderedFlag()%>);<%=genModel.getNonNLS()%>
+            <%} else {%>
+		addEParameter(op, <%if (genParameter.hasGenericType()){%>g1<%} else {%><%=genPackage.getPackageInstanceVariable(genParameter.getTypeGenPackage())%>.get<%=genParameter.getTypeClassifierAccessorName()%>()<%}%>, "<%=genParameter.getName()%>", <%=genParameter.getLowerBound()%>, <%=genParameter.getUpperBound()%>);<%=genModel.getNonNLS()%>
+            <%}%>
+          <%}%>
+          <%if (genOperation.hasGenericExceptions()) {%>
+              <%for (EGenericType genericExceptions : genOperation.getEcoreOperation().getEGenericExceptions()) {%>
+                <%for (InformationIterator i=new InformationIterator(genericExceptions); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+                  <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+                  <%}%>
+		addEException(op, g<%=info.depth + 1%>);
+                <%}%>
+              <%}%>
+          <%} else {%>
+            <%for (GenClassifier genException : genOperation.getGenExceptions()) {%>
+		addEException(op, <%=genPackage.getPackageInstanceVariable(genException.getGenPackage())%>.get<%=genException.getClassifierAccessorName()%>());
+            <%}%>
+          <%}%>
+          <%if (!genOperation.isVoid() && genOperation.hasGenericType()) {%>
+            <%for (InformationIterator i=new InformationIterator(genOperation.getEcoreOperation().getEGenericType()); i.hasNext(); ) { Information info = i.next(); String typePrefix = ""; if (maxGenericTypeAssignment <= info.depth) { ++maxGenericTypeAssignment; typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; }%>
+		<%=typePrefix%>g<%=info.depth + 1%> = createEGenericType(<%=info.type%>);
+              <%if (info.depth > 0) {%>
+		g<%=info.depth%>.<%=info.accessor%>(g<%=info.depth + 1%>);
+              <%}%>
+            <%}%>
+		initEOperation(op, g1);
+          <%}%>
+        <%}%>
+        <%if (c.hasNext()) {%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenEnums().isEmpty()) {%>
+
+		// Initialize enums and add enum literals
+      <%for (Iterator<GenEnum> e=genPackage.getGenEnums().iterator(); e.hasNext();) { GenEnum genEnum = e.next();%>
+		initEEnum(<%=genEnum.getClassifierInstanceName()%>, <%=genEnum.getImportedName()%>.class, "<%=genEnum.getName()%>");<%=genModel.getNonNLS()%>
+        <%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+		addEEnumLiteral(<%=genEnum.getClassifierInstanceName()%>, <%=genEnum.getImportedName().equals(genEnum.getClassifierID()) ? genEnum.getQualifiedName() : genEnum.getImportedName()%>.<%=genEnumLiteral.getEnumLiteralInstanceConstantName()%>);
+        <%}%>
+        <%if (e.hasNext()) {%>
+
+        <%}%>
+      <%}%>
+    <%}%>
+    <%if (!genPackage.getGenDataTypes().isEmpty()) {%>
+
+		// Initialize data types
+      <%for (GenDataType genDataType : genPackage.getGenDataTypes()) {boolean hasInstanceTypeName = genModel.useGenerics() && genDataType.getEcoreDataType().getInstanceTypeName() != null && genDataType.getEcoreDataType().getInstanceTypeName().contains("<");%>
+		initEDataType(<%=genDataType.getClassifierInstanceName()%>, <%=genDataType.getRawImportedInstanceClassName()%>.class, "<%=genDataType.getName()%>", <%=genDataType.getSerializableFlag()%>, <%=genDataType.getGeneratedInstanceClassFlag()%><%if (hasInstanceTypeName) {%>, "<%=genDataType.getEcoreDataType().getInstanceTypeName()%>"<%}%>);<%=genModel.getNonNLS()%><%if (hasInstanceTypeName) {%><%=genModel.getNonNLS(2)%><%}%>
+      <%}%>
+    <%}%>
+    <%if (genPackage.getSuperGenPackage() == null) {%>
+
+		// Create resource
+		createResource(<%=genPackage.getSchemaLocation()%>);
+    <%}%>
+    <%if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {%>
+
+		// Create annotations
+      <%for (String annotationSource : genPackage.getAnnotationSources()) {%>
+		// <%=annotationSource%>
+		create<%=genPackage.getAnnotationSourceIdentifier(annotationSource)%>Annotations();
+      <%}%>
+    <%}%>
+	}
+
+    <%for (String annotationSource : genPackage.getAnnotationSources()) {%>
+	/**
+	 * Initializes the annotations for <b><%=annotationSource%></b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void create<%=genPackage.getAnnotationSourceIdentifier(annotationSource)%>Annotations()
+	{
+		String source = <%if (annotationSource == null) {%>null;<%} else {%>"<%=annotationSource%>";<%=genModel.getNonNLS()%><%}%>
+      <%for (EAnnotation eAnnotation : genPackage.getAllAnnotations()) { List<GenPackage.AnnotationReferenceData> annotationReferenceDataList = genPackage.getReferenceData(eAnnotation);%>
+        <%if (annotationSource == null ? eAnnotation.getSource() == null : annotationSource.equals(eAnnotation.getSource())) {%>
+		addAnnotation
+		  (<%=genPackage.getAnnotatedModelElementAccessor(eAnnotation)%>,
+		   source,
+		   new String[]
+		   {
+          <%for (Iterator<Map.Entry<String, String>> k = eAnnotation.getDetails().iterator(); k.hasNext();) { Map.Entry<String, String> detail = k.next(); String key = Literals.toStringLiteral(detail.getKey(), genModel); String value = Literals.toStringLiteral(detail.getValue(), genModel);%>
+			   <%=key%>, <%=value%><%=k.hasNext() ? "," : ""%><%=genModel.getNonNLS(key + value)%>
+          <%}%>
+		   }<%if (annotationReferenceDataList.isEmpty()) {%>);<%} else {%>,<%}%>
+          <%if (!annotationReferenceDataList.isEmpty()) {%>
+		   new <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>[]
+		   {
+            <%for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList.iterator(); k.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = k.next();%>
+			 <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(<%if (annotationReferenceData.containingGenPackage != genPackage) {%><%=annotationReferenceData.containingGenPackage.getImportedPackageInterfaceName()%>.<%}%>eNS_URI).appendFragment("<%=annotationReferenceData.uriFragment%>")<%if (k.hasNext()) {%>,<%}%><%=genModel.getNonNLS()%>
+            <%}%>
+		   });
+          <%}%>
+          <%for (EAnnotation nestedEAnnotation : genPackage.getAllNestedAnnotations(eAnnotation)) {String nestedAnnotationSource = nestedEAnnotation.getSource();  int depth = 0; boolean nonContentAnnotation = false; StringBuilder path = new StringBuilder();  for (EObject eContainer = nestedEAnnotation.eContainer(), child = nestedEAnnotation; child != eAnnotation; child = eContainer, eContainer = eContainer.eContainer())  {  boolean nonContentChild = child.eContainmentFeature() != EcorePackage.Literals.EANNOTATION__CONTENTS; if (path.length() != 0) { path.insert(0, ", ");  } path.insert(0, nonContentChild); if (nonContentChild) { nonContentAnnotation = true; } ++depth;  } List<GenPackage.AnnotationReferenceData> nestedAnnotationReferenceDataList = genPackage.getReferenceData(nestedEAnnotation);%>
+		addAnnotation
+		  (<%=genPackage.getAnnotatedModelElementAccessor(eAnnotation)%>,
+		   <%if (nonContentAnnotation && genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {%>new boolean[] { <%=path.toString()%> }<%} else {%><%=depth%><%}%>,
+		   <%if (nestedAnnotationSource == null) {%>null,<%} else {%>"<%=nestedAnnotationSource%>",<%=genModel.getNonNLS()%><%}%>
+		   new String[]
+		   {
+            <%for (Iterator<Map.Entry<String, String>> l = nestedEAnnotation.getDetails().iterator(); l.hasNext();) { Map.Entry<String, String> detail = l.next(); String key = Literals.toStringLiteral(detail.getKey(), genModel); String value = Literals.toStringLiteral(detail.getValue(), genModel);%>
+			   <%=key%>, <%=value%><%=l.hasNext() ? "," : ""%><%=genModel.getNonNLS(key + value)%>
+            <%}%>
+		   }<%if (nestedAnnotationReferenceDataList.isEmpty()) {%>);<%} else {%>,<%}%>
+            <%if (!nestedAnnotationReferenceDataList.isEmpty()) {%>
+		   new <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>[]
+		   {
+            <%for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList.iterator(); l.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = l.next();%>
+			 <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(<%if (annotationReferenceData.containingGenPackage != genPackage) {%><%=annotationReferenceData.containingGenPackage.getImportedPackageInterfaceName()%>.<%}%>eNS_URI).appendFragment("<%=annotationReferenceData.uriFragment%>")<%if (l.hasNext()) {%>,<%}%><%=genModel.getNonNLS()%>
+            <%}%>
+		   });
+            <%}%>
+          <%}%>
+        <%}%>
+      <%}%>
+	}
+
+    <%}%>
+  <%} else {%>
+    <%if (genPackage.isLoadingInitialization()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isLoaded = false;
+
+	/**
+	 * Laods the package and any sub-packages from their serialized form.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void loadPackage()
+	{
+		if (isLoaded) return;
+		isLoaded = true;
+
+		<%=genModel.getImportedName("java.net.URL")%> url = getClass().getResource(packageFilename);
+		if (url == null)
+		{
+			throw new RuntimeException("Missing serialized package: " + packageFilename);<%=genModel.getNonNLS()%>
+		}
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%> uri = <%=genModel.getImportedName("org.eclipse.emf.common.util.URI")%>.createURI(url.toString());
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource")%> resource = new <%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl")%>().createResource(uri);
+		try
+		{
+			resource.load(null);
+		}
+		catch (<%=genModel.getImportedName("java.io.IOException")%> exception)
+		{
+			throw new <%=genModel.getImportedName("org.eclipse.emf.common.util.WrappedException")%>(exception);
+		}
+		initializeFromLoadedEPackage(this, (<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>)resource.getContents().get(0));
+		createResource(eNS_URI);
+	}
+
+    <%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isFixed = false;
+
+	/**
+	 * Fixes up the loaded package, to make it appear as if it had been programmatically built.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void fixPackageContents()
+	{
+		if (isFixed) return;
+		isFixed = true;
+		fixEClassifiers();
+	}
+
+	/**
+	 * Sets the instance class on the given classifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+    <%}%>
+	protected void fixInstanceClass(<%=genModel.getImportedName("org.eclipse.emf.ecore.EClassifier")%> eClassifier)
+	{
+		if (eClassifier.getInstanceClassName() == null)
+		{
+    <%ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>(); for (GenClass genClass : genPackage.getGenClasses()) { if (genClass.isDynamic()) { dynamicGenClasses.add(genClass); } }%>
+    <%if (dynamicGenClasses.isEmpty()) {%>
+			eClassifier.setInstanceClassName("<%=genPackage.getInterfacePackageName()%>." + eClassifier.getName());<%=genModel.getNonNLS()%>
+			setGeneratedClassName(eClassifier);
+    <%} else {%>
+			switch (eClassifier.getClassifierID())
+			{
+      <%for (GenClass genClass : dynamicGenClasses) {%>
+        <%if (genClass.isDynamic()) {%>
+				case <%=genPackage.getClassifierID(genClass)%>:
+        <%}%>
+      <%}%>
+				{
+					break;
+				}
+				default:
+				{
+					eClassifier.setInstanceClassName("<%=genPackage.getInterfacePackageName()%>." + eClassifier.getName());<%=genModel.getNonNLS()%>
+					setGeneratedClassName(eClassifier);
+					break;
+				}
+			}
+    <%}%>
+		}
+	}
+
+  <%}%>
+  <%if (needsAddEOperation) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> addEOperation(<%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> owner, <%=genModel.getImportedName("org.eclipse.emf.ecore.EClassifier")%> type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)
+	{
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> o = addEOperation(owner, type, name, lowerBound, upperBound);
+		o.setUnique(isUnique);
+		o.setOrdered(isOrdered);
+		return o;
+	}
+
+  <%}%>
+  <%if (needsAddEParameter) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EParameter")%> addEParameter(<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> owner, <%=genModel.getImportedName("org.eclipse.emf.ecore.EClassifier")%> type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)
+	{
+		<%=genModel.getImportedName("org.eclipse.emf.ecore.EParameter")%> p = ecoreFactory.createEParameter();
+		p.setEType(type);
+		p.setName(name);
+		p.setLowerBound(lowerBound);
+		p.setUpperBound(upperBound);
+		p.setUnique(isUnique);
+		p.setOrdered(isOrdered);
+		owner.getEParameters().add(p);
+		return p;
+	}
+
+  <%}%>
+<%}%>
+<%if (isInterface && genPackage.isLiteralsInterface()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+  <%if (genModel.isOperationReflection()) {%>
+	 *   <li>each operation of each class,</li>
+  <%}%>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%if (isImplementation) {%>public <%}%>interface Literals
+	{
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+		/**
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%if (!genClass.isInterface()) {%>
+		 * The meta object literal for the '{@link <%=genClass.getQualifiedClassName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see <%=genClass.getQualifiedClassName()%>
+      <%} else {%>
+		 * The meta object literal for the '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see <%=genClass.getRawQualifiedInterfaceName()%>
+      <%}%>
+    <%} else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;%>
+		 * The meta object literal for the '{@link <%=genEnum.getQualifiedName()%> <em><%=genEnum.getFormattedName()%></em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see <%=genEnum.getQualifiedName()%>
+    <%} else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+		 * The meta object literal for the '<em><%=genDataType.getFormattedName()%></em>' data type.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+      <%if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {%>
+		 * @see <%=genDataType.getRawInstanceClassName()%>
+      <%}%>
+    <%}%>
+		 * @see <%=genPackage.getQualifiedPackageClassName()%>#get<%=genClassifier.getClassifierAccessorName()%>()
+    <%if (genClassifier.hasAPITags()) {%>
+		 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+		 * @generated
+		 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+		@Deprecated
+  <%}%>
+		<%=publicStaticFinalFlag%><%=genClassifier.getImportedMetaType()%> <%=genPackage.getClassifierID(genClassifier)%> = eINSTANCE.get<%=genClassifier.getClassifierAccessorName()%>();
+
+    <%if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;%>
+      <%for (GenFeature genFeature : genClass.getGenFeatures()) {%>
+		/**
+		 * The meta object literal for the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%> feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+        <%if (genFeature.hasImplicitAPITags()) {%>
+		 * <%=genFeature.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+        <%}%>
+		 * @generated
+		 */
+        <%if (isJDK50 && genFeature.hasImplicitAPIDeprecatedTag()) {%>
+		@Deprecated
+        <%}%>
+		<%=publicStaticFinalFlag%><%=genFeature.getImportedMetaType()%> <%=genClass.getFeatureID(genFeature)%> = eINSTANCE.get<%=genFeature.getFeatureAccessorName()%>();
+
+      <%}%>
+      <%if (genModel.isOperationReflection()) {%>
+        <%for (GenOperation genOperation : genClass.getGenOperations()) {%>
+		/**
+		 * The meta object literal for the '<em><b><%=genOperation.getFormattedName()%></b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+          <%if (genOperation.hasImplicitAPITags()) {%>
+		 * <%=genOperation.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+          <%}%>
+		 * @generated
+		 */
+        <%if (isJDK50 && genOperation.hasImplicitAPIDeprecatedTag()) {%>
+		@Deprecated
+        <%}%>
+		<%=publicStaticFinalFlag%><%=genOperation.getImportedMetaType()%> <%=genClass.getOperationID(genOperation, false)%> = eINSTANCE.get<%=genOperation.getOperationAccessorName()%>();
+
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+	}
+
+<%}%>
+} //<%=isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._Ssf88WKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._Ssf88WKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..e7f37b3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgCsMDG0Ed-kc8dEZsdm2w/method._Ssf88WKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = ((Object[]) new Object[]{new Object[]{genPackage,Boolean.TRUE,Boolean.FALSE}})[0];
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._08N1-WKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._08N1-WKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._08N1-WKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._9HAxZHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._9HAxZHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..c61438f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._9HAxZHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && !genModel.isSuppressInterfaces());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnIzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ac93343
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnJzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getReflectionPackageName();
+className = genPackage.getFactoryInterfaceName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnKTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnKTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..0848dae
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._PgVnKTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,792 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)((Object[])argument)[0]; GenModel genModel=genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]); boolean useInterfaceOverrideAnnotation = genModel.useInterfaceOverrideAnnotation() && !(isInterface && isImplementation);%>
+<%String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%if (isInterface || genModel.isSuppressInterfaces()) {%>
+package <%=genPackage.getReflectionPackageName()%>;
+<%} else {%>
+package <%=genPackage.getClassPackageName()%>;
+<%}%>
+
+<%if (isImplementation) {%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EClass");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EObject");%>
+<%if (!genPackage.hasJavaLangConflict() && !genPackage.hasInterfaceImplConflict() && !genPackage.getClassPackageName().equals(genPackage.getInterfacePackageName())) genModel.addImport(genPackage.getInterfacePackageName() + ".*");%>
+<%}%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+<%if (isInterface) {%>
+/**
+ * <!-- 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 -->
+<%if (!genModel.isSuppressEMFMetaData()) {%>
+ * @see <%=genPackage.getQualifiedPackageInterfaceName()%>
+<%}%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%} else {%>
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%}%>
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+<%if (isImplementation) {%>
+  <%if (isJDK50 && !genPackage.hasAPIDeprecatedTag()) { List<GenClassifier> genClassifiers = new ArrayList<GenClassifier>(genPackage.getGenClassifiers()); for (Iterator<GenClassifier> i = genClassifiers.iterator(); i.hasNext(); ) { GenClassifier genClassifier = i.next(); if (genClassifier instanceof GenClass && ((GenClass)genClassifier).isAbstract()) i.remove(); } if (GenModelUtil.hasAPIDeprecatedTag(genClassifiers)) {%>
+@SuppressWarnings("deprecation")
+  <%}}%>
+public class <%=genPackage.getFactoryClassName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.EFactoryImpl")%><%if (!genModel.isSuppressInterfaces()) {%> implements <%=genPackage.getImportedFactoryInterfaceName()%><%}%>
+<%} else {%>
+public interface <%=genPackage.getFactoryInterfaceName()%><%if (!genModel.isSuppressEMFMetaData()) {%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.EFactory")%><%}%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (isImplementation && (genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces())) {%>
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getFactoryClassName()%> eINSTANCE = init();
+
+<%}%>
+<%if (isInterface && genModel.isSuppressEMFMetaData()) {%>
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getFactoryInterfaceName()%> INSTANCE = <%=genPackage.getQualifiedFactoryClassName()%>.eINSTANCE;
+
+<%} else if (isInterface && !genModel.isSuppressInterfaces()) {%>
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	<%=publicStaticFinalFlag%><%=genPackage.getFactoryInterfaceName()%> eINSTANCE = <%=genPackage.getQualifiedFactoryClassName()%>.init();
+
+<%}%>
+<%if (isImplementation) {%>
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%String factoryType = genModel.isSuppressEMFMetaData() ? genPackage.getFactoryClassName() : genPackage.getImportedFactoryInterfaceName();%>
+	public static <%=factoryType%> init()
+	{
+		try
+		{
+			<%=factoryType%> the<%=genPackage.getFactoryName()%> = (<%=factoryType%>)<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry.INSTANCE.getEFactory(<%=genPackage.getPackageInterfaceName()%>.eNS_URI);
+			if (the<%=genPackage.getFactoryName()%> != null)
+			{
+				return the<%=genPackage.getFactoryName()%>;
+			}
+		}
+		catch (Exception exception)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.log(exception);
+		}
+		return new <%=genPackage.getImportedFactoryClassName()%>();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getFactoryClassName()%>()
+	{
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public EObject create(EClass eClass)
+	{
+		switch (eClass.getClassifierID())
+		{
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%if (!genClass.isAbstract()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genClass.getClassifierID()%>: return <%=!genClass.isEObjectExtension() ? "(EObject)" : "" %>create<%=genClass.getName()%>();
+<%}%>
+<%}%>
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+	}
+
+<%if (!genPackage.getAllGenDataTypes().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Object createFromString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, String initialValue)
+	{
+		switch (eDataType.getClassifierID())
+		{
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+  <%if (genDataType.isSerializable()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genDataType.getClassifierID()%>:
+				return create<%=genDataType.getName()%>FromString(eDataType, initialValue);
+  <%}%>
+<%}%>
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public String convertToString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, Object instanceValue)
+	{
+		switch (eDataType.getClassifierID())
+		{
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+  <%if (genDataType.isSerializable()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genDataType.getClassifierID()%>:
+				return convert<%=genDataType.getName()%>ToString(eDataType, instanceValue);
+  <%}%>
+<%}%>
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+	}
+
+<%}%>
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+  <%if (!genClass.isAbstract()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+<%if (useInterfaceOverrideAnnotation && !genClass.isMapEntry()) {%>
+	@Override
+<%}%>
+	public <%=genClass.getTypeParameters()%><%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> create<%=genClass.getName()%>()
+	{
+    <%if (genClass.isDynamic()) {%>
+		<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> <%=genClass.getSafeUncapName()%> = <%=genClass.getCastFromEObject()%>super.create(<%=genClass.getQualifiedClassifierAccessor()%>);
+    <%} else {%>
+		<%=genClass.getImportedClassName()%><%=genClass.getClassTypeArguments()%> <%=genClass.getSafeUncapName()%> = new <%=genClass.getImportedClassName()%><%=genClass.getClassTypeArguments()%>()<%if (genModel.isSuppressInterfaces() && !genPackage.getReflectionPackageName().equals(genPackage.getInterfacePackageName())) {%>{}<%}%>;
+    <%}%>
+		return <%=genClass.getSafeUncapName()%>;
+	}
+
+  <%}%>
+<%}%>
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+  <%if (genDataType.isSerializable()) {%>
+<%if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) { String eDataType = genDataType.getQualifiedClassifierAccessor();%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+    <%if (genModel.useGenerics() && genDataType.isUncheckedCast() && !genDataType.hasCreatorBody()) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+  <%if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public <%=genDataType.getImportedParameterizedInstanceClassName()%> create<%=genDataType.getName()%>(<%if (genDataType.hasCreatorBody()) {%>final <%}%>String <%if (genDataType.hasCreatorBody()) {%>it<%} else {%>literal<%}%>)
+	{
+    <%if (genDataType.hasCreatorBody()) {%>
+		<%=genDataType.getCreatorBody(genModel.getIndentation(stringBuffer))%>
+    <%} else if (genDataType instanceof GenEnum) {%>
+		<%=genDataType.getImportedInstanceClassName()%> result = <%=genDataType.getImportedInstanceClassName()%>.get(literal);
+		if (result == null) throw new IllegalArgumentException("The value '" + literal + "' is not a valid enumerator of '" + <%=eDataType%>.getName() + "'");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+		return result;
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); boolean isPrimitiveConversion = !genDataType.isPrimitiveType() && genBaseType.isPrimitiveType();%>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+        <%if (isPrimitiveConversion && !isJDK50) {%>
+		return new <%=genDataType.getObjectInstanceClassName()%>(create<%=genBaseType.getName()%>(literal));
+        <%} else {%>
+		return create<%=genBaseType.getName()%>(literal);
+        <%}%>
+      <%} else if (genBaseType.getGenPackage().isDataTypeConverters()) {%>
+        <%if (isPrimitiveConversion && !isJDK50) {%>
+		return new <%=genDataType.getObjectInstanceClassName()%>(<%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genBaseType.getName()%>(literal));
+        <%} else {%>
+		return <%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genBaseType.getName()%>(literal);
+        <%}%>
+      <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%><%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genBaseType.getQualifiedClassifierAccessor()%>, literal);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+		if (literal == null) return null;
+		<%=genDataType.getImportedParameterizedInstanceClassName()%> result = new <%=genModel.getImportedName("java.util.ArrayList")%><%if (genModel.useGenerics()) {%><<%=genItemType.getObjectType().getImportedParameterizedInstanceClassName()%>><%}%>();
+      <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+		for (<%=genModel.getImportedName("java.util.StringTokenizer")%> stringTokenizer = new <%=genModel.getImportedName("java.util.StringTokenizer")%>(literal); stringTokenizer.hasMoreTokens(); )
+      <%} else {%>
+		for (String item : split(literal))
+      <%}%>
+		{
+      <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+			String item = stringTokenizer.nextToken();
+      <%}%>
+      <%if (genItemType.getGenPackage() == genPackage) {%>
+        <%if (genPackage.isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.add(create<%=genItemType.getName()%>(item));
+        <%} else {%>
+			result.add(create<%=genItemType.getName()%>FromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+        <%}%>
+      <%} else {%>
+        <%if (genItemType.getGenPackage().isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.add(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genItemType.getName()%>(item));
+        <%} else {%>
+			result.add(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+        <%}%>
+      <%}%>
+		}
+		return result;
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+		if (literal == null) return <%=genDataType.getStaticValue(null)%>;
+		<%=genDataType.getImportedInstanceClassName()%> result = <%=genDataType.getStaticValue(null)%>;
+		RuntimeException exception = null;
+      <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		try
+		{
+      <%if (genMemberType.getGenPackage() == genPackage) {%>
+        <%if (genPackage.isDataTypeConverters()) { if (!genDataType.isPrimitiveType()) genMemberType = genMemberType.getObjectType();%>
+			result = create<%=genMemberType.getName()%>(literal);
+        <%} else {%>
+			result = (<%=genDataType.getObjectInstanceClassName()%>)create<%=genMemberType.getName()%>FromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, literal);
+        <%}%>
+      <%} else {%>
+        <%if (genPackage.isDataTypeConverters()) { if (!genDataType.isPrimitiveType()) genMemberType = genMemberType.getObjectType();%>
+			result = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genMemberType.getName()%>(literal);
+        <%} else {%>
+			result = (<%=genDataType.getObjectInstanceClassName()%>)<%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, literal);
+        <%}%>
+      <%}%>
+			if (<%if (!genDataType.isPrimitiveType()) {%>result != null && <%}%><%=genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician")%>.INSTANCE.validate(<%=eDataType%>, <%if (genDataType.isPrimitiveType() && !isJDK50) {%>new <%=genDataType.getObjectInstanceClassName()%>(result)<%} else {%>result<%}%>, null, null))
+			{
+				return result;
+			}
+		}
+		catch (RuntimeException e)
+		{
+			exception = e;
+		}
+      <%}%>
+		if (<%if (!genDataType.isPrimitiveType()) {%>result != null || <%}%>exception == null) return result;
+    
+		throw exception;
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return (<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)super.createFromString(literal);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else if (genDataType.isPrimitiveType() && !isJDK50) {%>
+		return ((<%=genDataType.getObjectInstanceClassName()%>)super.createFromString(<%=eDataType%>, literal)).<%=genDataType.getPrimitiveValueFunction()%>();
+    <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)<%}%>super.createFromString(<%=eDataType%>, literal);
+    <%}%>
+	}
+
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+    <%if (!genPackage.isDataTypeConverters() && genModel.useGenerics() && genDataType.isUncheckedCast() && !genDataType.hasCreatorBody()) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+	public <%=genDataType.getImportedParameterizedObjectInstanceClassName()%> create<%=genDataType.getName()%>FromString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, String initialValue)
+	{
+    <%if (genDataType instanceof GenEnum) {%>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {%>
+		return create<%=genDataType.getName()%>(initialValue);
+      <%} else {%>
+		<%=((GenEnum)genDataType).getImportedInstanceClassName()%> result = <%=((GenEnum)genDataType).getImportedInstanceClassName()%>.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+		return result;
+      <%}%>
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); %>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+		return <%if (!genDataType.getObjectInstanceClassName().equals(genBaseType.getObjectInstanceClassName())) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%>create<%=genBaseType.getName()%>FromString(<%=genBaseType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%><%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genBaseType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+      <%if (genPackage.isDataTypeConverters()) {%>
+		return create<%=genDataType.getName()%>(initialValue);
+      <%} else {%>
+		if (initialValue == null) return null;
+		<%=genDataType.getImportedParameterizedObjectInstanceClassName()%> result = new <%=genModel.getImportedName("java.util.ArrayList")%><%if (genModel.useGenerics()) {%><<%=genItemType.getObjectType().getImportedParameterizedInstanceClassName()%>><%}%>();
+        <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+		for (<%=genModel.getImportedName("java.util.StringTokenizer")%> stringTokenizer = new <%=genModel.getImportedName("java.util.StringTokenizer")%>(initialValue); stringTokenizer.hasMoreTokens(); )
+        <%} else {%>
+		for (String item : split(initialValue))
+        <%}%>
+		{
+        <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF26_VALUE) {%>
+			String item = stringTokenizer.nextToken();
+        <%}%>
+      <%if (genItemType.getGenPackage() == genPackage) {%>
+			result.add(create<%=genItemType.getName()%>FromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+      <%} else {%>
+			result.add(<%if (!genItemType.isObjectType()) {%>(<%=genItemType.getObjectInstanceClassName()%>)<%}%><%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genItemType.getQualifiedClassifierAccessor()%>, item));
+      <%}%>
+		}
+		return result;
+      <%}%>
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+      <%if (genPackage.isDataTypeConverters()) {%>
+        <%if (genDataType.isPrimitiveType() && !isJDK50) {%>
+		return new <%=genDataType.getObjectInstanceClassName()%>(create<%=genDataType.getName()%>(initialValue));
+        <%} else {%>
+		return create<%=genDataType.getName()%>(initialValue);
+        <%}%>
+      <%} else {%>
+		if (initialValue == null) return null;
+		<%=genDataType.getObjectInstanceClassName()%> result = null;
+		RuntimeException exception = null;
+      <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		try
+		{
+      <%if (genMemberType.getGenPackage() == genPackage) {%>
+			result = <%if (!genDataType.isObjectType() && !genDataType.getObjectInstanceClassName().equals(genMemberType.getObjectInstanceClassName())) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%>create<%=genMemberType.getName()%>FromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%} else {%>
+			result = <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getObjectInstanceClassName()%>)<%}%><%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.createFromString(<%=genMemberType.getQualifiedClassifierAccessor()%>, initialValue);
+      <%}%>
+			if (result != null && <%=genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician")%>.INSTANCE.validate(eDataType, result, null, null))
+			{
+				return result;
+			}
+		}
+		catch (RuntimeException e)
+		{
+			exception = e;
+		}
+      <%}%>
+		if (result != null || exception == null) return result;
+    
+		throw exception;
+      <%}%>
+    <%} else if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {%>
+		return create<%=genDataType.getName()%>(initialValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)<%}%>super.createFromString(initialValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else {%>
+		return <%if (!genDataType.isObjectType()) {%>(<%=genDataType.getImportedParameterizedObjectInstanceClassName()%>)<%}%>super.createFromString(eDataType, initialValue);
+    <%}%>
+	}
+
+<%if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) { String eDataType = genDataType.getQualifiedClassifierAccessor();%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+  <%if (genPackage.isDataTypeConverters() && useInterfaceOverrideAnnotation) {%>
+	@Override
+  <%}%>
+	public String convert<%=genDataType.getName()%>(<%if (genDataType.hasCreatorBody()) {%>final <%}%><%=genDataType.getImportedBoundedWildcardInstanceClassName()%> <%if (genDataType.hasConverterBody()) {%>it<%} else {%>instanceValue<%}%>)
+	{
+    <%if (genDataType.hasConverterBody()) {%>
+		<%=genDataType.getConverterBody(genModel.getIndentation(stringBuffer))%>
+    <%} else if (genDataType instanceof GenEnum) {%>
+		return instanceValue == null ? null : instanceValue.toString();
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); boolean isPrimitiveConversion = !genDataType.isPrimitiveType() && genBaseType.isPrimitiveType();%>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+        <%if (isPrimitiveConversion) {%>
+		return instanceValue == null ? null : convert<%=genBaseType.getName()%>(instanceValue<%if (!isJDK50) {%>.<%=genBaseType.getPrimitiveValueFunction()%>()<%}%>);
+        <%} else {%>
+		return convert<%=genBaseType.getName()%>(instanceValue);
+        <%}%>
+      <%} else if (genBaseType.getGenPackage().isDataTypeConverters()) {%>
+		return <%=genBaseType.getGenPackage().getQualifiedFactoryInstanceAccessor()%>.convert<%=genBaseType.getName()%>(instanceValue);
+      <%} else {%>
+		return <%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genBaseType.getQualifiedClassifierAccessor()%>, instanceValue);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+		if (instanceValue == null) return null;
+		if (instanceValue.isEmpty()) return "";
+		<%=genModel.getImportedName(genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer")%> result = new <%=genModel.getImportedName(genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer")%>();
+        <%String item; if (!genModel.useGenerics()) { item = "i.next()"; %>
+		for (<%=genModel.getImportedName("java.util.Iterator")%> i = instanceValue.iterator(); i.hasNext(); )
+        <%} else { item = "item";%>
+		for (<%=genModel.getImportedName("java.lang.Object")%> item : instanceValue)
+        <%}%>
+		{
+      <%if (genItemType.getGenPackage() == genPackage) {%>
+        <%if (genPackage.isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.append(convert<%=genItemType.getName()%>((<%=genItemType.getObjectInstanceClassName()%>)<%=item%>));
+        <%} else {%>
+			result.append(convert<%=genItemType.getName()%>ToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%}%>
+      <%} else {%>
+        <%if (genItemType.getGenPackage().isDataTypeConverters()) { genItemType = genItemType.getObjectType();%>
+			result.append(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convert<%=genItemType.getName()%>((<%=genItemType.getObjectInstanceClassName()%>)<%=item%>));
+        <%} else {%>
+			result.append(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%}%>
+      <%}%>
+			result.append(' ');
+		}
+		return result.substring(0, result.length() - 1);
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+      <%if (!genDataType.isPrimitiveType()) {%>
+		if (instanceValue == null) return null;
+        <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		if (<%=genMemberType.getQualifiedClassifierAccessor()%>.isInstance(instanceValue))
+		{
+			try
+			{
+          <%if (genMemberType.getGenPackage() == genPackage) {%>
+            <%if (genPackage.isDataTypeConverters()) {%>
+              <%if (genMemberType.getQualifiedInstanceClassName().equals(genDataType.getQualifiedInstanceClassName())) {%>
+				String value = convert<%=genMemberType.getName()%>(instanceValue);
+              <%} else if (genMemberType.isPrimitiveType() && !isJDK50) {%>
+				String value = convert<%=genMemberType.getName()%>(((<%=genMemberType.getObjectType().getImportedInstanceClassName()%>)instanceValue).<%=genMemberType.getPrimitiveValueFunction()%>());
+              <%} else {%>
+				String value = convert<%=genMemberType.getName()%>((<%=genMemberType.getObjectType().getImportedBoundedWildcardInstanceClassName()%>)instanceValue);
+              <%}%>
+            <%} else {%>
+				String value = convert<%=genMemberType.getName()%>ToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+            <%}%>
+          <%} else {%>
+            <%if (genMemberType.getGenPackage().isDataTypeConverters()) { genMemberType = genMemberType.getObjectType();%>
+				String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convert<%=genMemberType.getName()%>((<%=genMemberType.getObjectInstanceClassName()%>)instanceValue);
+            <%} else {%>
+				String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+            <%}%>
+          <%}%>
+				if (value != null) return value;
+			}
+			catch (Exception e)
+			{
+				// Keep trying other member types until all have failed.
+			}
+		}
+        <%}%>
+      <%} else {%>
+        <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		try
+		{
+          <%if (genMemberType.getGenPackage() == genPackage) {%>
+            <%if (genPackage.isDataTypeConverters()) {%>
+			String value = convert<%=genMemberType.getName()%>(instanceValue);
+            <%} else {%>
+			String value = convert<%=genMemberType.getName()%>ToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, <%if (!isJDK50) {%>new <%=genMemberType.getObjectInstanceClassName()%>(instanceValue)<%} else {%>instanceValue<%}%>);
+            <%}%>
+          <%} else {%>
+            <%if (genMemberType.getGenPackage().isDataTypeConverters()) {%>
+			String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convert<%=genMemberType.getName()%>(instanceValue);
+            <%} else {%>
+			String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, <%if (!isJDK50) {%>new <%=genMemberType.getObjectInstanceClassName()%>(instanceValue)<%} else {%>instanceValue<%}%>);
+            <%}%>
+          <%}%>
+			if (value != null) return value;
+		}
+		catch (Exception e)
+		{
+			// Keep trying other member types until all have failed.
+		}
+        <%}%>
+      <%}%>
+		throw new IllegalArgumentException("Invalid value: '"+instanceValue+"' for datatype :"+<%=eDataType%>.getName());
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return super.convertToString(instanceValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else if (genDataType.isPrimitiveType() && !isJDK50) {%>
+		return super.convertToString(<%=eDataType%>, new <%=genDataType.getObjectInstanceClassName()%>(instanceValue));
+    <%} else {%>
+		return super.convertToString(<%=eDataType%>, instanceValue);
+    <%}%>
+	}
+
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+    <%if (genModel.useGenerics() && (genDataType.getItemType() != null || genDataType.isUncheckedCast()) && (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody())) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	public String convert<%=genDataType.getName()%>ToString(<%=genModel.getImportedName("org.eclipse.emf.ecore.EDataType")%> eDataType, Object instanceValue)
+	{
+    <%if (genDataType instanceof GenEnum) {%>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {%>
+		return convert<%=genDataType.getName()%>((<%=genDataType.getImportedInstanceClassName()%>)instanceValue);
+      <%} else {%>
+		return instanceValue == null ? null : instanceValue.toString();
+      <%}%>
+    <%} else if (genDataType.getBaseType() != null) { GenDataType genBaseType = genDataType.getBaseType(); %>
+      <%if (genBaseType.getGenPackage() == genPackage) {%>
+		return convert<%=genBaseType.getName()%>ToString(<%=genBaseType.getQualifiedClassifierAccessor()%>, instanceValue);
+      <%} else {%>
+		return <%=genBaseType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genBaseType.getQualifiedClassifierAccessor()%>, instanceValue);
+      <%}%>
+    <%} else if (genDataType.getItemType() != null) { GenDataType genItemType = genDataType.getItemType(); %>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasCreatorBody()) {%>
+		return convert<%=genDataType.getName()%>((<%=genDataType.getImportedBoundedWildcardInstanceClassName()%>)instanceValue);
+      <%} else { final String singleWildcard = genModel.useGenerics() ? "<?>" : "";%>
+		if (instanceValue == null) return null;
+		<%=genModel.getImportedName("java.util.List")%><%=singleWildcard%> list = (<%=genModel.getImportedName("java.util.List")%><%=singleWildcard%>)instanceValue;
+		if (list.isEmpty()) return "";
+		<%=genModel.getImportedName("java.lang.StringBuffer")%> result = new <%=genModel.getImportedName("java.lang.StringBuffer")%>();
+        <%String item; if (!genModel.useGenerics()) { item = "i.next()"; %>
+		for (<%=genModel.getImportedName("java.util.Iterator")%> i = list.iterator(); i.hasNext(); )
+        <%} else { item = "item";%>
+		for (<%=genModel.getImportedName("java.lang.Object")%> item : list)
+        <%}%>
+		{
+        <%if (genItemType.getGenPackage() == genPackage) {%>
+			result.append(convert<%=genItemType.getName()%>ToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%} else {%>
+			result.append(<%=genItemType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genItemType.getQualifiedClassifierAccessor()%>, <%=item%>));
+        <%}%>
+			result.append(' ');
+		}
+		return result.substring(0, result.length() - 1);
+      <%}%>
+    <%} else if (!genDataType.getMemberTypes().isEmpty()) {%>
+      <%if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {%>
+        <%if (genDataType.isPrimitiveType()) {%>
+		return instanceValue == null ? null : convert<%=genDataType.getName()%>(((<%=genDataType.getObjectInstanceClassName()%>)instanceValue)<%if (!isJDK50) {%>.<%=genDataType.getPrimitiveValueFunction()%>()<%}%>);
+        <%} else {%>
+		return convert<%=genDataType.getName()%>(instanceValue);
+        <%}%>
+      <%} else {%>
+		if (instanceValue == null) return null;
+        <%for (GenDataType genMemberType : genDataType.getMemberTypes()) {%>
+		if (<%=genMemberType.getQualifiedClassifierAccessor()%>.isInstance(instanceValue))
+		{
+			try
+			{
+        <%if (genMemberType.getGenPackage() == genPackage) {%>
+				String value = convert<%=genMemberType.getName()%>ToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+        <%} else {%>
+				String value = <%=genMemberType.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.convertToString(<%=genMemberType.getQualifiedClassifierAccessor()%>, instanceValue);
+        <%}%>
+				if (value != null) return value;
+			}
+			catch (Exception e)
+			{
+				// Keep trying other member types until all have failed.
+			}
+		}
+        <%}%>
+		throw new IllegalArgumentException("Invalid value: '"+instanceValue+"' for datatype :"+eDataType.getName());
+      <%}%>
+    <%} else if (genPackage.isDataTypeConverters() || genDataType.hasConverterBody()) {%>
+        <%if (genDataType.isPrimitiveType()) {%>
+		return instanceValue == null ? null : convert<%=genDataType.getName()%>(<%if (!isJDK50) {%>(<%}%>(<%=genDataType.getObjectInstanceClassName()%>)instanceValue<%if (!isJDK50) {%>).<%=genDataType.getPrimitiveValueFunction()%>()<%}%>);
+        <%} else {%>
+		return convert<%=genDataType.getName()%>((<%=genDataType.getImportedBoundedWildcardInstanceClassName()%>)instanceValue);
+        <%}%>
+    <%} else if (!genDataType.hasConversionDelegate() && genModel.useGenerics() && (genDataType.isArrayType() || !genDataType.getEcoreDataType().getETypeParameters().isEmpty() || genDataType.getEcoreDataType().getInstanceTypeName().contains("<"))) {%>
+		return super.convertToString(instanceValue);
+    <%} else if (!genDataType.hasConversionDelegate() && genDataType.isArrayType()) {%>
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new <%=genModel.getImportedName("java.lang.UnsupportedOperationException")%>();
+    <%} else {%>
+		return super.convertToString(eDataType, instanceValue);
+    <%}%>
+	}
+
+  <%}%>
+<%}%>
+<%} else {%>
+  <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+    <%if (genClass.hasFactoryInterfaceCreateMethod()) {%>
+	/**
+	 * Returns a new object of class '<em><%=genClass.getFormattedName()%></em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em><%=genClass.getFormattedName()%></em>'.
+      <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+      <%}%>
+	 * @generated
+	 */
+<%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+<%}%>
+	<%=genClass.getTypeParameters()%><%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> create<%=genClass.getName()%>();
+
+    <%}%>
+  <%}%>
+  <%if (genPackage.isDataTypeConverters()) {%>
+    <%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+      <%if (genDataType.isSerializable()) {%>
+	/**
+	 * Returns an instance of data type '<em><%=genDataType.getFormattedName()%></em>' corresponding the given literal.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal a literal of the data type.
+	 * @return a new instance value of the data type.
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	<%=genDataType.getImportedParameterizedInstanceClassName()%> create<%=genDataType.getName()%>(String literal);
+
+	/**
+	 * Returns a literal representation of an instance of data type '<em><%=genDataType.getFormattedName()%></em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param instanceValue an instance value of the data type.
+	 * @return a literal representation of the instance value.
+  <%if (genDataType.hasAPITags()) {%>
+	 * <%=genDataType.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genDataType.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	String convert<%=genDataType.getName()%>(<%=genDataType.getImportedBoundedWildcardInstanceClassName()%> instanceValue);
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (!isImplementation && !genModel.isSuppressEMFMetaData()) {%>
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	<%=genPackage.getPackageInterfaceName()%> get<%=genPackage.getBasicPackageName()%>();
+
+<%} else if (isImplementation) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+ <%if (useInterfaceOverrideAnnotation && !genModel.isSuppressEMFMetaData()) {%>
+	@Override
+ <%}%>
+	public <%=genPackage.getImportedPackageInterfaceName()%> get<%=genPackage.getBasicPackageName()%>()
+	{
+		return (<%=genPackage.getImportedPackageInterfaceName()%>)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Deprecated
+  <%}%>
+	public static <%=genPackage.getImportedPackageInterfaceName()%> getPackage()
+	{
+		return <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE;
+	}
+
+<%}%>
+} //<%=isInterface ? genPackage.getFactoryInterfaceName() : genPackage.getFactoryClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._StsPyGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._StsPyGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..e7f37b3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgVnIDG0Ed-kc8dEZsdm2w/method._StsPyGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = ((Object[]) new Object[]{new Object[]{genPackage,Boolean.TRUE,Boolean.FALSE}})[0];
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._08qh6WKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._08qh6WKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._08qh6WKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._85wYhHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._85wYhHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..1e675a3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._85wYhHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.getResource() != GenResourceKind.NONE_LITERAL);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiEzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..f6dd7fe
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiFzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getUtilitiesPackageName();
+className = genPackage.getResourceClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiGTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiGTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..170637d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._PgoiGTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,462 @@
+
+<%
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel(); ExtendedMetaData extendedMetaData= genModel.getExtendedMetaData();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getUtilitiesPackageName()%>;
+
+<%genModel.getImportedName("org.eclipse.emf.common.util.URI");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource </b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see <%=genPackage.getQualifiedResourceFactoryClassName()%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public class <%=genPackage.getResourceClassName()%> extends <%=genPackage.getImportedResourceBaseClassName()%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * Creates an instance of the resource.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param uri the URI of the new resource.
+	 * @generated
+	 */
+	public <%=genPackage.getResourceClassName()%>(URI uri)
+	{
+		super(uri);
+<%if (genPackage.getResource() == GenResourceKind.XML_LITERAL) { // Do nothing%>
+<%}%>
+	}
+
+<%if (genPackage.isDataTypeConverters() && (genPackage.hasDocumentRoot() || org.eclipse.emf.ecore.xml.type.XMLTypePackage.eNS_URI.equals(genPackage.getNSURI()))) { boolean isXMLTypePackage = org.eclipse.emf.ecore.xml.type.XMLTypePackage.eNS_URI.equals(genPackage.getNSURI());%>
+<%final String _Map = genModel.useGenerics() ? "Map<?, ?>" : "Map";%>
+<%final String _MapStringBoolean = genModel.useGenerics() ? "Map<String, Boolean>" : "Map";%>
+<%final String _MapStringWildcard = genModel.useGenerics() ? "Map<String, ?>" : "Map";%>
+<%if (!isXMLTypePackage) {%>
+<%genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLResource");%>
+<%genModel.getImportedName("org.eclipse.emf.ecore.xmi.XMLParserPool");%>
+<%genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl");%>
+<%genModel.getImportedName("java.io.InputStream");%>
+<%genModel.getImportedName("java.io.IOException");%>
+<%genModel.getImportedName("org.eclipse.emf.ecore.EObject");%>
+<%genModel.getImportedName("java.util.Collections");%>
+<%genModel.getImportedName("java.util.HashMap");%>
+<%genModel.getImportedName("java.util.Map");%>
+<%genModel.getImportedName("org.xml.sax.InputSource");%>
+<%genModel.getImportedName("javax.xml.parsers.SAXParser");%>
+<%}%>
+<%genModel.getImportedName("org.xml.sax.Attributes");%>
+<%genModel.getImportedName("org.xml.sax.SAXException");%>
+<%String _StackFrame = genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeResourceImpl")+".StackFrame";%>
+<%String _DataFrame = genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeResourceImpl")+".DataFrame";%>
+<%if (!isXMLTypePackage) {%>
+	/**
+	 * A load option that turns of the use of the generate data converters.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final String OPTION_USE_DATA_CONVERTER = "USE_DATA_CONVERTER";
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public void doLoad(InputStream inputStream, <%=_Map%> options) throws IOException
+	{
+		if (options != null && Boolean.TRUE.equals(options.get(OPTION_USE_DATA_CONVERTER)))
+		{
+		  getContents().add
+			 (load
+				 (new InputSource(inputStream), 
+				  (<%=_MapStringBoolean%>)options.get(XMLResource.OPTION_PARSER_FEATURES), 
+				  (<%=_MapStringWildcard%>)options.get(XMLResource.OPTION_PARSER_PROPERTIES), 
+				  Boolean.TRUE.equals(options.get(XMLResource.OPTION_USE_LEXICAL_HANDLER))).eContainer());
+		}
+		else
+		{  
+			super.doLoad(inputStream, options);
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public void doLoad(InputSource inputSource, <%=_Map%> options) throws IOException
+	{
+		if (options != null && Boolean.TRUE.equals(options.get(OPTION_USE_DATA_CONVERTER)))
+		{
+		  getContents().add
+			 (load
+				 (inputSource,
+				  (<%=_MapStringBoolean%>)options.get(XMLResource.OPTION_PARSER_FEATURES), 
+				  (<%=_MapStringWildcard%>)options.get(XMLResource.OPTION_PARSER_PROPERTIES), 
+				  Boolean.TRUE.equals(options.get(XMLResource.OPTION_USE_LEXICAL_HANDLER))).eContainer());
+		}
+		else
+		{  
+			super.doLoad(inputSource, options);
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final XMLParserPool parserPool = new XMLParserPoolImpl();
+
+	/**
+	 * Loads an instance from the input.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param inputSource the input from which to load.
+	 * @param features a map of the parser features and their values.
+	 * @param properties a map of a parser properties and their values.
+	 * @param useLexicalHandler whether a lexical handler should be used during loading.
+	 * @return the root object; for the case of a document root, the child of that document root is return.
+	 * @throws ParserConfigurationException
+	 * @throws SAXException
+	 * @generated
+	 */
+	public static EObject load(InputSource inputSource, <%=_MapStringBoolean%> features, <%=_MapStringWildcard%> properties, boolean useLexicalHandler) throws IOException
+	{
+		<%=_MapStringBoolean%> requiredFeatures = new <%=_MapStringBoolean.replaceAll("Map","HashMap")%>();
+		requiredFeatures.put("http://xml.org/sax/features/namespaces", Boolean.TRUE); 
+		if (features != null)
+		{
+			requiredFeatures.putAll(features);
+		}
+		
+		if (properties == null)
+		{
+			properties = Collections.<%if (genModel.useGenerics()) {%>emptyMap()<%} else {%>EMPTY_MAP<%}%>;
+		}
+		
+		SAXParser saxParser = null;
+		try
+		{
+			saxParser = parserPool.get(requiredFeatures, properties, useLexicalHandler);
+			final FrameFactory.DocumentRootStackFrame documentRoot = FrameFactory.INSTANCE.pushDocumentRoot(null, null);
+			XMLTypeResourceImpl.Handler handler = new XMLTypeResourceImpl.Handler(documentRoot);
+			saxParser.parse(inputSource, handler);
+<%if (genModel.isSuppressEMFTypes()) {%>
+			return (EObject)((EObject)FrameFactory.INSTANCE.popDocumentRoot(documentRoot)).eContents().get(0);
+<%} else {%>
+			return FrameFactory.INSTANCE.popDocumentRoot(documentRoot).eContents().get(0);
+<%}%>
+		}
+		catch (Exception exception)
+		{
+			throw new IOWrappedException(exception);
+		}
+		finally
+		{
+			parserPool.release(saxParser, requiredFeatures, properties, useLexicalHandler);
+		}
+	}
+
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public final static class FrameFactory
+	{
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public static final FrameFactory INSTANCE = new FrameFactory();
+	
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=genClass.getName()%>StackFrame <%=genClass.getSafeUncapName()%>;
+
+<%}%>
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=_DataFrame%> <%=genDataType.getSafeUncapName()%>;
+
+<%}%>
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%List<EStructuralFeature> attributes = extendedMetaData.getAllAttributes(genClass.getEcoreClass());%>
+<%List<EStructuralFeature> elements = extendedMetaData.getAllElements(genClass.getEcoreClass());%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=genClass.getName()%>StackFrame push<%=genClass.getName()%>(<%=_StackFrame%> previous, Attributes attributes)
+		{
+			 <%=genClass.getName()%>StackFrame result<%=genClass.getName()%> = <%=genClass.getSafeUncapName()%> == null ? new <%=genClass.getName()%>StackFrame() : <%=genClass.getSafeUncapName()%>;
+			 <%=genClass.getSafeUncapName()%> = null;
+			 result<%=genClass.getName()%>.pushOnto(previous);
+			 result<%=genClass.getName()%>.handleAttributes(attributes);
+			 return result<%=genClass.getName()%>;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=genClass.getImportedInterfaceName()%> pop<%=genClass.getName()%>(<%=genClass.getName()%>StackFrame <%=genClass.getSafeUncapName()%>)
+		{
+			<%=genClass.getImportedInterfaceName()%> result<%=genClass.getName()%>Value = <%=genClass.getSafeUncapName()%>.pop<%=genClass.getName()%>();
+			this.<%=genClass.getSafeUncapName()%> = <%=genClass.getSafeUncapName()%>;
+			return result<%=genClass.getName()%>Value;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public static class <%=genClass.getName()%>StackFrame extends <%=_StackFrame%>
+		{
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=genClass.getImportedInterfaceName()%> the<%=genClass.getName()%>;
+		
+<%for (GenFeature genFeature : genClass.getAllGenFeatures()) {%>
+<%String name = extendedMetaData.getName(genFeature.getEcoreFeature());%>
+<%if ((elements.contains(genFeature.getEcoreFeature()) || attributes.contains(genFeature.getEcoreFeature())) && name.indexOf(":") == -1) {%>
+<%if (genFeature.isReferenceType()) {%>
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=genFeature.getTypeGenClass().getGenPackage().getImportedResourceClassName()%>.FrameFactory.<%=genFeature.getTypeGenClass().getName()%>StackFrame <%=genFeature.getSafeName()%>;
+
+<%} else {%>
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=_DataFrame%> <%=genFeature.getSafeName()%>;
+		
+<%}%>
+<%}%>
+<%}%>
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+  <%}%>
+			public void handleAttributes(Attributes attributes)
+			{
+<%int count = 0; for (GenFeature genFeature : genClass.getAllGenFeatures()) {%>
+<%String name = extendedMetaData.getName(genFeature.getEcoreFeature());%>
+<%if (attributes.contains(genFeature.getEcoreFeature()) && !genFeature.isDerived() && name.indexOf(":") == -1) {%>
+<%String namespace = Literals.toStringLiteral(extendedMetaData.getNamespace(genFeature.getEcoreFeature()), genModel); if ("null".equals(namespace)) namespace = "\"\"";%>
+<%if (!genFeature.isReferenceType()) { GenClassifier genClassifier = genFeature.getTypeGenClassifier();%>
+<%if (count++ == 0) {%>
+				String theValue = attributes.getValue(<%=namespace%>, "<%=name%>");
+<%} else {%>
+				theValue = attributes.getValue(<%=namespace%>, "<%=name%>");
+<%}%>
+				if (theValue != null)
+				{
+<%if (genClassifier.getGenPackage().isDataTypeConverters()) {%>
+					the<%=genClass.getName()%>.set<%=genFeature.getAccessorName()%>(<%=genClassifier.getGenPackage().getQualifiedFactoryInstanceAccessor()%>.create<%=genClassifier.getName()%>(theValue));
+<%} else {%>
+					the<%=genClass.getName()%>.set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType(null)%>)<%=genClassifier.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.createFromString(<%=genClassifier.getQualifiedClassifierAccessor()%>, theValue));
+<%}%>
+				}
+<%}%>
+<%}%>
+<%}%>
+<%if (count == 0) {%>
+				// There are attributes to handle.
+<%}%>
+			}
+		
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+  <%}%>
+			public <%=_StackFrame%> startElement(String namespace, String localName, String qName, Attributes attributes) throws SAXException
+			{
+<%count = 0; for (GenFeature genFeature : genClass.getAllGenFeatures()) {%>
+<%String name = extendedMetaData.getName(genFeature.getEcoreFeature());%>
+<%if (elements.contains(genFeature.getEcoreFeature()) && name.indexOf(":") == -1) {%>
+<%String namespace = Literals.toStringLiteral(extendedMetaData.getNamespace(genFeature.getEcoreFeature()), genModel); if ("null".equals(namespace)) namespace = "\"\"";%>
+				<%if (count++ != 0) {%>else <%}%>if ("<%=name%>".equals(localName) && <%=namespace%>.equals(namespace))
+				{
+					return <%=genFeature.getSafeName()%> = <%=genFeature.getTypeGenClassifier().getGenPackage().getImportedResourceClassName()%>.FrameFactory.INSTANCE.push<%=genFeature.getTypeGenClassifier().getName()%>(this, attributes);
+				}
+<%}%>
+<%}%>
+<%if (count == 0) {%>
+				return super.startElement(namespace, localName, qName, attributes);
+<%} else {%>
+				else
+				{
+					return super.startElement(namespace, localName, qName, attributes);
+				}
+<%}%>
+			}
+
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+  <%}%>
+			public void endElement(<%=_StackFrame%> child) throws SAXException
+			{
+<%count = 0; for (GenFeature genFeature : genClass.getAllGenFeatures()) {%>
+<%String name = extendedMetaData.getName(genFeature.getEcoreFeature());%>
+<%if (elements.contains(genFeature.getEcoreFeature()) && name.indexOf(":") == -1) {%>
+				<%if (count++ != 0) {%>else <%}%>if (child == <%=genFeature.getSafeName()%>)
+				{
+<%if (genFeature.isListType()) {%>
+					the<%=genClass.getName()%>.<%=genFeature.getGetAccessor()%>().add(<%=genFeature.getTypeGenClassifier().getGenPackage().getImportedResourceClassName()%>.FrameFactory.INSTANCE.pop<%=genFeature.getTypeGenClassifier().getName()%>(<%=genFeature.getSafeName()%>));
+<%} else {%>
+					the<%=genClass.getName()%>.set<%=genFeature.getAccessorName()%>(<%=genFeature.getTypeGenClassifier().getGenPackage().getImportedResourceClassName()%>.FrameFactory.INSTANCE.pop<%=genFeature.getTypeGenClassifier().getName()%>(<%=genFeature.getSafeName()%>));
+<%}%>
+					<%=genFeature.getSafeName()%> = null;
+				}
+<%}%>
+<%}%>
+<%if (count == 0) {%>
+				super.endElement(child);
+<%} else {%>
+				else
+				{
+					super.endElement(child);
+				}
+<%}%>
+			}
+
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+  <%}%>
+			public void create()
+			{
+				the<%=genClass.getName()%> = <%=genPackage.getQualifiedFactoryInstanceAccessor()%>.create<%=genClass.getName()%>();
+			}
+		
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=genClass.getImportedInterfaceName()%> pop<%=genClass.getName()%>()
+			{
+				pop();
+				<%=genClass.getImportedInterfaceName()%> result<%=genClass.getName()%>Value = the<%=genClass.getName()%>;
+				the<%=genClass.getName()%> = null;
+				return result<%=genClass.getName()%>Value;
+			}
+		
+		}
+
+<%}%>
+<%for (GenDataType genDataType : genPackage.getAllGenDataTypes()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=_DataFrame%> push<%=genDataType.getName()%>(<%=_StackFrame%> previous, Attributes attributes)
+		{
+			 <%=_DataFrame%> result<%=genDataType.getName()%> = <%=genDataType.getSafeUncapName()%> == null ? new <%=_DataFrame%>() : <%=genDataType.getSafeUncapName()%>;
+			 <%=genDataType.getSafeUncapName()%> = null;
+			 result<%=genDataType.getName()%>.pushOnto(previous);
+			 result<%=genDataType.getName()%>.handleAttributes(attributes);
+			 return result<%=genDataType.getName()%>;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=genDataType.getImportedParameterizedInstanceClassName()%> pop<%=genDataType.getName()%>(<%=_DataFrame%> <%=genDataType.getSafeUncapName()%>)
+		{
+<%if (genDataType.getGenPackage().isDataTypeConverters()) {%>
+			<%=genDataType.getImportedParameterizedInstanceClassName()%> result<%=genDataType.getName()%>Value = <%=genDataType.getGenPackage().getQualifiedFactoryInstanceAccessor()%>.create<%=genDataType.getName()%>(<%=genDataType.getSafeUncapName()%>.popValue());
+<%} else if (genDataType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>
+			<%=genDataType.getImportedInstanceClassName()%> result<%=genDataType.getName()%>Value = ((<%=genDataType.getObjectInstanceClassName()%>)<%=genDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.createFromString(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>.popValue())).<%=genDataType.getPrimitiveValueFunction()%>();
+<%} else {%>
+			<%=genDataType.getImportedInstanceClassName()%> result<%=genDataType.getName()%>Value = (<%=genDataType.getObjectInstanceClassName()%>)<%=genDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor()%>.createFromString(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>.popValue());
+<%}%>
+			this.<%=genDataType.getSafeUncapName()%> = <%=genDataType.getSafeUncapName()%>;
+			return result<%=genDataType.getName()%>Value;
+		}
+
+<%}%>
+	}
+
+<%}%>
+} //<%=genPackage.getResourceClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._SsDRCGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._SsDRCGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PgoiEDG0Ed-kc8dEZsdm2w/method._SsDRCGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._07ePGWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._07ePGWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._07ePGWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._9Nt2VHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._9Nt2VHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..93d098d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._9Nt2VHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.hasConstraints());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph004zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..400775a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph005zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getUtilitiesPackageName();
+className = genPackage.getValidatorClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph006TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph006TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..99d091d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._Ph006TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,678 @@
+
+<%
+/**
+ * Copyright (c) 2002-2013 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%final String singleWildcard = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50 ? "<?>" : "";%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getUtilitiesPackageName()%>;
+
+<%genModel.addImport("java.util.Map");%>
+<%final String _Map = genModel.useGenerics() ? "Map<" + genModel.getImportedName("java.lang.Object") + ", " + genModel.getImportedName("java.lang.Object") + ">" : "Map";%>
+<%final String objectArgument = genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.Object") + ">" : "";%>
+<%genModel.addImport("org.eclipse.emf.common.util.DiagnosticChain");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EPackage");%>
+<%if (!genPackage.hasJavaLangConflict() && !genPackage.getUtilitiesPackageName().equals(genPackage.getInterfacePackageName())) genModel.addImport(genPackage.getInterfacePackageName() + ".*");%>
+<%genModel.markImportLocation(stringBuffer);%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.Descriptor");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.Registry");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.SubstitutionLabelProvider");%>
+<%genModel.addPseudoImport("org.eclipse.emf.ecore.EValidator.PatternMatcher");%>
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Validator</b> for the model.
+ * <!-- end-user-doc -->
+ * @see <%=genPackage.getQualifiedPackageInterfaceName()%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClassifiers())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public class <%=genPackage.getValidatorClassName()%> extends <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator")%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genPackage.getValidatorClassName()%> INSTANCE = new <%=genPackage.getValidatorClassName()%>();
+
+	/**
+	 * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.common.util.Diagnostic#getSource()
+	 * @see org.eclipse.emf.common.util.Diagnostic#getCode()
+	 * @generated
+	 */
+	public static final String DIAGNOSTIC_SOURCE = "<%=genPackage.getInterfacePackageName()%>";<%=genModel.getNonNLS()%>
+
+<%int count = 0; for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%for (GenOperation genOperation : genClass.getInvariantOperations()) {%>
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint '<%=genOperation.getFormattedName()%>' of '<%=genClass.getFormattedName()%>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int <%=genClass.getOperationID(genOperation)%> = <%=++count%>;
+
+<%}}%>
+	/**
+	 * A constant with a fixed name that can be used as the base value for additional hand written constants.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = <%=count%>;
+
+	/**
+	 * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
+
+<%for (GenPackage baseGenPackage : genPackage.getAllValidatorBaseGenPackages()) {%>
+	/**
+	 * The cached base package validator.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=baseGenPackage.getImportedValidatorClassName()%> <%=genPackage.getValidatorPackageUniqueSafeName(baseGenPackage)%>Validator;
+
+<%}%>
+<%if (genPackage.hasInvariantExpressions()) {%>
+	/**
+	 * Delegates evaluation of the given invariant expression against the object in the given context.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static boolean validate(<%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> eClass, <%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%> eObject, DiagnosticChain diagnostics, <%=_Map%> context, <%=genModel.getImportedName("java.lang.String")%> validationDelegate, <%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%> invariant, <%=genModel.getImportedName("java.lang.String")%> expression, int severity, <%=genModel.getImportedName("java.lang.String")%> source, int code)
+	{
+		return <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator")%>.validate(eClass, eObject, diagnostics, context, validationDelegate, invariant, expression, severity, source, code);
+	}
+
+<%}%>
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getValidatorClassName()%>()
+	{
+		super();
+<%for (GenPackage baseGenPackage : genPackage.getAllValidatorBaseGenPackages()) {%>
+		<%=genPackage.getValidatorPackageUniqueSafeName(baseGenPackage)%>Validator = <%=baseGenPackage.getImportedValidatorClassName()%>.INSTANCE;
+<%}%>
+	}
+
+	/**
+	 * Returns the package of this validator switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	protected EPackage getEPackage()
+	{
+	  return <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE;
+	}
+
+	/**
+	 * Calls <code>validateXXX</code> for the corresponding classifier of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+  <%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+    <%if (genClassifier.isUncheckedCast()) {%>
+	@SuppressWarnings("unchecked")
+    <%break; }%>
+  <%}%>
+	protected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, <%=_Map%> context)
+	{
+		switch (classifierID)
+		{
+<%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {%>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genPackage.getClassifierID(genClassifier)%>:
+  <%if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+    <%if (genDataType.isPrimitiveType()) {%>
+      <%if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>
+				return validate<%=genDataType.getName()%>(((<%=genDataType.getObjectInstanceClassName()%>)value).<%=genDataType.getPrimitiveValueFunction()%>(), diagnostics, context);
+      <%} else {%>
+				return validate<%=genDataType.getName()%>((<%=genDataType.getObjectInstanceClassName()%>)value, diagnostics, context);
+      <%}%>
+    <%} else if (genDataType.isObjectType()) {%>
+				return validate<%=genDataType.getName()%>(value, diagnostics, context);
+    <%} else {%>
+				return validate<%=genDataType.getName()%>((<%=genDataType.getObjectType().getImportedWildcardInstanceClassName()%>)value, diagnostics, context);
+    <%}%>
+  <%} else { GenClass genClass = (GenClass)genClassifier;%>
+				return validate<%=genClass.getName()%>((<%=genClass.getImportedWildcardInstanceClassName()%>)value, diagnostics, context);
+  <%}%>
+<%}%>
+			default:
+				return true;
+		}
+	}
+
+<%for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {String result = "result".equals(genClassifier.getSafeUncapName()) ? "theResult" : "result"; String diagnostics = "diagnostics".equals(genClassifier.getSafeUncapName()) ? "theDiagnostics" : "diagnostics"; String item = "item".equals(genClassifier.getSafeUncapName()) ? "theItem" : "item"; String context = "context".equals(genClassifier.getSafeUncapName()) ? "theContext" : "context";%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+    <%if (genClassifier.hasAPITags()) {%>
+	 * <%=genClassifier.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClassifier.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	public boolean validate<%=genClassifier.getName()%>(<%=genClassifier.getImportedWildcardInstanceClassName()%> <%=genClassifier.getSafeUncapName()%>, DiagnosticChain <%=diagnostics%>, <%=_Map%> <%=context%>)
+	{
+<%if (genClassifier.getAllGenConstraints().isEmpty()) {%>
+		return true;
+<%} else if (genClassifier.hasOnlyDefaultConstraints()) {%>
+		return validate_EveryDefaultConstraint(<%if (!((GenClass)genClassifier).isEObjectExtension()){%>(<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%>)<%}%><%=genClassifier.getSafeUncapName()%>, <%=diagnostics%>, <%=context%>);
+<%} else { boolean first = true;%>
+<%for (String constraint : genClassifier.getAllGenConstraints()) {GenClassifier constraintImplementor = genClassifier.getConstraintImplementor(constraint);
+  String delegate = constraintImplementor == null || constraintImplementor.getGenPackage() == genPackage ? "" : genPackage.getValidatorPackageUniqueSafeName(constraintImplementor.getGenPackage()) + "Validator.";
+  String cast = constraintImplementor == null && genClassifier instanceof GenClass && !((GenClass)genClassifier).isEObjectExtension() ? "(" + genModel.getImportedName("org.eclipse.emf.ecore.EObject") + ")" : "";
+  String accessor = constraintImplementor != null && genClassifier instanceof GenDataType && !((GenDataType)genClassifier).isPrimitiveType() && ((GenDataType)constraintImplementor).isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50 ? "." + ((GenDataType)constraintImplementor).getPrimitiveValueFunction() + "()" : "";%>
+<%if ("NoCircularContainment".equals(constraint)) {%>
+		if (!validate_NoCircularContainment(<%if (!((GenClass)genClassifier).isEObjectExtension()){%>(<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%>)<%}%><%=genClassifier.getSafeUncapName()%>, <%=diagnostics%>, <%=context%>)) return false;
+<%} else if (first) { first = false;%>
+		boolean <%=result%> = <%=delegate%>validate<%=constraintImplementor == null ? "" : constraintImplementor.getName()%>_<%=constraint%>(<%=cast%><%=genClassifier.getSafeUncapName()%><%=accessor%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+		if (<%=result%> || <%=diagnostics%> != null) <%=result%> &= <%=delegate%>validate<%=constraintImplementor == null ? "" : constraintImplementor.getName()%>_<%=constraint%>(<%=cast%><%=genClassifier.getSafeUncapName()%><%=accessor%>, <%=diagnostics%>, <%=context%>);
+<%}%>
+<%}%>
+		return <%=result%>;
+<%}%>
+	}
+
+<%for (String constraint : genClassifier.getGenConstraints())
+{GenClassifier constraintDelegate = genClassifier.getConstraintDelegate(constraint);
+  String constant = genClassifier.getClassifierID() + "__" + CodeGenUtil.format(constraint, '_', null, false, false).toUpperCase(genClassifier.getGenModel().getLocale());
+  String delegate = constraintDelegate == null || constraintDelegate.getGenPackage() == genPackage ? "" : genPackage.getValidatorPackageUniqueSafeName(constraintDelegate.getGenPackage()) + "Validator.";
+  String cast = constraintDelegate == null && genClassifier instanceof GenClass && !((GenClass)genClassifier).isEObjectExtension() ? "(" + genModel.getImportedName("org.eclipse.emf.ecore.EObject") + ")" : "";
+  String accessor = constraintDelegate != null && genClassifier instanceof GenDataType && !((GenDataType)genClassifier).isPrimitiveType() && ((GenDataType)constraintDelegate).isPrimitiveType()  && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50 ? "." + ((GenDataType)constraintDelegate).getPrimitiveValueFunction() + "()" : "";%>
+<%if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+<%if (constraint.equals("Min") && genDataType.getMinLiteral() != null) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @see #validate<%=genDataType.getName()%>_<%=constraint%>
+	 */
+	public static final <%=genDataType.getImportedInstanceClassName()%> <%=constant%>__VALUE = <%=genDataType.getStaticValue(genDataType.getMinLiteral())%>;
+
+<%} else if (constraint.equals("Max") && genDataType.getMaxLiteral() != null) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @see #validate<%=genDataType.getName()%>_<%=constraint%>
+	 */
+	public static final <%=genDataType.getImportedInstanceClassName()%> <%=constant%>__VALUE = <%=genDataType.getStaticValue(genDataType.getMaxLiteral())%>;
+
+<%} else if (constraint.equals("TotalDigits") && genDataType.getTotalDigits() != -1 && !"java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName())) { String value = "1"; for (int digitCount = genDataType.getTotalDigits(); digitCount > 0; --digitCount) value += "0"; %>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @see #validate<%=genDataType.getName()%>_<%=constraint%>
+	 */
+	public static final <%=genDataType.getImportedInstanceClassName()%> <%=constant%>__UPPER_BOUND = <%=genDataType.getStaticValue(value)%>;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @see #validate<%=genDataType.getName()%>_<%=constraint%>
+	 */
+	public static final <%=genDataType.getImportedInstanceClassName()%> <%=constant%>__LOWER_BOUND = <%=genDataType.getStaticValue("-" + value)%>;
+
+<%} else if (constraint.equals("Pattern") && !genDataType.getPatterns().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @see #validate<%=genDataType.getName()%>_<%=constraint%>
+	 */
+	public static final  PatternMatcher [][] <%=constant%>__VALUES =
+		new PatternMatcher [][]
+		{
+<%for (Iterator<List<String>> k = genDataType.getPatterns().iterator(); k.hasNext(); ) { List<String> patternList = k.next();%>
+			new PatternMatcher []
+			{
+<%for (Iterator<String> p = patternList.iterator(); p.hasNext(); ) { String pattern = p.next();%>
+				<%=genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil")%>.createPatternMatcher(<%=pattern%>)<%=p.hasNext() ? "," : ""%>
+<%}%>
+			}<%=k.hasNext() ? "," : ""%>
+<%}%>
+		};
+
+<%} else if (constraint.equals("Enumeration") && !genDataType.getEnumerationLiterals().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @see #validate<%=genDataType.getName()%>_<%=constraint%>
+	 */
+  <%if (genDataType.isUncheckedCast()) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+	public static final <%=genModel.getImportedName("java.util.Collection")%><%=objectArgument%> <%=constant%>__VALUES =
+		wrapEnumerationValues
+			(new Object[]
+			 {
+<%for (Iterator<String> k = genDataType.getEnumerationLiterals().iterator(); k.hasNext(); ) { String literal = k.next();%>
+				 <%if (genDataType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>new <%=genDataType.getObjectInstanceClassName()%>(<%}%><%=genDataType.getStaticValue(literal, false)%><%if (genDataType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>)<%}%><%=k.hasNext() ? "," : ""%>
+<%}%>
+			 });
+
+<%}%>
+<%}%>
+<%if (genClassifier.hasConstraintExpression(constraint)) {%>
+	/**
+	 * The cached validation expression for the <%=constraint%> constraint of '<em><%=genClassifier.getFormattedName()%></em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final <%=genModel.getImportedName("java.lang.String")%> <%=genClassifier.getClassifierID()%>__<%=CodeGenUtil.upperName(constraint)%>__EEXPRESSION = "<%=genClassifier.getConstraintExpression(constraint, "\t\t")%>";<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * Validates the <%=constraint%> constraint of '<em><%=genClassifier.getFormattedName()%></em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validate<%=genClassifier.getName()%>_<%=constraint%>(<%=genClassifier.getImportedWildcardInstanceClassName()%> <%=genClassifier.getSafeUncapName()%>, DiagnosticChain <%=diagnostics%>, <%=_Map%> <%=context%>)
+	{
+<%if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;%>
+<%if (constraint.equals("ItemType") && genDataType.getItemType() != null) { GenDataType itemType = genDataType.getItemType(); String itemDelegate = itemType.getGenPackage() == genPackage ? "" : genPackage.getValidatorPackageUniqueSafeName(itemType.getGenPackage()) + "Validator.";%>
+		boolean <%=result%> = true;
+		for (<%=genModel.getImportedName("java.util.Iterator")%><%=singleWildcard%> i = <%=genClassifier.getSafeUncapName()%>.iterator(); i.hasNext() && (result || diagnostics != null); )
+		{
+			Object item = i.next();
+  <%if (itemType.getGenPackage().hasConstraints()) {%>
+			if (<%=itemType.getQualifiedClassifierAccessor()%>.isInstance(item))
+			{
+				result &= <%=itemDelegate%>validate<%=itemType.getName()%>(<%if (itemType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>(<%}%><%if (!itemType.isObjectType()) {%>(<%=itemType.getObjectInstanceClassName()%>)<%}%><%=item%><%if (itemType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>).<%=itemType.getPrimitiveValueFunction()%>()<%}%>, <%=diagnostics%>, <%=context%>);
+			}
+			else
+  <%} else {%>
+			if (!<%=itemType.getQualifiedClassifierAccessor()%>.isInstance(item))
+  <%}%>
+			{
+				result = false;
+				reportDataValueTypeViolation(<%=itemType.getQualifiedClassifierAccessor()%>, item, <%=diagnostics%>, <%=context%>);
+			}
+		}
+		return result;
+<%} else if (constraint.equals("MemberTypes") && !genDataType.getMemberTypes().isEmpty()) {%>
+		if (diagnostics != null)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%> tempDiagnostics = new BasicDiagnostic();
+<%for (ListIterator<GenDataType> k = genDataType.getMemberTypes().listIterator(); k.hasNext(); ) { GenDataType memberType = k.next(); String memberDelegate = memberType.getGenPackage() == genPackage ? "" : genPackage.getValidatorPackageUniqueSafeName(memberType.getGenPackage()) + "Validator.";%>
+  <%if (genDataType.isPrimitiveType()) {%>
+			if (<%=memberDelegate%>validate<%=memberType.getName()%>(<%=genClassifier.getSafeUncapName()%>, tempDiagnostics, <%=context%>)) return true;
+  <%} else {%>
+			if (<%=memberType.getQualifiedClassifierAccessor()%>.isInstance(<%=genClassifier.getSafeUncapName()%>))
+			{
+				<%if (memberType.getGenPackage().hasConstraints()) {%>if (<%=memberDelegate%>validate<%=memberType.getName()%>(<%if (memberType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>(<%}%><%if (!memberType.isObjectType() && !memberType.getQualifiedInstanceClassName().equals(genDataType.getQualifiedInstanceClassName())) {%>(<%=memberType.getImportedWildcardObjectInstanceClassName()%>)<%}%><%=genClassifier.getSafeUncapName()%><%if (memberType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>).<%=memberType.getPrimitiveValueFunction()%>()<%}%>, tempDiagnostics, <%=context%>)) <%}%>return true;
+			}
+  <%}%>
+<%}%>
+<%if (genModel.useGenerics()) {%>
+			for (<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%> diagnostic : tempDiagnostics.getChildren())
+			{
+				diagnostics.add(diagnostic);
+			}
+<%} else {%>
+			<%=genModel.getImportedName("java.util.List")%> children = tempDiagnostics.getChildren();
+			for (int i = 0; i < children.size(); i++)
+			{
+				diagnostics.add((<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>)children.get(i));
+			}
+<%}%>
+		}
+		else
+		{
+<%for (ListIterator<GenDataType> k = genDataType.getMemberTypes().listIterator(); k.hasNext(); ) { GenDataType memberType = k.next(); String memberDelegate = memberType.getGenPackage() == genPackage ? "" : genPackage.getValidatorPackageUniqueSafeName(memberType.getGenPackage()) + "Validator.";%>
+  <%if (genDataType.isPrimitiveType()) {%>
+			if (<%=memberDelegate%>validate<%=memberType.getName()%>(<%=genClassifier.getSafeUncapName()%>, null, <%=context%>)) return true;
+  <%} else {%>
+			if (<%=memberType.getQualifiedClassifierAccessor()%>.isInstance(<%=genClassifier.getSafeUncapName()%>))
+			{
+				<%if (memberType.getGenPackage().hasConstraints()) {%>if (<%=memberDelegate%>validate<%=memberType.getName()%>(<%if (memberType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>(<%}%><%if (!memberType.isObjectType() && !memberType.getQualifiedInstanceClassName().equals(genDataType.getQualifiedInstanceClassName())) {%>(<%=memberType.getImportedWildcardObjectInstanceClassName()%>)<%}%><%=genClassifier.getSafeUncapName()%><%if (memberType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>).<%=memberType.getPrimitiveValueFunction()%>()<%}%>, null, <%=context%>)) <%}%>return true;
+			}
+  <%}%>
+<%}%>
+		}
+		return false;
+<%} else if (constraint.equals("Pattern") && !genDataType.getPatterns().isEmpty()) {%>
+		return validatePattern(<%=genDataType.getQualifiedClassifierAccessor()%>, <%if (genDataType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>new <%=genDataType.getObjectInstanceClassName()%>(<%}%><%=genDataType.getSafeUncapName()%><%if (genDataType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>)<%}%>, <%=constant%>__VALUES, <%=diagnostics%>, <%=context%>);
+<%} else if (constraint.equals("Enumeration") && !genDataType.getEnumerationLiterals().isEmpty()) { String variable = genDataType.getSafeUncapName();%>
+<%if (genDataType.isPrimitiveType() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) { variable = variable + "Object";%>
+		<%=genDataType.getObjectInstanceClassName()%> <%=variable%> = new <%=genDataType.getObjectInstanceClassName()%>(<%=genDataType.getSafeUncapName()%>);
+<%}%>
+		boolean <%=result%> = <%=constant%>__VALUES.contains(<%=variable%>);
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportEnumerationViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=variable%>, <%=constant%>__VALUES, <%=diagnostics%>, <%=context%>);
+		return <%=result%>;
+<%} else if (constraint.equals("Min") && genDataType.getMinLiteral() != null) {%>
+<%if (genDataType.isPrimitiveType()) {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%> <%=genDataType.isMinInclusive() ? ">=" : ">"%> <%=constant%>__VALUE;
+		if (!<%=result%> && <%=diagnostics%> != null)
+<%if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>
+			reportMinViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, new <%=genDataType.getObjectInstanceClassName()%>(<%=genDataType.getSafeUncapName()%>), new <%=genDataType.getObjectInstanceClassName()%>(<%=constant%>__VALUE), <%=genDataType.isMinInclusive() ? "true" : "false"%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+			reportMinViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE, <%=genDataType.isMinInclusive() ? "true" : "false"%>, <%=diagnostics%>, <%=context%>);
+<%}%>
+		return <%=result%>;
+<%} else { String comparison = "comparison".equals(genClassifier.getSafeUncapName()) ? "theComparison" : "comparison";%>
+<%if (genDataType.isXMLCalendar()) {%>
+		int <%=comparison%> = <%=genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil")%>.compareCalendar(<%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE);
+		boolean <%=result%> = <%if (genDataType.isMinInclusive()) {%><%=comparison%> == 0 || <%}%><%=comparison%> == 1;
+<%} else if (genDataType.isXMLDuration()) {%>
+		int <%=comparison%> = <%=genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil")%>.compareDuration(<%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE);
+		boolean <%=result%> = <%if (genDataType.isMinInclusive()) {%><%=comparison%> == 0 || <%}%><%=comparison%> == 1;
+<%} else {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%>.compareTo(<%=constant%>__VALUE) <%=genDataType.isMinInclusive() ? ">=" : ">"%> 0;
+<%}%>
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportMinViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE, <%=genDataType.isMinInclusive() ? "true" : "false"%>, <%=diagnostics%>, <%=context%>);
+		return <%=result%>;
+<%}%>
+<%} else if (constraint.equals("Max") && genDataType.getMaxLiteral() != null) {%>
+<%if (genDataType.isPrimitiveType()) {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%> <%=genDataType.isMaxInclusive() ? "<=" : "<"%> <%=constant%>__VALUE;
+		if (!<%=result%> && <%=diagnostics%> != null)
+<%if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>
+			reportMaxViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, new <%=genDataType.getObjectInstanceClassName()%>(<%=genDataType.getSafeUncapName()%>), new <%=genDataType.getObjectInstanceClassName()%>(<%=constant%>__VALUE), <%=genDataType.isMaxInclusive() ? "true" : "false"%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+			reportMaxViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE, <%=genDataType.isMaxInclusive() ? "true" : "false"%>, <%=diagnostics%>, <%=context%>);
+<%}%>
+		return <%=result%>;
+<%} else { String comparison = "comparison".equals(genClassifier.getSafeUncapName()) ? "theComparison" : "comparison";%>
+<%if (genDataType.isXMLCalendar()) {%>
+		int <%=comparison%> = <%=genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil")%>.compareCalendar(<%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE);
+		boolean <%=result%> = <%if (genDataType.isMaxInclusive()) {%><%=comparison%> == 0 || <%}%><%=comparison%> == -1;
+<%} else if (genDataType.isXMLDuration()) {%>
+		int <%=comparison%> = <%=genModel.getImportedName("org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil")%>.compareDuration(<%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE);
+		boolean <%=result%> = <%if (genDataType.isMaxInclusive()) {%><%=comparison%> == 0 || <%}%><%=comparison%> == -1;
+<%} else {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%>.compareTo(<%=constant%>__VALUE) <%=genDataType.isMaxInclusive() ? "<=" : "<"%> 0;
+<%}%>
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportMaxViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=constant%>__VALUE, <%=genDataType.isMaxInclusive() ? "true" : "false"%>, <%=diagnostics%>, <%=context%>);
+		return <%=result%>;
+<%}%>
+<%} else if (constraint.equals("MinLength") && genDataType.getMinLength() != -1) {%>
+		int length = <%=genDataType.getSafeUncapName()%>.<%=genDataType.getLengthAccessorFunction()%>;
+		boolean <%=result%> = length >= <%=genDataType.getMinLength()%>;
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportMinLengthViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, length, <%=genDataType.getMinLength()%>, <%=diagnostics%>, <%=context%>);
+		return <%=result%>;
+<%} else if (constraint.equals("MaxLength") && genDataType.getMaxLength() != -1) {%>
+		int length = <%=genDataType.getSafeUncapName()%>.<%=genDataType.getLengthAccessorFunction()%>;
+		boolean <%=result%> = length <= <%=genDataType.getMaxLength()%>;
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportMaxLengthViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, length, <%=genDataType.getMaxLength()%>, <%=diagnostics%>, <%=context%>);
+		return <%=result%>;
+<%} else if (constraint.equals("TotalDigits") && genDataType.getTotalDigits() != -1) {%>
+<%if (genDataType.isPrimitiveType()) {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%> > <%=constant%>__LOWER_BOUND && <%=genDataType.getSafeUncapName()%> < <%=constant%>__UPPER_BOUND;
+		if (!<%=result%> && <%=diagnostics%> != null)
+<%if (genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>
+			reportTotalDigitsViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, new <%=genDataType.getObjectInstanceClassName()%>(<%=genDataType.getSafeUncapName()%>), <%=genDataType.getTotalDigits()%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+			reportTotalDigitsViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=genDataType.getTotalDigits()%>, <%=diagnostics%>, <%=context%>);
+<%}%>
+<%} else if ("java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName())) {%>
+		int scale = <%=genDataType.getSafeUncapName()%>.scale();
+		int totalDigits = scale < 0 ? <%=genDataType.getSafeUncapName()%>.precision() - scale : <%=genDataType.getSafeUncapName()%>.precision();
+		boolean <%=result%> = totalDigits <= <%=genDataType.getTotalDigits()%>;
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportTotalDigitsViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=genDataType.getTotalDigits()%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%>.compareTo(<%=constant%>__LOWER_BOUND) > 0 && <%=genDataType.getSafeUncapName()%>.compareTo(<%=constant%>__UPPER_BOUND) < 0;
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportTotalDigitsViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=genDataType.getTotalDigits()%>, <%=diagnostics%>, <%=context%>);
+<%}%>
+		return <%=result%>;
+<%} else if (constraint.equals("FractionDigits") && genDataType.getFractionDigits() != -1 && "java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName())) {%>
+		boolean <%=result%> = <%=genDataType.getSafeUncapName()%>.scale() <= <%=genDataType.getFractionDigits()%>;
+		if (!<%=result%> && <%=diagnostics%> != null)
+			reportFractionDigitsViolation(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genDataType.getSafeUncapName()%>, <%=genDataType.getFractionDigits()%>, <%=diagnostics%>, <%=context%>);
+		return <%=result%>;
+<%} else if (constraintDelegate != null) {%>
+		// TODO override the constraint, if desired
+		// -> uncomment the scaffolding
+		// -> specify the condition that violates the constraint
+		// -> verify the diagnostic details, including severity, code, and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false)
+		{
+			if (<%=diagnostics%> != null)
+			{
+				<%=diagnostics%>.add
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+					(createDiagnostic
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 "_UI_GenericConstraint_diagnostic",<%=genModel.getNonNLS()%>
+						 new Object[] { "<%=constraint%>", getValueLabel(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genClassifier.getSafeUncapName()%>, <%=context%>) },<%=genModel.getNonNLS()%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> },
+						 context));
+<%} else {%>
+					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericConstraint_diagnostic", new Object[] { "<%=constraint%>", getValueLabel(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genClassifier.getSafeUncapName()%>, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> }));
+<%}%>
+			}
+			return false;
+		}
+		return <%=delegate%>validate<%=constraintDelegate.getName()%>_<%=constraint%>(<%=genClassifier.getSafeUncapName()%><%=accessor%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+  <%if (genClassifier.hasConstraintExpression(constraint)) {%>
+		return
+			validate
+				(<%=genClassifier.getQualifiedClassifierAccessor()%>,
+				 <%=genClassifier.getSafeUncapName()%>,
+				 <%=diagnostics%>,
+				 <%=context%>,
+				 "<%=genClassifier.getValidationDelegate(constraint)%>",<%=genModel.getNonNLS()%>
+				 "<%=constraint%>",<%=genModel.getNonNLS()%>
+				 <%=genClassifier.getClassifierID()%>__<%=CodeGenUtil.upperName(constraint)%>__EEXPRESSION,
+				 <%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+				 DIAGNOSTIC_SOURCE,
+				 0);
+  <%} else {%>
+		// TODO implement the constraint
+		// -> specify the condition that violates the constraint
+		// -> verify the diagnostic details, including severity, code, and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false)
+		{
+			if (<%=diagnostics%> != null)
+			{
+				<%=diagnostics%>.add
+    <%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+					(createDiagnostic
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 "_UI_GenericConstraint_diagnostic",<%=genModel.getNonNLS()%>
+						 new Object[] { "<%=constraint%>", getValueLabel(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genClassifier.getSafeUncapName()%>, <%=context%>) },<%=genModel.getNonNLS()%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> },
+						 context));
+    <%} else {%>
+					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericConstraint_diagnostic", new Object[] { "<%=constraint%>", getValueLabel(<%=genDataType.getQualifiedClassifierAccessor()%>, <%=genClassifier.getSafeUncapName()%>, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> }));
+    <%}%>
+			}
+			return false;
+		}
+		return true;
+  <%}%>
+<%}%>
+<%} else { GenOperation genOperation = ((GenClass)genClassifier).getInvariantOperation(constraint); if (genOperation != null) {%>
+		return <%=genClassifier.getSafeUncapName()%>.<%=constraint%>(<%=diagnostics%>, <%=context%>);
+<%} else if (constraintDelegate != null) {%>
+		// TODO override the constraint, if desired
+		// -> uncomment the scaffolding
+		// -> specify the condition that violates the constraint
+		// -> verify the diagnostic details, including severity, code, and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false)
+		{
+			if (<%=diagnostics%> != null)
+			{
+				<%=diagnostics%>.add
+  <%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+					(createDiagnostic
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 "_UI_GenericConstraint_diagnostic",<%=genModel.getNonNLS()%>
+						 new Object[] { "<%=constraint%>", getObjectLabel(<%=genClassifier.getSafeUncapName()%>, <%=context%>) },<%=genModel.getNonNLS()%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> },
+						 context));
+  <%} else {%>
+					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericConstraint_diagnostic", new Object[] { "<%=constraint%>", getObjectLabel(<%=genClassifier.getSafeUncapName()%>, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> }));
+  <%}%>
+			}
+			return false;
+		}
+		return <%=delegate%>validate<%=constraintDelegate.getName()%>_<%=constraint%>(<%=cast%><%=genClassifier.getSafeUncapName()%>, <%=diagnostics%>, <%=context%>);
+<%} else {%>
+  <%if (genClassifier.hasConstraintExpression(constraint)) {%>
+		return
+			validate
+				(<%=genClassifier.getQualifiedClassifierAccessor()%>,
+				 <%if (!((GenClass)genClassifier).isEObjectExtension()) {%>(<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%>)<%}%><%=genClassifier.getSafeUncapName()%>,
+				 <%=diagnostics%>,
+				 <%=context%>,
+				 "<%=genClassifier.getValidationDelegate(constraint)%>",<%=genModel.getNonNLS()%>
+				 "<%=constraint%>",<%=genModel.getNonNLS()%>
+				 <%=genClassifier.getClassifierID()%>__<%=CodeGenUtil.upperName(constraint)%>__EEXPRESSION,
+				 <%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+				 DIAGNOSTIC_SOURCE,
+				 0);
+  <%} else {%>
+		// TODO implement the constraint
+		// -> specify the condition that violates the constraint
+		// -> verify the diagnostic details, including severity, code, and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false)
+		{
+			if (<%=diagnostics%> != null)
+			{
+				<%=diagnostics%>.add
+    <%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+					(createDiagnostic
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 "_UI_GenericConstraint_diagnostic",<%=genModel.getNonNLS()%>
+						 new Object[] { "<%=constraint%>", getObjectLabel(<%=genClassifier.getSafeUncapName()%>, <%=context%>) },<%=genModel.getNonNLS()%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> },
+						 context));
+    <%} else {%>
+					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
+						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
+						 DIAGNOSTIC_SOURCE,
+						 0,
+						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericConstraint_diagnostic", new Object[] { "<%=constraint%>", getObjectLabel(<%=genClassifier.getSafeUncapName()%>, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+						 new Object[] { <%=genClassifier.getSafeUncapName()%> }));
+    <%}%>
+			}
+			return false;
+		}
+		return true;
+  <%}%>
+<%}}%>
+	}
+
+<%}%>
+<%}%>
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+	/**
+	 * Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator")%> getResourceLocator()
+	{
+  <%if (genModel.hasModelPluginClass()) {%>
+		return <%=genModel.getImportedName(genModel.getQualifiedModelPluginClassName())%>.INSTANCE;
+  <%} else {%>
+		// TODO
+		// Specialize this to return a resource locator for messages specific to this validator.
+		// Ensure that you remove @generated or mark it @generated NOT
+		return super.getResourceLocator();
+  <%}%>
+	}
+
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.ValidatorClass.ValidatorClass.insert" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,singleWildcard:singleWildcard,_Map:_Map,objectArgument:objectArgument,count:count"%>
+} //<%=genPackage.getValidatorClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._SspG8mKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._SspG8mKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Ph004DG0Ed-kc8dEZsdm2w/method._SspG8mKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._089c2WKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._089c2WKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._089c2WKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._9Wzg5HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._9Wzg5HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..24600c9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._9Wzg5HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.isAdapterFactory() && !genPackage.getGenClasses().isEmpty());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_AzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ed70464
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_BzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getUtilitiesPackageName();
+className = genPackage.getAdapterFactoryClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_CTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_CTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..1093c97
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._PhO_CTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,183 @@
+
+<%
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getUtilitiesPackageName()%>;
+
+<%genModel.addImport("org.eclipse.emf.common.notify.Adapter");%>
+<%genModel.addImport("org.eclipse.emf.common.notify.Notifier");%>
+<%genModel.addImport("org.eclipse.emf.common.notify.impl.AdapterFactoryImpl");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EObject");%>
+<%if (!genPackage.hasJavaLangConflict() && !genPackage.getUtilitiesPackageName().equals(genPackage.getInterfacePackageName())) genModel.addImport(genPackage.getInterfacePackageName() + ".*");%>
+<%String typeArgument = genModel.useGenerics() ? "<Adapter>" : "";%>
+<%String returnType = genModel.useGenerics() ? "Adapter" : genModel.getImportedName("java.lang.Object");%>
+<%String adapterCast = genModel.useGenerics() ? "" : "(Adapter)";%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- 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 <%=genPackage.getQualifiedPackageInterfaceName()%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getAllSwitchGenClasses())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public class <%=genPackage.getAdapterFactoryClassName()%> extends AdapterFactoryImpl
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static <%=genPackage.getImportedPackageInterfaceName()%> modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getAdapterFactoryClassName()%>()
+	{
+		if (modelPackage == null)
+		{
+			modelPackage = <%=genPackage.getImportedPackageInterfaceName()%>.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
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@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 <%=genPackage.getSwitchClassName()%><%=typeArgument%> modelSwitch =
+		new <%=genPackage.getSwitchClassName()%><%=typeArgument%>()
+		{
+<%for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+  <%}%>
+			public <%=genClass.getTypeParameters()%><%=returnType%> case<%=genPackage.getClassUniqueName(genClass)%>(<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> object)
+			{
+				return create<%=genPackage.getClassUniqueName(genClass)%>Adapter();
+			}
+<%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+  <%}%>
+			public <%=returnType%> defaultCase(EObject object)
+			{
+				return create<%=genPackage.getClassUniqueName(null)%>Adapter();
+			}
+		};
+
+	/**
+	 * 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
+	 */
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Adapter createAdapter(Notifier target)
+	{
+		return <%=adapterCast%>modelSwitch.doSwitch((EObject)target);
+	}
+
+<%for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {%>
+
+	/**
+	 * Creates a new adapter for an object of class '{@link <%=genClass.getRawQualifiedInterfaceName()%> <em><%=genClass.getFormattedName()%></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 <%=genClass.getRawQualifiedInterfaceName()%>
+  <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+		@Deprecated
+  <%}%>
+	public Adapter create<%=genPackage.getClassUniqueName(genClass)%>Adapter()
+	{
+		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 create<%=genPackage.getClassUniqueName(null)%>Adapter()
+	{
+		return null;
+	}
+
+} //<%=genPackage.getAdapterFactoryClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._Ssy372KPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._Ssy372KPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PhO_ADG0Ed-kc8dEZsdm2w/method._Ssy372KPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._07BjKWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._07BjKWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._07BjKWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._82LgFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._82LgFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..24600c9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._82LgFHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.isAdapterFactory() && !genPackage.getGenClasses().isEmpty());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh5-TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh5-TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..2badca5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh5-TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,245 @@
+
+<%
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%boolean supportsComposition = genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF27_VALUE;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getUtilitiesPackageName()%>;
+
+<%if (supportsComposition) {%>
+<%genModel.addImport("org.eclipse.emf.ecore.EObject");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EPackage");%>
+<%genModel.addImport("org.eclipse.emf.ecore.util.Switch");%>
+<%} else {%>
+<%genModel.addImport("org.eclipse.emf.ecore.EClass");%>
+<%genModel.addImport("org.eclipse.emf.ecore.EObject");%>
+<%}%>
+<%if (!genPackage.hasJavaLangConflict() && !genPackage.getUtilitiesPackageName().equals(genPackage.getInterfacePackageName())) genModel.addImport(genPackage.getInterfacePackageName() + ".*");%>
+<%
+String templateParameterName = null;
+if (genModel.useGenerics())
+{
+  Set<String> usedNames = new HashSet<String>();
+  for (GenEnum genEnum : genPackage.getGenEnums())
+  {
+    usedNames.add(genEnum.getName());
+  }
+  for (GenClass genClass : genPackage.getAllSwitchGenClasses())
+  {
+    if (!genClass.isDynamic() && !genClass.isExternalInterface())
+    {
+      usedNames.add(genClass.getName());
+    }
+    for (GenTypeParameter genTypeParameter : genClass.getGenTypeParameters())
+    {
+      usedNames.add(genTypeParameter.getName());
+    }
+  }
+  templateParameterName = "T";
+  for (int i = 1; usedNames.contains(templateParameterName); ++i)
+  {
+    templateParameterName = "T" + i;
+  }
+}
+%>
+<%String templateParameters = genModel.useGenerics() ? "<" + templateParameterName + ">" : "";%>
+<%String returnType = genModel.useGenerics() ? templateParameterName : genModel.getImportedName("java.lang.Object");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- 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 <%=genPackage.getQualifiedPackageInterfaceName()%>
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClasses())) {%>
+	@SuppressWarnings("deprecation")
+<%}%>
+public class <%=genPackage.getSwitchClassName()%><%=templateParameters%><%if (supportsComposition){%> extends Switch<%=templateParameters%><%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static <%=genPackage.getImportedPackageInterfaceName()%> modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getSwitchClassName()%>()
+	{
+		if (modelPackage == null)
+		{
+			modelPackage = <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE;
+		}
+	}
+
+<%if (supportsComposition) {%>
+	/**
+	 * 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;
+	}
+<%} else { boolean isUnnecessaryElse = genModel.isUnnecessaryElse(); String indent = isUnnecessaryElse ? "" : "\t";%>
+	/**
+	 * 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
+	 */
+	public <%=returnType%> doSwitch(EObject theEObject)
+	{
+		return doSwitch(theEObject.eClass(), theEObject);
+	}
+
+	/**
+	 * 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
+	 */
+	protected <%=returnType%> doSwitch(EClass theEClass, EObject theEObject)
+	{
+		if (theEClass.eContainer() == modelPackage)
+		{
+			return doSwitch(theEClass.getClassifierID(), theEObject);
+		}
+  <%if (!isUnnecessaryElse) {%>
+		else
+		{
+  <%}%>
+		<%=indent%><%=genModel.getImportedName("java.util.List")%><%if (genModel.useGenerics()) {%><<%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%>><%}%> eSuperTypes = theEClass.getESuperTypes();
+		<%=indent%>return
+		<%=indent%>	eSuperTypes.isEmpty() ?
+		<%=indent%>		defaultCase(theEObject) :
+		<%=indent%>		doSwitch(<%if (!genModel.useGenerics()) {%>(EClass)<%}%>eSuperTypes.get(0), theEObject);
+  <%if (!isUnnecessaryElse) {%>
+		}
+  <%}%>
+	}
+<%}%>
+
+	/**
+	 * 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
+	 */
+<%if (supportsComposition) {%>
+	@Override
+<%}%>
+	protected <%=returnType%> doSwitch(int classifierID, EObject theEObject)
+	{
+		switch (classifierID)
+		{
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%if (!genClass.isEObject()) { String result = "result".equals(genClass.getSafeUncapName()) ? "theResult" : "result"; %>
+			case <%=genPackage.getImportedPackageInterfaceName()%>.<%=genPackage.getClassifierID(genClass)%>:
+			{
+				<%if (genClass.isUncheckedCast() || genClass.isMapEntry() && isJDK50) {%>@SuppressWarnings("unchecked") <%}%><%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%> <%=genClass.getSafeUncapName()%> = (<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)theEObject;
+				<%=returnType%> <%=result%> = case<%=genPackage.getClassUniqueName(genClass)%>(<%=genClass.getSafeUncapName()%>);
+<%for (GenClass baseGenClass : genClass.getSwitchGenClasses()) {%>
+				if (<%=result%> == null) <%=result%> = <%if (genClass.isRawBaseClass(baseGenClass)) {%>(<%=returnType%>)<%}%>case<%=genPackage.getClassUniqueName(baseGenClass)%>(<%if (genClass.isMapEntry()) {%>(<%=baseGenClass.getImportedInterfaceName()%><%=baseGenClass.getInterfaceTypeArguments()%>)<%}%><%=genClass.getSafeUncapName()%>);
+<%}%>
+				if (<%=result%> == null) <%=result%> = defaultCase(theEObject);
+				return <%=result%>;
+			}
+<%}%>
+<%}%>
+			default: return defaultCase(theEObject);
+		}
+	}
+<%for (GenClass genClass : genPackage.getAllSwitchGenClasses()) {%>
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em><%=genClass.getFormattedName()%></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><%=genClass.getFormattedName()%></em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+  <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	public <%=genClass.getTypeParameters()%><%=returnType%> case<%=genPackage.getClassUniqueName(genClass)%>(<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> 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
+	 */
+<%if (supportsComposition) {%>
+	@Override
+<%}%>
+	public <%=returnType%> defaultCase(EObject object)
+	{
+		return null;
+	}
+
+} //<%=genPackage.getSwitchClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh58zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..2998af6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._Phh59zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getModelDirectory();
+packageName = genPackage.getUtilitiesPackageName();
+className = genPackage.getSwitchClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._StieyGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._StieyGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Phh58DG0Ed-kc8dEZsdm2w/method._StieyGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._0920uWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._0920uWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._0920uWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._9tdGVHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._9tdGVHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..5d95e6c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._9tdGVHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (true);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39wzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..0634f5b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39xzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditProjectDirectory() + "/" + genModel.getEditBundleLocalization()+ ".properties";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39yTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39yTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..edb321d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Pi39yTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,63 @@
+
+<%
+/**
+ * Copyright (c) 2002-2007 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+pluginName = <%=genModel.getEditBundleName()%>
+providerName = <%=genModel.getEditBundleVendorName()%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+
+<%if (genModel.isCreationCommands()) {%>
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} <%if (genModel.isCreationSubmenus()) {%>| <%}%>{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}
+
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) { %>
+    <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+_UI_<%=genClass.getName()%>_type = <%=genClass.getFormattedName()%>
+    <%}%>
+  <%}%>
+<%}%>
+_UI_Unknown_type = Object
+
+_UI_Unknown_datatype= Value
+
+<%for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) { String description = genFeature.getPropertyDescription();%>
+_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_feature = <%=genFeature.getFormattedName()%>
+  <%if (description != null && description.length() > 0) {%>
+_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_description = <%=description%>
+  <%}%>
+<%}%>
+_UI_Unknown_feature = Unspecified
+
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {%>
+    <%for (GenEnum genEnum : genPackage.getGenEnums()) {%>
+      <%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+_UI_<%=genEnum.getName()%>_<%=genEnumLiteral.getName()%>_literal = <%=genEnumLiteral.getLiteral()%>
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%for (String category : genModel.getPropertyCategories()) {%>
+<%=genModel.getPropertyCategoryKey(category)%> = <%=category%>
+<%}%>
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Sub2qGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Sub2qGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pi39wDG0Ed-kc8dEZsdm2w/method._Sub2qGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._09tDuWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._09tDuWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._09tDuWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._9qU51HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._9qU51HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..2c9ac31
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._9qU51HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) && (!genModel.sameEditEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW5zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..5619577
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW6zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditProjectDirectory() + "/plugin.xml";
+overwrite = true;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW7TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW7TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..a3910da
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._PiIW7TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,141 @@
+
+<%
+/**
+ * Copyright (c) 2002-2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; String key = genModel.getPluginKey(); boolean hasKey = key != null && !key.equals("");%>
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<%if (genModel.isBundleManifest()) {%>
+<plugin>
+<%} else {%>
+<plugin
+      name="%pluginName"
+      id="<%=genModel.getEditPluginID()%>"
+      version="1.0.0"
+      provider-name="%providerName"
+      class="<%=genModel.getQualifiedEditPluginClassName()%>$Implementation">
+
+   <requires>
+  <%for (String pluginID : genModel.getEditRequiredPlugins()) {%>
+      <import plugin="<%=pluginID%>"<%if (!pluginID.startsWith("org.eclipse.core.runtime")) {%> export="true"<%}%>/>
+  <%}%>
+   </requires>
+
+   <runtime>
+  <%if (genModel.isRuntimeJar()) {%>
+      <library name="<%=genModel.getEditPluginID()%>.jar">
+  <%} else {%>
+      <library name=".">
+  <%}%>
+         <export name="*"/>
+      </library>
+   </runtime>
+<%}%>
+<%if (genModel.sameModelEditProject()) {%>
+  <%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <package
+            uri="<%=genPackage.getNSURI()%>"
+    <%if (genModel.hasLocalGenModel()) {%>
+            class="<%=genPackage.getQualifiedPackageInterfaceName()%>"
+            genModel="<%=genModel.getRelativeGenModelLocation()%>"/>
+    <%} else {%>
+            class="<%=genPackage.getQualifiedPackageInterfaceName()%>"/>
+    <%}%>
+   </extension>
+    <%if (genPackage.isContentType()) {%>
+
+   <extension point="org.eclipse.emf.ecore.content_parser">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <parser
+            contentTypeIdentifier="<%=genPackage.getContentTypeIdentifier()%>"
+            class="<%=genPackage.getQualifiedEffectiveResourceFactoryClassName()%>"/>
+   </extension>
+
+   <extension point="org.eclipse.core.contenttype.contentTypes">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <content-type
+            base-type="<%=genPackage.isXMIResource() ? "org.eclipse.emf.ecore.xmi" : "org.eclipse.core.runtime.xml"%>"
+            file-extensions="<%=genPackage.getFileExtensions()%>"
+            id="<%=genPackage.getContentTypeIdentifier()%>"
+            name="%_UI_<%=genPackage.getPrefix()%>_content_type"
+            priority="normal">
+         <describer class="org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer">
+      <%if (genPackage.hasTargetNamespace()) {%>
+            <parameter name="namespace" value="<%=genPackage.getNSURI()%>"/>
+      <%}%>
+      <%if (genPackage.isXMIResource()) {%>
+            <parameter name="kind" value="xmi"/>
+      <%}%>
+         </describer>
+      </content-type>
+   </extension>
+    <%} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {%>
+
+   <extension point="org.eclipse.emf.ecore.extension_parser">
+      <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+      <%}%>
+      <%for (String fileExtension : genPackage.getFileExtensionList()) {%>
+      <parser
+            type="<%=fileExtension%>"
+            class="<%=genPackage.getQualifiedResourceFactoryClassName()%>"/>
+      <%}%>
+   </extension>
+    <%}%>
+  <%}%>
+<%}%>
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+  <%if (!genPackage.getGenClasses().isEmpty()) {%>
+
+   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <factory
+            uri="<%=genPackage.getNSURI()%>"
+            class="<%=genPackage.getQualifiedItemProviderAdapterFactoryClassName()%>"
+            supportedTypes=
+    <%for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext(); ) {%>
+              <%=j.hasPrevious() ? " " : "\""%><%=j.next()%><%if (!j.hasNext()) {%>"/><%}%>
+    <%}%>
+   </extension>
+    <%if (genPackage.isChildCreationExtenders()) { Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> extendedChildCreationData = genPackage.getExtendedChildCreationData();%>
+      <%if (!extendedChildCreationData.isEmpty()) {%>
+
+   <extension point="org.eclipse.emf.edit.childCreationExtenders">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+        <%for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> entry : extendedChildCreationData.entrySet()) {%>
+      <extender
+            uri="<%=entry.getKey().getNSURI()%>"
+            class="<%=genPackage.getQualifiedItemProviderAdapterFactoryClassName()%>$<%=genPackage.getChildCreationExtenderName(entry.getKey())%>"/>
+        <%}%>
+   </extension>
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+
+</plugin>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._SuSFqGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._SuSFqGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiIW5DG0Ed-kc8dEZsdm2w/method._SuSFqGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._09QXzWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._09QXzWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._09QXzWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._9kEg2HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._9kEg2HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..72ea78b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._9kEg2HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR0zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..3659b46
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR1zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditProjectDirectory() + "/build.properties";
+overwrite = genModel.isUpdateClasspath() && !new CodegenGeneratorAdapter(parameter).exists(new CodegenGeneratorAdapter(parameter).toURI(genModel.getEditProjectDirectory()).appendSegment("plugin.xml"));
+encoding = "ISO-8859-1";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR2TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR2TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..494ab7d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._PibR2TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,37 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getEditPluginID()+".jar" : ".";%>
+<%List<String> sourceFolders = genModel.getEditSourceFolders();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+bin.includes = <%=pluginClassesLocation%>,\
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+               icons/,\
+<%}%>
+<%if (genModel.isBundleManifest()) {%>
+               META-INF/,\
+<%}%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+               plugin.xml,\
+<%}%>
+<%String editBundleLocalization = genModel.getEditBundleLocalization(); int index = editBundleLocalization.indexOf("/"); if (index == -1) {%>
+               <%=editBundleLocalization%>.properties
+<%} else {%>
+               <%=editBundleLocalization.substring(0, index + 1)%>
+<%}%>
+jars.compile.order = <%=pluginClassesLocation%>
+<% boolean first=true; for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) { String sourceFolder = i.next(); if (i.hasNext()){sourceFolder +=",\\";} if (first) {%>
+source.<%=pluginClassesLocation%> = <%=sourceFolder%><%first=false;} else {%><%=sourceFolder%><%}}%>
+output.<%=pluginClassesLocation%> = bin/
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._St_KvGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._St_KvGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PibR0DG0Ed-kc8dEZsdm2w/method._St_KvGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._09j5yWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._09j5yWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._09j5yWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._9nWeVHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._9nWeVHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..ff1d18b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._9nWeVHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (genModel.isBundleManifest()) && (!genModel.sameEditEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMwzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..2474bfe
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMxzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditProjectDirectory() + "/META-INF/MANIFEST.MF";
+overwrite = genModel.isUpdateClasspath();
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMyTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMyTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..1945d4e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._PiuMyTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,54 @@
+
+<%
+/**
+ * Copyright (c) 2005-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: <%=genModel.getEditBundleNameKey()%>
+Bundle-SymbolicName: <%=genModel.getEditPluginID()%>;singleton:=true
+Automatic-Module-Name: <%=genModel.getEditPluginID()%>
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: <%if (genModel.isRuntimeJar()) {%><%=genModel.getEditPluginID()%>.jar<%}else{%>.<%}%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+Bundle-Activator: <%=genModel.getQualifiedEditPluginClassName()%>$Implementation<%if (genModel.isOSGiCompatible()) {%>$Activator<%}%>
+<%}%>
+Bundle-Vendor: <%=genModel.getEditBundleVendorKey()%>
+Bundle-Localization: <%=genModel.getEditBundleLocalization()%>
+<%if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-9
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+<%}%>
+<%Iterator<String> packagesIterator = genModel.getEditQualifiedPackageNames().iterator(); if (packagesIterator.hasNext()) { String pack = packagesIterator.next();%>
+Export-Package: <%=pack%><%while(packagesIterator.hasNext()) { pack = packagesIterator.next();%>,
+ <%=pack%><%}%>
+<%}%>
+<%Iterator<String> requiredPluginIterator = genModel.getEditRequiredPlugins().iterator(); if (requiredPluginIterator.hasNext()) { String pluginID = requiredPluginIterator.next();%>
+Require-Bundle: <%=pluginID%><%if (pluginID.startsWith("org.eclipse.core.runtime")) {if (genModel.isOSGiCompatible()) {%>;resolution:=optional;x-installation:=greedy<%}} else {%>;visibility:=reexport<%} while(requiredPluginIterator.hasNext()) { pluginID = requiredPluginIterator.next();%>,
+ <%=pluginID%><%if (pluginID.startsWith("org.eclipse.core.runtime")) {if (genModel.isOSGiCompatible()) {%>;resolution:=optional;x-installation:=greedy<%}} else if (!pluginID.equals("org.eclipse.xtext.xbase.lib") && !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {%>;visibility:=reexport<%}}%>
+<%}%>
+<%if (genModel.isOSGiCompatible()) {%>
+Import-Package: org.osgi.framework
+<%}%>
+<%if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22 || genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {%>
+Eclipse-LazyStart: true
+<%}%>
+Bundle-ActivationPolicy: lazy
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._SuI7uGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._SuI7uGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PiuMwDG0Ed-kc8dEZsdm2w/method._SuI7uGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._0-wMmGKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._0-wMmGKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._0-wMmGKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._97KyNHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._97KyNHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..2c704cd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._97KyNHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,4 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQkzG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQlzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQlzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..4e02ee8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pj6fkDG0Ed-kc8dEZsdm2w/method._PkEQlzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,18 @@
+<%
+GenPackage genPackage = parameter;
+GenModel genModel=genPackage.getGenModel();
+if (genModel.isCreationCommands() && genModel.isCreationIcons() && genPackage.isChildCreationExtenders()) {
+  for (  Map.Entry<GenPackage,Map<GenClass,List<GenClass.ChildCreationData>>> packageEntry : genPackage.getExtendedChildCreationData().entrySet()) {
+    for (    Map.Entry<GenClass,List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue().entrySet()) {
+      GenClass genClass=classEntry.getKey();
+      for (      GenClass.ChildCreationData childCreationData : classEntry.getValue()) {
+        if (childCreationData.createClassifier instanceof GenClass && (childCreationData.delegatedFeature == null || classEntry.getKey().getAllGenFeatures().contains(childCreationData.delegatedFeature))) {
+          GenClass childClass=(GenClass)childCreationData.createClassifier;
+          GenFeature feature=childCreationData.createFeature;
+new CodegenGeneratorAdapter(parameter).generateGIF("edit/CreateChild.gif", genClass.getCreateChildIconFileName(genModel,feature,childClass), genClass.getName(), childClass.getName(), false);
+        }
+      }
+    }
+  }
+}
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._0-TgqWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._0-TgqWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._0-TgqWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._9wJN9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._9wJN9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..4d200c7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._9wJN9HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenClass genClass = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4sjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4sjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4sjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4szG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4szG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4szG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7680b09
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4tzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenClass genClass = parameter;
+targetPath = genClass.getGenModel().getEditDirectory();
+packageName = genClass.getGenPackage().getProviderPackageName();
+className = genClass.getProviderClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4uTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4uTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..a876f89
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._PjK4uTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,410 @@
+
+<%
+/**
+ * Copyright (c) 2002-2019 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+ */
+%>
+<%GenClass genClass = (GenClass)argument; GenPackage genPackage = genClass.getGenPackage(); GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();String indentDefaultCase = forceDefaultCase ? "\t\t" : "";%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getProviderPackageName()%>;
+
+
+<%genModel.addImport("org.eclipse.emf.common.notify.AdapterFactory");%>
+<%genModel.addImport("org.eclipse.emf.common.notify.Notification");%>
+<%String _List = genModel.getImportedName(genModel.useGenerics() ? "java.util.List<org.eclipse.emf.edit.provider.IItemPropertyDescriptor>" : "java.util.List");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This is the item provider adapter for a {@link <%=genClass.getRawQualifiedInterfaceName()%>} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genClass.hasImplicitAPITags()) {%>
+ * <%=genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+ <%if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {%>
+@Deprecated
+ <%}%>
+public class <%=genClass.getProviderClassName()%> <%if (genClass.getProviderImplementsClassNames().isEmpty()) {%>extends <%=genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName() : genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter")%><%}%>
+<%if (!genClass.getProviderImplementsClassNames().isEmpty()) {%>
+	extends <%=genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName() : genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter")%>
+	implements
+  <%for (Iterator<String> i = genClass.getProviderImplementsClassNames().iterator(); i.hasNext(); ) {%>
+		<%=genModel.getImportedName(i.next())%><%if (i.hasNext()){%>,<%}%>
+  <%}%>
+<%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genClass.getProviderClassName()%>(AdapterFactory adapterFactory)
+	{
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public <%=_List%> getPropertyDescriptors(Object object)
+	{
+		if (itemPropertyDescriptors == null)
+		{
+			super.getPropertyDescriptors(object);
+
+<%for (GenFeature genFeature : genClass.getPropertyFeatures()) { %>
+			add<%=genFeature.getCapName()%>PropertyDescriptor(object);
+<%}%>
+		}
+		return itemPropertyDescriptors;
+	}
+
+<%for (GenFeature genFeature : genClass.getPropertyFeatures()) { %>
+	/**
+	 * This adds a property descriptor for the <%=genFeature.getFormattedName()%> feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	protected void add<%=genFeature.getCapName()%>PropertyDescriptor(Object object)
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.addPropertyDescriptor.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%><%//ItemProvider/addPropertyDescriptor.override.javajetinc%>
+	}
+
+<%}%>
+<%if (!genClass.getChildrenFeatures().isEmpty()) {%>
+	/**
+	 * 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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public <%=genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<? extends org.eclipse.emf.ecore.EStructuralFeature>" : "java.util.Collection")%> getChildrenFeatures(Object object)
+	{
+		if (childrenFeatures == null)
+		{
+			super.getChildrenFeatures(object);
+<%for (GenFeature genFeature : genClass.getChildrenFeatures()) { %>
+			childrenFeatures.add(<%=genFeature.getQualifiedFeatureAccessor()%>);
+<%}%>
+		}
+		return childrenFeatures;
+	}
+
+<%if (!genClass.getChildrenFeatures().isEmpty()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.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);
+	}
+
+<%}%>
+<%}%>
+<%if (genClass.needsHasChildrenMethodOverride()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public boolean hasChildren(Object object)
+	{
+		return hasChildren(object, <%=genModel.isOptimizedHasChildren()%>);
+	}
+
+<%}%>
+<%if (genClass.isImage()) {%>
+	/**
+	 * This returns <%=genClass.getName()%>.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public Object getImage(Object object)
+	{
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/<%=genClass.getName()%>"));<%=genModel.getNonNLS()%>
+	}
+
+<%}%>
+<%if (genClass.getProviderImplementsClassNames().contains("org.eclipse.emf.edit.provider.ITableItemLabelProvider")) {%>
+	/**
+	 * This returns <code>getImage(object)</code> for the column index <code>0</code> or <code>super.getImage(object)</code> otherwise.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText(Object)
+	 * @see #getColumnText(Object, int)
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public Object getColumnImage(Object object, int columnIndex)
+	{
+		// TODO: implement this method to return appropriate information for each column.
+		// Ensure that you remove @generated or mark it @generated NOT
+		return columnIndex == 0 ? getImage(object) : super.getImage(object);
+	}
+
+<%}%>
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF26_VALUE && !genModel.isCreationIcons()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected boolean shouldComposeCreationImage()
+	{
+		return true;
+	}
+
+<%}%>
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public String getText(Object object)
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.getText.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%><%//ItemProvider/getText.override.javajetinc%>
+	}
+
+<%if (genClass.getProviderImplementsClassNames().contains("org.eclipse.emf.edit.provider.ITableItemLabelProvider")) {%>
+	/**
+	 * This returns <code>getText(object)</code> for the column index <code>0</code> or <code>super.getText(object)</code> otherwise.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImage(Object)
+	 * @see #getColumnImage(Object, int)
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public String getColumnText(Object object, int columnIndex)
+	{
+		// TODO: implement this method to return appropriate information for each column.
+		// Ensure that you remove @generated or mark it @generated NOT
+		return columnIndex == 0 ? getText(object) : super.getText(object);
+	}
+
+<%}%>
+<%if (genModel.isStyleProviders()) {%>
+	/**
+	 * This returns the label styled text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public Object getStyledText(Object object)
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.getStyledText.override" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%><%//ItemProvider/getStyledText.override.javajetinc%>
+	}
+<%}%>
+
+	/**
+	 * 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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void notifyChanged(Notification notification)
+	{
+		updateChildren(notification);
+<%if (!genClass.getLabelNotifyFeatures().isEmpty() || !genClass.getContentNotifyFeatures().isEmpty() || !genClass.getLabelAndContentNotifyFeatures().isEmpty()) {%>
+
+		switch (notification.getFeatureID(<%=genClass.getRawImportedInterfaceName()%>.class))
+		{
+  <%if (!genClass.getLabelNotifyFeatures().isEmpty()) {%>
+    <%for (GenFeature genFeature : genClass.getLabelNotifyFeatures()) { %>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%}%>
+				fireNotifyChanged(new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification")%>(notification, notification.getNotifier(), false, true));
+				return;
+  <%}%>
+  <%if (!genClass.getContentNotifyFeatures().isEmpty()) {%>
+    <%for (GenFeature genFeature : genClass.getContentNotifyFeatures()) { %>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%}%>
+				fireNotifyChanged(new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification")%>(notification, notification.getNotifier(), true, false));
+				return;
+  <%}%>
+  <%if (!genClass.getLabelAndContentNotifyFeatures().isEmpty()) {%>
+    <%for (GenFeature genFeature : genClass.getLabelAndContentNotifyFeatures()) { %>
+			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
+    <%}%>
+				fireNotifyChanged(new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification")%>(notification, notification.getNotifier(), true, true));
+				return;
+  <%}%>
+<%if (forceDefaultCase) {%>
+			default:
+<%} else { // {%>
+		}
+<%}%>
+<%=indentDefaultCase%>		super.notifyChanged(notification);
+<%if (forceDefaultCase) { // {%>
+<%=indentDefaultCase%>		return;
+			}
+<%} // }%>
+<%}%>
+	}
+
+<%if (genModel.isCreationCommands()) {%>
+	/**
+	 * 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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected void collectNewChildDescriptors(<%=genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<java.lang.Object>" : "java.util.Collection")%> newChildDescriptors, Object object)
+	{
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+    <%for (GenClass.ChildCreationData childCreationData : genClass.getChildCreationData()) { GenFeature createFeature = childCreationData.createFeature; GenFeature delegatedFeature = childCreationData.delegatedFeature; GenClassifier createClassifier = childCreationData.createClassifier;%>
+      <%if (createFeature.isFeatureMapType()) {%>
+        <%if (delegatedFeature.isReferenceType()) { GenClass createClass = (GenClass)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsReferenceDelegatedFeature.override.javajetinc%>
+        <%} else { GenDataType createDataType = (GenDataType)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsAttributeDelegatedFeature.override.javajetinc%>
+        <%}%>
+      <%} else if (createFeature.isReferenceType()) { GenClass createClass = (GenClass)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsReferenceFeature.override.javajetinc %>
+      <%} else { GenDataType createDataType = (GenDataType)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsAttributeFeature.override.javajetinc%>
+      <%}%>
+    <%}%>
+	}
+
+  <%if (!genClass.getSharedClassCreateChildFeatures().isEmpty()) {%>
+	/**
+	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public String getCreateChildText(Object owner, Object feature, Object child, <%=genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<?>" : "java.util.Collection")%> selection)
+	{
+		Object childFeature = feature;
+		Object childObject = child;
+
+    <%if (genClass.hasFeatureMapCreateChildFeatures()) {%>
+		if (childFeature instanceof <%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%> && <%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil")%>.isFeatureMap((EStructuralFeature)childFeature))
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Entry entry = (FeatureMap.Entry)childObject;
+			childFeature = entry.getEStructuralFeature();
+			childObject = entry.getValue();
+		}
+
+    <%}%>
+		boolean qualify =
+    <%for (Iterator<GenFeature> i = genClass.getSharedClassCreateChildFeatures().iterator(); i.hasNext();) { GenFeature createFeature = i.next();%>
+			childFeature == <%=createFeature.getQualifiedFeatureAccessor()%><%=i.hasNext() ? " ||" : ";"%>
+    <%}%>
+
+		if (qualify)
+		{
+			return getString
+				("_UI_CreateChild_text2",<%=genModel.getNonNLS()%>
+				 new Object[] { getTypeText(childObject), getFeatureText(childFeature), getTypeText(owner) });
+		}
+		return super.getCreateChildText(owner, feature, child, selection);
+	}
+
+  <%}%>
+<%}%>
+<%if (genClass.getProviderExtendsGenClass() == null || genClass.getProviderExtendsGenClass().getGenPackage() != genPackage && (!genPackage.isExtensibleProviderFactory() || genClass.getProviderExtendsGenClass().getGenPackage().isExtensibleProviderFactory() != genPackage.isExtensibleProviderFactory())) {%>
+	/**
+	 * Return the resource locator for this item provider's resources.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator")%> getResourceLocator()
+	{
+<%if (genPackage.isExtensibleProviderFactory()) {%>
+		return ((<%=genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender")%>)adapterFactory).getResourceLocator();
+<%} else {%>
+		return <%=genPackage.getImportedEditPluginClassName()%>.INSTANCE;
+<%}%>
+	}
+
+<%}%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,_List:_List"%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._SuuxqGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._SuuxqGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..671872d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjK4sDG0Ed-kc8dEZsdm2w/method._SuuxqGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenClass genClass = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._09_-qWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._09_-qWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._09_-qWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._92_c1HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._92_c1HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..2d0a030
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._92_c1HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (!genPackage.getGenClasses().isEmpty());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzojG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzojG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzojG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzozG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzozG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzozG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ddc6a80
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzpzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getEditDirectory();
+packageName = genPackage.getProviderPackageName();
+className = genPackage.getItemProviderAdapterFactoryClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzqTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzqTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..8588805
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._PjdzqTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,556 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getProviderPackageName()%>;
+
+<%genModel.addImport("org.eclipse.emf.common.notify.Adapter");%>
+<%genModel.addImport("org.eclipse.emf.common.notify.Notification");%>
+<%genModel.addImport("org.eclipse.emf.common.notify.Notifier");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.ChangeNotifier");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.ComposeableAdapterFactory");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.ComposedAdapterFactory");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.IChangeNotifier");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.IEditingDomainItemProvider");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.IItemLabelProvider");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.IItemPropertySource");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.INotifyChangedListener");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.IStructuredItemContentProvider");%>
+<%genModel.addImport("org.eclipse.emf.edit.provider.ITreeItemContentProvider");%>
+<%boolean useGenerics = genModel.useGenerics();%>
+<%String _ArrayList = genModel.getImportedName(useGenerics ? "java.util.ArrayList<java.lang.Object>" : "java.util.ArrayList");%>
+<%String _Collection = genModel.getImportedName(useGenerics ? "java.util.Collection<java.lang.Object>" : "java.util.Collection");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * 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 -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClasses())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public class <%=genPackage.getItemProviderAdapterFactoryClassName()%> extends <%=genPackage.getImportedAdapterFactoryClassName()%> implements ComposeableAdapterFactory, IChangeNotifier<%if (genPackage.isDisposableProviderFactory()) {%>, <%=genModel.getImportedName("org.eclipse.emf.edit.provider.IDisposable")%><%}%><%if (genPackage.isExtensibleProviderFactory()) {%>, <%=genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender")%><%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * 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();
+
+<%if (genPackage.isDisposableProviderFactory() && genPackage.hasStatefulProvider()) {%>
+	/**
+	 * This keeps track of all the item providers created, so that they can be {@link #dispose disposed}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.edit.provider.Disposable")%> disposable = new Disposable();
+
+<%}%>
+<%if (genPackage.isExtensibleProviderFactory()) {%>
+	/**
+	 * This helps manage the child creation extenders.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.emf.edit.provider.ChildCreationExtenderManager")%> childCreationExtenderManager = new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.ChildCreationExtenderManager")%>(<%=genPackage.getImportedEditPluginClassName()%>.INSTANCE, <%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI);
+
+<%}%>
+	/**
+	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_Collection%> supportedTypes = new <%=_ArrayList%>();
+
+	/**
+	 * This constructs an instance.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getItemProviderAdapterFactoryClassName()%>()
+	{
+<%for (String name : genPackage.getProviderSupportedTypes()) {%>
+		supportedTypes.add(<%=genModel.getImportedName(name)%>.class);
+<%}%>
+	}
+
+<%for (GenPackage genDelegate : genPackage.getAdapterDelegatePackages()) {%>
+	/**
+	 * This keeps track of the factory to which to delegate adapter creation for objects from that package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genDelegate.getImportedAdapterFactoryClassName()%> <%=genPackage.getUncapAdapterFactoryDelegateName(genDelegate)%> = null;
+
+	/**
+	 * This determines the delegate factory for the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genDelegate.getImportedAdapterFactoryClassName()%> get<%=genPackage.getAdapterFactoryDelegateName(genDelegate)%>()
+	{
+		if (<%=genPackage.getUncapAdapterFactoryDelegateName(genDelegate)%> == null)
+		{
+			<%=genModel.getImportedName("org.eclipse.emf.common.notify.AdapterFactory")%> rootAdapterFactory = getRootAdapterFactory();
+			if (rootAdapterFactory instanceof ComposedAdapterFactory)
+			{
+				<%=genModel.getImportedName("org.eclipse.emf.common.notify.AdapterFactory")%> delegateAdapterFactory =
+					((ComposedAdapterFactory)rootAdapterFactory).getFactoryForType(<%=genDelegate.getImportedAdapterFactoryClassName()%>.getPackage());
+				if (delegateAdapterFactory instanceof <%=genDelegate.getImportedAdapterFactoryClassName()%>)
+				{
+					<%=genPackage.getUncapAdapterFactoryDelegateName(genDelegate)%> = (<%=genDelegate.getImportedAdapterFactoryClassName()%>)delegateAdapterFactory;
+				}
+			}
+		}
+		return <%=genPackage.getUncapAdapterFactoryDelegateName(genDelegate)%>;
+	}
+
+<%}%>
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%if (!genClass.isAbstract() && genClass.getProvider() != GenProviderKind.NONE_LITERAL) {%>
+<%if (genClass.isProviderSingleton()) {%>
+	/**
+	 * This keeps track of the one adapter used for all {@link <%=genClass.getRawQualifiedInterfaceName()%>} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	protected <%=genClass.getProviderClassName()%> <%=genClass.getUncapName()%>ItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link <%=genClass.getRawQualifiedInterfaceName()%>}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Adapter create<%=genClass.getName()%>Adapter()
+	{
+		if (<%=genClass.getUncapName()%>ItemProvider == null)
+		{
+			<%=genClass.getUncapName()%>ItemProvider = new <%=genClass.getProviderClassName()%>(this);
+		}
+
+		return <%=genClass.getUncapName()%>ItemProvider;
+	}
+
+<%} else {%>
+	/**
+	 * This creates an adapter for a {@link <%=genClass.getRawQualifiedInterfaceName()%>}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+  <%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+  <%}%>
+	public Adapter create<%=genClass.getName()%>Adapter()
+	{
+		return new <%=genClass.getProviderClassName()%>(this);
+	}
+
+<%}%>
+<%}%>
+<%}%>
+<%for (GenClass genClass : genPackage.getAdapterDelegateSuperClasses()) {%>
+	/**
+	 * <%=genClass.getName()%> of <%=genClass.getItemProviderAdapterFactoryClassName()%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+  <%if (genClass.hasAPITags()) {%>
+	 * <%=genClass.getAPITags(genModel.getIndentation(stringBuffer))%>
+  <%}%>
+	 * @generated
+	 */
+  <%if (isJDK50 && genClass.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+  <%}%>
+	public Adapter create<%=genClass.getName()%>Adapter()
+	{
+		return
+			get<%=genClass.getItemProviderAdapterFactoryClassName()%>() == null ?
+				null :
+				get<%=genClass.getItemProviderAdapterFactoryClassName()%>().create<%=genClass.getName()%>Adapter();
+	}
+
+<%}%>
+	/**
+	 * This returns the root adapter factory that contains this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+	@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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+	@Override
+<%}%>
+	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)
+	{
+		this.parentAdapterFactory = parentAdapterFactory;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public Adapter adapt(Notifier notifier, Object type)
+	{
+		return super.adapt(notifier, this);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public Object adapt(Object object, Object type)
+	{
+		if (isFactoryForType(type))
+		{
+			Object adapter = super.adapt(object, type);
+			if (!(type instanceof Class<%if (genModel.useGenerics()) {%><?><%}%>) || <%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%><%=genModel.getImportedName("org.eclipse.emf.common.util.Reflect")%>.isInstance((Class<%if (genModel.useGenerics()) {%><?><%}%>)type, adapter)<%} else {%>(((Class<%if (genModel.useGenerics()) {%><?><%}%>)type).isInstance(adapter))<%}%>)
+			{
+				return adapter;
+			}
+		}
+
+		return null;
+	}
+
+<%if (genPackage.isDisposableProviderFactory() && genPackage.hasStatefulProvider()) {%>
+	/**
+	 * Associates an adapter with a notifier via the base implementation, then records it to ensure it will be disposed.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected void associate(Adapter adapter, Notifier target)
+	{
+		super.associate(adapter, target);
+		if (adapter != null)
+		{
+			disposable.add(adapter);
+		}
+	}
+
+<%}%>
+<%if (genPackage.isExtensibleProviderFactory()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genModel.getImportedName(useGenerics ? "java.util.List<org.eclipse.emf.edit.provider.IChildCreationExtender>" : "java.util.List")%> getChildCreationExtenders()
+	{
+		return childCreationExtenderManager.getChildCreationExtenders();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genModel.getImportedName(useGenerics ? "java.util.Collection<?>" : "java.util.Collection")%> getNewChildDescriptors(Object object, <%=genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain")%> editingDomain)
+	{
+		return childCreationExtenderManager.getNewChildDescriptors(object, editingDomain);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator")%> getResourceLocator()
+	{
+		return childCreationExtenderManager;
+	}
+
+<%}%>
+	/**
+	 * This adds a listener.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+	@Override
+<%}%>
+	public void addListener(INotifyChangedListener notifyChangedListener)
+	{
+		changeNotifier.addListener(notifyChangedListener);
+	}
+
+	/**
+	 * This removes a listener.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+	@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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+	@Override
+<%}%>
+	public void fireNotifyChanged(Notification notification)
+	{
+		changeNotifier.fireNotifyChanged(notification);
+
+		if (parentAdapterFactory != null)
+		{
+			parentAdapterFactory.fireNotifyChanged(notification);
+		}
+	}
+
+<%if (genPackage.isDisposableProviderFactory()) {%>
+	/**
+	 * This disposes all of the item providers created by this factory. 
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+	@Override
+<%}%>
+	public void dispose()
+	{
+<%if (genPackage.hasStatefulProvider()) {%>
+		disposable.dispose();
+<%} else {%>
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+<%if (!genClass.isAbstract() && genClass.isProviderSingleton()) {%>
+		if (<%=genClass.getUncapName()%>ItemProvider != null) <%=genClass.getUncapName()%>ItemProvider.dispose();
+<%}%>
+<%}%>
+<%}%>
+	}
+
+<%}%>
+<%if (genPackage.isChildCreationExtenders()) {%>
+  <%for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage.getExtendedChildCreationData().entrySet()) {%>
+	/**
+	 * A child creation extender for the {@link <%=packageEntry.getKey().getImportedPackageInterfaceName()%>}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class <%=genPackage.getChildCreationExtenderName(packageEntry.getKey())%> implements <%=genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender")%>
+	{
+		/**
+		 * The switch for creating child descriptors specific to each extended class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected static class CreationSwitch extends <%=genModel.getImportedName(packageEntry.getKey().getQualifiedSwitchClassName())%><%=useGenerics ? "<Object>" : ""%>
+		{
+			/**
+			 * The child descriptors being populated.
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=genModel.getImportedName(useGenerics ? "java.util.List<Object>" : "java.util.List")%> newChildDescriptors;
+
+			/**
+			 * The domain in which to create the children.
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain")%> editingDomain;
+
+			/**
+			 * Creates the a switch for populating child descriptors in the given domain.
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			CreationSwitch(<%=genModel.getImportedName(useGenerics ? "java.util.List<Object>" : "java.util.List")%> newChildDescriptors, <%=genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain")%> editingDomain) 
+			{
+				this.newChildDescriptors = newChildDescriptors;
+				this.editingDomain = editingDomain;
+			}
+     <%for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue().entrySet()) { GenClass genClass = classEntry.getKey();%>
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public <%=genClass.getTypeParameters()%>Object case<%=genPackage.getClassUniqueName(genClass)%>(<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceTypeArguments()%> object)
+			{
+     <%for (GenClass.ChildCreationData childCreationData : classEntry.getValue()) { GenFeature createFeature = childCreationData.createFeature; GenFeature delegatedFeature = childCreationData.delegatedFeature; GenClassifier createClassifier = childCreationData.createClassifier;%>
+      <%if (createFeature.isFeatureMapType()) {%>
+        <%if (delegatedFeature.isReferenceType()) { GenClass createClass = (GenClass)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsReferenceDelegatedFeature.override.javajetinc%>
+        <%} else { GenDataType createDataType = (GenDataType)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsAttributeDelegatedFeature.override.javajetinc%>
+        <%}%>
+      <%} else if (createFeature.isReferenceType()) { GenClass createClass = (GenClass)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsReferenceFeature.override.javajetinc %>
+      <%} else { GenDataType createDataType = (GenDataType)createClassifier;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//ItemProvider/newChildDescriptorsAttributeFeature.override.javajetinc%>
+      <%}%>
+
+     <%}%>
+				return null;
+			}
+ 
+     <%}%>
+			/**
+			 * <!-- begin-user-doc -->
+			 * <!-- end-user-doc -->
+			 * @generated
+			 */
+			protected <%=genModel.getImportedName("org.eclipse.emf.edit.command.CommandParameter")%> createChildParameter(Object feature, Object child)
+			{
+				return new <%=genModel.getImportedName("org.eclipse.emf.edit.command.CommandParameter")%>(null, feature, child);
+			}
+
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=_Collection%> getNewChildDescriptors(Object object, <%=genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain")%> editingDomain)
+		{
+			<%=_ArrayList%> result = new <%=_ArrayList%>();
+			new CreationSwitch(result, editingDomain).doSwitch((<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%>)object);
+			return result;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator")%> getResourceLocator()
+		{
+			return <%=genPackage.getImportedEditPluginClassName()%>.INSTANCE;
+		}
+	}
+
+  <%}%>
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._SulnpGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._SulnpGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjdzoDG0Ed-kc8dEZsdm2w/method._SulnpGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._0-JvqWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._0-JvqWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._0-JvqWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._9y-fhHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._9y-fhHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..a9037a4
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._9y-fhHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (!genModel.sameEditEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwukzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..f9f4e48
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwulzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getEditPluginDirectory();
+packageName = genModel.getEditPluginPackageName();
+className = genModel.getEditPluginClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwumTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwumTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..ac89089
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._PjwumTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,254 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getEditPluginPackageName()%>;
+
+<%genModel.addImport("org.eclipse.emf.common.EMFPlugin");%>
+<%genModel.addImport("org.eclipse.emf.common.util.ResourceLocator");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This is the central singleton for the <%=genModel.getModelName()%> edit plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genModel.hasAPITags()) {%>
+ * <%=genModel.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genModel.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public final class <%=genModel.getEditPluginClassName()%> extends EMFPlugin
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getEditPluginClassName()%> INSTANCE = new <%=genModel.getEditPluginClassName()%>();
+
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+	/**
+	 * 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 <%=genModel.getEditPluginClassName()%>()
+	{
+		super
+		  (new ResourceLocator [] 
+		   {
+<%for (String pluginClassName : genModel.getEditResourceDelegateImportedPluginClassNames()) {%>
+		     <%=pluginClassName%>.INSTANCE,
+<%}%>
+		   });
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public ResourceLocator getPluginResourceLocator()
+	{
+<%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+		return null;
+<%} else {%>
+		return plugin;
+<%}%>
+	}
+
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+	/**
+	 * 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 -->
+<%if (genModel.needsRuntimeCompatibility()) {%>
+		 * @param descriptor the description of the plugin.
+<%}%>
+		 * @generated
+		 */
+		public Implementation(<%if (genModel.needsRuntimeCompatibility()) {%><%=genModel.getImportedName("org.eclipse.core.runtime.IPluginDescriptor")%> descriptor<%}%>)
+		{
+			super(<%if (genModel.needsRuntimeCompatibility()) {%>descriptor<%}%>);
+
+			// Remember the static instance.
+			//
+			plugin = this;
+		}
+<%if (genModel.isOSGiCompatible()) {%>
+	
+		/**
+		 * The actual implementation of the purely OSGi-compatible <b>Bundle Activator</b>.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public static final class Activator extends <%=genModel.getImportedName("org.eclipse.emf.common.EMFPlugin")%>.OSGiDelegatingBundleActivator
+		{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			protected <%=genModel.getImportedName("org.osgi.framework.BundleActivator")%> createBundle()
+			{
+				return new Implementation();
+			}
+		}
+<%}%>
+	}
+
+<%} else {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final <%=genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Properties")%> PROPERTIES = <%=genModel.getImportedName("com.google.gwt.core.client.GWT")%>.create(<%=genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Properties")%>.class);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getString(String key, boolean translate)
+	{
+<%boolean first = true; for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) { %>
+    <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+		<%if (first) { first = false; } else {%>else <%}%>if ("_UI_<%=genClass.getName()%>_type".equals(key)) return PROPERTIES.<%=genClass.getUncapName()%>Type();
+    <%}%>
+  <%}%>
+<%}%>
+		<%if (first) { first = false; } else {%>else <%}%> if ("_UI_Unknown_type".equals(key)) return PROPERTIES.unknownType();
+		else if ("_UI_Unknown_datatype".equals(key)) return PROPERTIES.unknownDatatype();
+<%for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) { String description = genFeature.getPropertyDescription();%>
+		else if ("_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_feature".equals(key)) return PROPERTIES.<%=genFeature.getGenClass().getUncapName()%>_<%=genFeature.getCapName()%>Feature();
+  <%if (description != null && description.length() > 0) {%>
+		else if ("_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_description".equals(key)) return PROPERTIES.<%=genFeature.getGenClass().getUncapName()%>_<%=genFeature.getCapName()%>Description();
+  <%}%>
+<%}%>
+		else if ("_UI_Unknown_feature".equals(key)) return PROPERTIES.unknownFeature();
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {%>
+    <%for (GenEnum genEnum : genPackage.getGenEnums()) {%>
+      <%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+		else if ("_UI_<%=genEnum.getName()%>_<%=genEnumLiteral.getName()%>_literal".equals(key)) return PROPERTIES.<%=genEnum.getSafeUncapName()%>_<%=genEnumLiteral.getName()%>Literal();
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%for (String category : genModel.getPropertyCategories()) {%>
+<%=genModel.getPropertyCategoryKey(category)%> = <%=category%>
+		else if ("<%=genModel.getPropertyCategoryKey(category)%>".equals(key)) return PROPERTIES.<%=genModel.getPropertyCategoryKey(category)%>();
+<%}%>
+		else return key;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getString(String key, Object [] substitutions, boolean translate)
+	{
+<%if (genModel.isCreationCommands()) {%>
+		if ("_UI_CreateChild_text".equals(key)) return PROPERTIES.createChildText(substitutions[0]);
+		else if ("_UI_CreateChild_text2".equals(key)) return PROPERTIES.createChildText2(substitutions[0], substitutions[1]);
+		else if ("_UI_CreateChild_text3".equals(key)) return PROPERTIES.createChildText3(substitutions[1]);
+		else if ("_UI_CreateChild_tooltip".equals(key)) return PROPERTIES.createChildTooltip(substitutions[0], substitutions[1]);
+		else if ("_UI_CreateChild_description".equals(key)) return PROPERTIES.createChildDescripition(substitutions[0], substitutions[1], substitutions[2]);
+		else if ("_UI_CreateSibling_description".equals(key)) return PROPERTIES.createSiblingDescription(substitutions[0], substitutions[1], substitutions[2]);
+<%}%>
+		<%if (!genModel.isCreationCommands()) {%>else <%}%>if ("_UI_PropertyDescriptor_description".equals(key)) return PROPERTIES.propertyDescriptorDescription(substitutions[0], substitutions[1]);
+		else return key;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final <%=genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Images")%> IMAGES = <%=genModel.getImportedName("com.google.gwt.core.client.GWT")%>.create(<%=genModel.getImportedName(genModel.getQualifiedEditPluginClassName() + "Images")%>.class);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(String key)
+	{
+<%first = true; for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+    <%if (genClass.isImage()) { String image = genClass.getItemIconFileName(); image = image.substring(image.lastIndexOf("/icons/") + 7, image.length() - 4); %>
+		<%if (first) { first = false; } else {%>else <%}%>if ("<%=image%>".equals(key)) return IMAGES.<%=genClass.getItemIconAccessorName()%>();
+    <%}%>
+  <%}%>
+<%}%>
+		<%if (first) { first = false; } else {%>else <%}%>return key;
+	}
+
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._SuuxmGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._SuuxmGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PjwukDG0Ed-kc8dEZsdm2w/method._SuuxmGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._-A1VWHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._-A1VWHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..749b6a5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._-A1VWHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.isBundleManifest());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._0_DHiWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._0_DHiWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._0_DHiWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BYzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..f747b4d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BZzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/META-INF/MANIFEST.MF";
+overwrite = genModel.isUpdateClasspath();
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BaTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BaTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..439335e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._Pk9BaTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,88 @@
+
+<%
+/**
+ * Copyright (c) 2005-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: <%=genModel.getEditorBundleNameKey()%>
+Bundle-SymbolicName: <%=genModel.getEditorPluginID()%>;singleton:=true
+Automatic-Module-Name: <%=genModel.getEditorPluginID()%>
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: <%if (genModel.isRuntimeJar()) {%><%=genModel.getEditorPluginID()%>.jar<%}else{%>.<%}%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+Bundle-Activator: <%=genModel.getQualifiedEditorPluginClassName()%>$Implementation
+<%}%>
+Bundle-Vendor: <%=genModel.getEditorBundleVendorKey()%>
+Bundle-Localization: <%=genModel.getEditorBundleLocalization()%>
+<%if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-9
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+<%}%>
+<%Iterator<String> packagesIterator = genModel.getEditorQualifiedPackageNames().iterator(); if (packagesIterator.hasNext()) { String pack = packagesIterator.next();%>
+Export-Package: <%=pack%><%while(packagesIterator.hasNext()) { pack = packagesIterator.next();%>,
+ <%=pack%><%}%>
+<%}%>
+<%Iterator<String> requiredPluginIterator = genModel.getEditorRequiredPlugins().iterator(); if (requiredPluginIterator.hasNext()) { String pluginID = requiredPluginIterator.next();%>
+Require-Bundle: <%=pluginID%><%if (!pluginID.startsWith("org.eclipse.core.runtime")){%>;visibility:=reexport<%} while(requiredPluginIterator.hasNext()) { pluginID = requiredPluginIterator.next();%>,
+ <%=pluginID%><%if (!pluginID.startsWith("org.eclipse.core.runtime") && !pluginID.equals("org.eclipse.jface.text") && !pluginID.equals("org.eclipse.xtext.xbase.lib") && !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {%>;visibility:=reexport<%}}%>
+<%}%>
+<%if (genModel.isRichAjaxPlatform()) {%>
+Import-Package: org.eclipse.emf.common.ui,
+ org.eclipse.emf.common.ui.action,
+ org.eclipse.emf.common.ui.dialogs,
+ org.eclipse.emf.common.ui.editor,
+ org.eclipse.emf.common.ui.viewer,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.emf.edit.ui.action,
+ org.eclipse.emf.edit.ui.celleditor,
+ org.eclipse.emf.edit.ui.dnd,
+ org.eclipse.emf.edit.ui.provider,
+ org.eclipse.emf.edit.ui.util,
+ org.eclipse.emf.edit.ui.view,
+ org.eclipse.jface.action,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.operation,
+ org.eclipse.jface.text,
+ org.eclipse.jface.util,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
+ org.eclipse.swt,
+ org.eclipse.swt.custom,
+ org.eclipse.swt.dnd,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui;ui.workbench="split",
+ org.eclipse.ui.actions;ui.workbench="split",
+ org.eclipse.ui.application,
+ org.eclipse.ui.part;ui.workbench="split",
+ org.eclipse.ui.plugin,
+ org.eclipse.ui.views,
+ org.eclipse.ui.views.contentoutline,
+ org.eclipse.ui.views.properties;ui.views="split"
+<%}%>
+<%if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22 || genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {%>
+Eclipse-LazyStart: true
+<%}%>
+Bundle-ActivationPolicy: lazy
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._SveYeGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._SveYeGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pk9BYDG0Ed-kc8dEZsdm2w/method._SveYeGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._0-mbmGKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._0-mbmGKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._0-mbmGKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._99Zm1HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._99Zm1HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..1756c42
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._99Zm1HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,4 @@
+GenClass genClass = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNagzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNahTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNahTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNahTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNaiTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNaiTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..b891ef8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkNagDG0Ed-kc8dEZsdm2w/method._PkNaiTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,8 @@
+<%
+GenClass genClass = parameter;
+if (genClass.isImage()) {
+new CodegenGeneratorAdapter(parameter).generateGIF("edit/Item.gif", genClass.getItemIconFileName(), genClass.getName(), null, false);
+}
+ else {
+}
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._0-cqmGKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._0-cqmGKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._0-cqmGKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._9_MWlHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._9_MWlHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..1756c42
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._9_MWlHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,4 @@
+GenClass genClass = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8gzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8hTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8hTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8hTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8iTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8iTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..bac4a0d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pkg8gDG0Ed-kc8dEZsdm2w/method._Pkg8iTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,11 @@
+<%
+GenClass genClass = parameter;
+GenModel genModel=genClass.getGenModel();
+if (genModel.isCreationCommands() && genModel.isCreationIcons()) {
+  for (  GenFeature feature : genClass.getCreateChildFeaturesIncludingDelegation()) {
+    for (    GenClass childClass : genClass.getChildrenClasses(feature)) {
+new CodegenGeneratorAdapter(parameter).generateGIF("edit/CreateChild.gif", genClass.getCreateChildIconFileName(feature,childClass), genClass.getName(), childClass.getName(), false);
+    }
+  }
+}
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._-G79VHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._-G79VHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..3534f39
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._-G79VHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._0_MReWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._0_MReWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._0_MReWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGdzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGeTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGeTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._PkqGeTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..15eec79
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/plugin.xml";
+overwrite = true;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..3ffc6f6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._Pkz3cjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,293 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; String key = genModel.getPluginKey(); boolean hasKey = key != null && !key.equals("");%>
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<%if (genModel.isBundleManifest()) {%>
+<plugin>
+<%} else {%>
+<plugin
+      name="%pluginName"
+      id="<%=genModel.getEditorPluginID()%>"
+      version="1.0.0"
+      provider-name="%providerName"
+      class="<%=genModel.getQualifiedEditorPluginClassName()%>$Implementation">
+
+   <requires>
+  <%for (String pluginID : genModel.getEditorRequiredPlugins()) { %>
+      <import plugin="<%=pluginID%>"<%if (!pluginID.startsWith("org.eclipse.core.runtime")) {%> export="true"<%}%>/>
+  <%}%>
+   </requires>
+
+   <runtime>
+  <%if (genModel.isRuntimeJar()) {%>
+      <library name="<%=genModel.getEditorPluginID()%>.jar">
+  <%} else {%>
+      <library name=".">
+  <%}%>
+         <export name="*"/>
+      </library>
+   </runtime>
+<%}%>
+<%if (genModel.sameModelEditorProject()) {%>
+  <%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <package
+            uri="<%=genPackage.getNSURI()%>"
+    <%if (genModel.hasLocalGenModel()) {%>
+            class="<%=genPackage.getQualifiedPackageInterfaceName()%>"
+            genModel="<%=genModel.getRelativeGenModelLocation()%>"/>
+    <%} else {%>
+            class="<%=genPackage.getQualifiedPackageInterfaceName()%>"/>
+    <%}%>
+   </extension>
+    <%if (genPackage.isContentType()) {%>
+
+   <extension point="org.eclipse.emf.ecore.content_parser">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <parser
+            contentTypeIdentifier="<%=genPackage.getContentTypeIdentifier()%>"
+            class="<%=genPackage.getQualifiedEffectiveResourceFactoryClassName()%>"/>
+   </extension>
+
+   <extension point="org.eclipse.core.contenttype.contentTypes">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <content-type
+            base-type="<%=genPackage.isXMIResource() ? "org.eclipse.emf.ecore.xmi" : "org.eclipse.core.runtime.xml"%>"
+            file-extensions="<%=genPackage.getFileExtensions()%>"
+            id="<%=genPackage.getContentTypeIdentifier()%>"
+            name="%_UI_<%=genPackage.getPrefix()%>_content_type"
+            priority="normal">
+         <describer class="org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer">
+      <%if (genPackage.hasTargetNamespace()) {%>
+            <parameter name="namespace" value="<%=genPackage.getNSURI()%>"/>
+      <%}%>
+      <%if (genPackage.isXMIResource()) {%>
+            <parameter name="kind" value="xmi"/>
+      <%}%>
+         </describer>
+      </content-type>
+   </extension>
+    <%} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {%>
+
+   <extension point="org.eclipse.emf.ecore.extension_parser">
+      <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+      <%}%>
+      <%for (String fileExtension : genPackage.getFileExtensionList()) {%>
+      <parser
+            type="<%=fileExtension%>"
+            class="<%=genPackage.getQualifiedResourceFactoryClassName()%>"/>
+      <%}%>
+   </extension>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.sameEditEditorProject()) {%>
+  <%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+    <%if (!genPackage.getGenClasses().isEmpty()) {%>
+
+   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <factory
+            uri="<%=genPackage.getNSURI()%>"
+            class="<%=genPackage.getQualifiedItemProviderAdapterFactoryClassName()%>"
+            supportedTypes=
+      <%for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext(); ) {%>
+              <%=j.hasPrevious() ? " " : "\""%><%=j.next()%><%if (!j.hasNext()) {%>"/><%}%>
+      <%}%>
+   </extension>
+      <%if (genPackage.isChildCreationExtenders()) { Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> extendedChildCreationData = genPackage.getExtendedChildCreationData();%>
+        <%if (!extendedChildCreationData.isEmpty()) {%>
+
+   <extension point="org.eclipse.emf.edit.childCreationExtenders">
+          <%for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> entry : extendedChildCreationData.entrySet()) {%>
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <extender
+            uri="<%=entry.getKey().getNSURI()%>"
+            class="<%=genPackage.getQualifiedItemProviderAdapterFactoryClassName()%>$<%=genPackage.getChildCreationExtenderName(entry.getKey())%>"/>
+          <%}%>
+   </extension>
+        <%}%>
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%if (genModel.isRichClientPlatform()) {%>
+
+   <extension
+         point="org.eclipse.core.runtime.applications"
+         id="<%=genModel.getEditorAdvisorClassName()%>Application">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <application>
+         <run class="<%=genModel.getQualifiedEditorAdvisorClassName()%>$Application"/>
+      </application>
+   </extension>
+
+   <extension point="org.eclipse.ui.perspectives">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <perspective
+            name="%_UI_Perspective_label"
+            class="<%=genModel.getQualifiedEditorAdvisorClassName()%>$Perspective"
+            id="<%=genModel.getQualifiedEditorAdvisorClassName()%>Perspective">
+      </perspective>
+   </extension>
+
+   <extension point="org.eclipse.ui.commands">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <command
+            name="%_UI_Menu_OpenURI_label"
+            description="%_UI_Menu_OpenURI_description"
+            categoryId="org.eclipse.ui.category.file"
+            id="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenURICommand"/>
+  <%if (!genModel.isRichAjaxPlatform()) {%>
+      <command
+            name="%_UI_Menu_Open_label"
+            description="%_UI_Menu_Open_description"
+            categoryId="org.eclipse.ui.category.file"
+            id="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenCommand"/>
+  <%}%>
+   </extension>
+
+<%if (!genModel.isRichAjaxPlatform()) {%>
+   <extension point="org.eclipse.ui.bindings">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <key
+            commandId="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenURICommand"
+            sequence="M1+U"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+      <key
+            commandId="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenCommand"
+            sequence="M1+O"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+   </extension>
+<%}%>
+
+   <extension point="org.eclipse.ui.actionSets">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <actionSet
+            label="%_UI_<%=genModel.getEditorAdvisorClassName()%>_ActionSet_label"
+            visible="true"
+            id="<%=genModel.getEditorAdvisorClassName()%>ActionSet">
+         <action
+               label="%_UI_Menu_About_label"
+               class="<%=genModel.getQualifiedEditorAdvisorClassName()%>$AboutAction"
+               menubarPath="help/additions"
+               id="<%=genModel.getQualifiedEditorAdvisorClassName()%>AboutAction"/>
+         <action
+               label="%_UI_Menu_OpenURI_label"
+               definitionId="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenURICommand"
+               class="<%=genModel.getQualifiedEditorAdvisorClassName()%>$OpenURIAction"
+               menubarPath="file/additions"
+               id="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenURIAction"/>
+  <%if (!genModel.isRichAjaxPlatform()) {%>
+         <action
+               label="%_UI_Menu_Open_label"
+               definitionId="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenCommand"
+               class="<%=genModel.getQualifiedEditorAdvisorClassName()%>$OpenAction"
+               menubarPath="file/additions"
+               id="<%=genModel.getQualifiedEditorAdvisorClassName()%>OpenAction"/>
+  <%}%>
+      </actionSet>
+   </extension>
+<%}%>
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.hasConcreteClasses()){%>
+    <%if (genPackage.isGenerateModelWizard()) {%>
+      <%if (genModel.isRichClientPlatform()) {%>
+
+   <extension point="org.eclipse.ui.actionSets">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <actionSet
+            label="%_UI_<%=genPackage.getModelWizardClassName()%>_ActionSet_label"
+            visible="true"
+            id="<%=genPackage.getQualifiedActionBarContributorClassName()%>ActionSet">
+         <action
+               label="%_UI_<%=genPackage.getModelWizardClassName()%>_label"
+               class="<%=genPackage.getQualifiedActionBarContributorClassName()%>$NewAction"
+               menubarPath="file/new/additions"
+               id="<%=genPackage.getQualifiedActionBarContributorClassName()%>NewAction"/>
+      </actionSet>
+   </extension>
+      <%} else {%>
+
+   <extension point="org.eclipse.ui.newWizards">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <category
+            id="org.eclipse.emf.ecore.Wizard.category.ID"
+            name="%_UI_Wizard_category"/>
+      <wizard
+            id="<%=genPackage.getQualifiedModelWizardClassName()%>ID"
+            name="%_UI_<%=genPackage.getModelWizardClassName()%>_label"
+            class="<%=genPackage.getQualifiedModelWizardClassName()%>"
+            category="org.eclipse.emf.ecore.Wizard.category.ID"
+            icon="icons/full/obj16/<%=genPackage.getPrefix()%>ModelFile.gif">
+         <description>%_UI_<%=genPackage.getModelWizardClassName()%>_description</description>
+         <selection class="org.eclipse.core.resources.IResource"/>
+      </wizard>
+   </extension>
+      <%}%>
+    <%}%>
+
+   <extension point="org.eclipse.ui.editors">
+  <%if (hasKey) {%>
+      <!-- @generated <%=key%> -->
+  <%}%>
+      <editor
+            id="<%=genPackage.getQualifiedEditorClassName()%>ID"
+            name="%_UI_<%=genPackage.getEditorClassName()%>_label"
+            icon="icons/full/obj16/<%=genPackage.getPrefix()%>ModelFile.gif"
+    <%if (!genPackage.isContentType()) {%>
+            extensions="<%=genPackage.getFileExtensions()%>"
+    <%}%>
+            class="<%=genPackage.getQualifiedEditorClassName()%>"
+            contributorClass="<%=genPackage.getQualifiedActionBarContributorClassName()%>">
+    <%if (genPackage.isContentType()) {%>
+         <contentTypeBinding contentTypeId="<%=genPackage.getQualifiedContentTypeIdentifier()%>"/>
+    <%}%>
+      </editor>
+   </extension>
+  <%}%>
+<%}%>
+
+</plugin>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._SvoJeGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._SvoJeGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PkqGdDG0Ed-kc8dEZsdm2w/method._SvoJeGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._-DEJ9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._-DEJ9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..6c9a61a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._-DEJ9HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._0-5WjWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._0-5WjWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._0-5WjWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjYzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..3a558d9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjZzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/build.properties";
+overwrite = genModel.isUpdateClasspath() && !new CodegenGeneratorAdapter(parameter).exists(new CodegenGeneratorAdapter(parameter).toURI(genModel.getEditorProjectDirectory()).appendSegment("plugin.xml"));
+encoding = "ISO-8859-1";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjaTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjaTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..4ec761e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._PlQjaTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,35 @@
+
+<%
+/**
+ * Copyright (c) 2002-2008 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getEditorPluginID()+".jar" : ".";%>
+<%List<String> sourceFolders = genModel.getEditorSourceFolders();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+bin.includes = <%=pluginClassesLocation%>,\
+               icons/,\
+<%if (genModel.isBundleManifest()) {%>
+               META-INF/,\
+<%}%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+               plugin.xml,\
+<%}%>
+<%String editorBundleLocalization = genModel.getEditorBundleLocalization(); int index = editorBundleLocalization.indexOf("/"); if (index == -1) {%>
+               <%=editorBundleLocalization%>.properties
+<%} else {%>
+               <%=editorBundleLocalization.substring(0, index + 1)%>
+<%}%>
+jars.compile.order = <%=pluginClassesLocation%>
+<% boolean first=true; for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) { String sourceFolder = i.next(); if (i.hasNext()){sourceFolder +=",\\";} if (first) {%>
+source.<%=pluginClassesLocation%> = <%=sourceFolder%><%first=false;} else {%><%=sourceFolder%><%}}%>
+output.<%=pluginClassesLocation%> = <%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>bin<%} else {%>war/WEB-INF/classes<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._SvVOjGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._SvVOjGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PlQjYDG0Ed-kc8dEZsdm2w/method._SvVOjGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._-K9htHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._-K9htHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..6c9a61a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._-K9htHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._0_WCeWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._0_WCeWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._0_WCeWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeUzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..b4340e9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeVzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/" + genModel.getEditorBundleLocalization()+ ".properties";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeWTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeWTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..4edacd9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._PljeWTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,114 @@
+
+<%
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+pluginName = <%=genModel.getEditorBundleName()%>
+providerName = <%=genModel.getEditorBundleVendorName()%>
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+
+<%boolean hasMultiPageEditor = false;%>
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {if (genPackage.isMultipleEditorPages()) { hasMultiPageEditor = true; }%>
+_UI_<%=genPackage.getEditorClassName()%>_menu = &<%=genPackage.getPrefix()%> Editor
+<%}%>
+
+<%if (genModel.isCreationCommands()) {%>
+_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
+<%if (hasMultiPageEditor) {%>
+_UI_ParentPage_label = Parent
+_UI_ListPage_label = List
+_UI_TreePage_label = Tree
+_UI_TablePage_label = Table
+_UI_TreeWithColumnsPage_label = Tree with Columns
+_UI_ObjectColumn_label = Object
+_UI_SelfColumn_label = Self
+<%}%>
+
+_UI_NoObjectSelected = Selected Nothing
+_UI_SingleObjectSelected = Selected Object: {0}
+_UI_MultiObjectSelected = Selected {0} Objects
+
+_UI_OpenEditorError_label = Open Editor
+
+_UI_Wizard_category = Example EMF Model Creation Wizards
+
+_UI_CreateModelError_message = Problems encountered in file "{0}"
+
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.isGenerateModelWizard()) {%>
+_UI_<%=genPackage.getModelWizardClassName()%>_label = <%=genPackage.getPrefix()%> Model
+_UI_<%=genPackage.getModelWizardClassName()%>_description = Create a new <%=genPackage.getPrefix()%> model
+
+  <%}%>
+_UI_<%=genPackage.getEditorClassName()%>_label = <%=genPackage.getPrefix()%> Model Editor
+
+_UI_<%=genPackage.getEditorClassName()%>FilenameDefaultBase = My
+_UI_<%=genPackage.getEditorClassName()%>FilenameExtensions = <%=genPackage.getFileExtensions()%>
+
+<%}%>
+_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 = <%=genModel.getXMLEncodingChoices()%>
+<%if (genModel.isRichClientPlatform()) {%>
+_UI_Wizard_initial_object_description = Specify a file name and select a model object to create
+<%} else {%>
+_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?
+
+<%if (genModel.isRichClientPlatform()) {%>
+_UI_<%=genModel.getEditorAdvisorClassName()%>_ActionSet_label = <%=genModel.getModelName()%> Action Set
+_UI_Perspective_label = <%=genModel.getModelName()%>
+
+_UI_Browse_label = &Browse...
+_UI_File_label = &File
+_UI_Question_title = Question
+_WARN_FileConflict = The file "{0}" already exists.  Do you want to replace the existing file?
+_UI_Error_title = Error
+_WARN_No_Editor = There is no editor registered for the file "{0}".
+
+_UI_Application_title = <%=genModel.getModelName()%> Application
+_UI_Menu_File_label = &File
+_UI_Menu_New_label = &New
+_UI_Menu_Open_label = &Open...
+_UI_Menu_Open_description = Opens a model object file
+_UI_Menu_OpenURI_label = &Open URI...
+_UI_Menu_OpenURI_description = Opens a model object loading it from a URI
+_UI_Menu_Edit_label = &Edit
+_UI_Menu_Window_label = &Window
+_UI_Menu_Help_label = &Help
+_UI_Menu_About_label = <%=genModel.getModelName()%> &About...
+_UI_About_title = <%=genModel.getModelName()%> Application
+_UI_About_text = <%=genModel.getModelName()%> Application about box goes here.
+
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {if (genPackage.isGenerateModelWizard()) {%>
+_UI_<%=genPackage.getModelWizardClassName()%>_ActionSet_label = <%=genPackage.getPrefix()%> Model Action Set
+<%}}%>
+
+<%}%>
+<%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._Svx6eGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._Svx6eGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PljeUDG0Ed-kc8dEZsdm2w/method._Svx6eGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._-VjBFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._-VjBFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..ceedea9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._-VjBFHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genPackage.hasConcreteClasses() && genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._1AFpWWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._1AFpWWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._1AFpWWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..b0570ce
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getEditorDirectory();
+packageName = genPackage.getPresentationPackageName();
+className = genPackage.getActionBarContributorClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..6b7c408
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._Pl2ZQjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,732 @@
+
+<%
+/**
+ * Copyright (c) 2002-2007 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%
+String _CollectionOfAnything = null;
+String _CollectionOfIAction = null;
+String _ArrayListOfIAction = null;
+String _CollectionOfExtendsIAction = null;
+String _IteratorOfIAction = null;
+String _MapOfStringToCollectionOfIAction = null;
+String _MapEntryOfStringToCollectionOfIAction = null;
+String _LinkedHashMapOfStringToCollectionOfIAction = null;
+if (genModel.isCreationCommands())
+{
+  _CollectionOfAnything = genModel.getImportedName("Collection" + (genModel.useGenerics() ? "<?>" : ""));
+  _CollectionOfIAction = genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<org.eclipse.jface.action.IAction>" : "java.util.Collection");
+  _ArrayListOfIAction = genModel.getImportedName(genModel.useGenerics() ? "java.util.ArrayList<org.eclipse.jface.action.IAction>" : "java.util.ArrayList");
+  _CollectionOfExtendsIAction = genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<? extends org.eclipse.jface.action.IAction>" : "java.util.Collection");
+  if (genModel.isCreationSubmenus())
+  {
+    _IteratorOfIAction = genModel.getImportedName(genModel.useGenerics() ? "java.util.Iterator<org.eclipse.jface.action.IAction>" : "java.util.Iterator");
+    _MapOfStringToCollectionOfIAction = genModel.getImportedName("java.util.Map") + (genModel.useGenerics() ? ("<String, " + _CollectionOfIAction + ">") : "");
+    _MapEntryOfStringToCollectionOfIAction = genModel.getImportedName("java.util.Map") + ".Entry" + (genModel.useGenerics() ? ("<String, " + _CollectionOfIAction + ">") : "");
+    _LinkedHashMapOfStringToCollectionOfIAction = genModel.getImportedName("java.util.LinkedHashMap") + (genModel.useGenerics() ? ("<String, " + _CollectionOfIAction + ">") : "");
+  }
+}
+%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getPresentationPackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This is the action bar contributor for the <%=genPackage.getPrefix()%> model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public class <%=genPackage.getActionBarContributorClassName()%>
+	extends <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor")%>
+	implements <%=genModel.getImportedName("org.eclipse.jface.viewers.ISelectionChangedListener")%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final String copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (genModel.isRichClientPlatform() && genPackage.isGenerateModelWizard()) {%>
+	/**
+	 * Action to create objects from the <%=genPackage.getPrefix()%> model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class NewAction extends <%=genModel.getImportedName("org.eclipse.emf.common.ui.action.WorkbenchWindowActionDelegate")%>
+	{
+		/**
+		 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		public void run(<%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> action)
+		{
+			<%=genPackage.getModelWizardClassName()%> wizard = new <%=genPackage.getModelWizardClassName()%>();
+			wizard.init(getWindow().getWorkbench(), <%=genModel.getImportedName("org.eclipse.jface.viewers.StructuredSelection")%>.EMPTY);
+			<%=genModel.getImportedName("org.eclipse.jface.wizard.WizardDialog")%> wizardDialog = new <%=genModel.getImportedName("org.eclipse.jface.wizard.WizardDialog")%>(getWindow().getShell(), wizard);
+			wizardDialog.open();
+		}
+	}
+
+<%}%>
+	/**
+	 * This keeps track of the active editor.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.ui.IEditorPart")%> activeEditorPart;
+
+	/**
+	 * This keeps track of the current selection provider.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.jface.viewers.ISelectionProvider")%> selectionProvider;
+
+	/**
+	 * This action opens the Properties view.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> showPropertiesViewAction =
+		new <%=genModel.getImportedName("org.eclipse.jface.action.Action")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_ShowPropertiesView_menu_item"))<%=genModel.getNonNLS()%>
+		{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void run()
+			{
+				try
+				{
+					getPage().showView("org.eclipse.ui.views.PropertySheet");<%=genModel.getNonNLS()%>
+				}
+				catch (<%=genModel.getImportedName("org.eclipse.ui.PartInitException")%> exception)
+				{
+					<%=genPackage.getImportedEditorPluginClassName()%>.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 <%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> refreshViewerAction =
+		new <%=genModel.getImportedName("org.eclipse.jface.action.Action")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_RefreshViewer_menu_item"))<%=genModel.getNonNLS()%>
+		{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public boolean isEnabled()
+			{
+				return activeEditorPart instanceof <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.IViewerProvider")%>;
+			}
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void run()
+			{
+				if (activeEditorPart instanceof <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.IViewerProvider")%>)
+				{
+					<%=genModel.getImportedName("org.eclipse.jface.viewers.Viewer")%> viewer = ((<%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.IViewerProvider")%>)activeEditorPart).getViewer();
+					if (viewer != null)
+					{
+						viewer.refresh();
+					}
+				}
+			}
+		};
+
+<%if (genModel.isCreationCommands()) {%>
+	/**
+	 * 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 <%=_CollectionOfIAction%> createChildActions;
+
+  <%if (genModel.isCreationSubmenus()) {%>
+	/**
+	 * This will contain a map of {@link org.eclipse.emf.edit.ui.action.CreateChildAction}s, keyed by sub-menu text.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_MapOfStringToCollectionOfIAction%> createChildSubmenuActions;
+
+  <%}%>
+	/**
+	 * This is the menu manager into which menu contribution items should be added for CreateChild actions.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.jface.action.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 <%=_CollectionOfIAction%> createSiblingActions;
+
+  <%if (genModel.isCreationSubmenus()) {%>
+	/**
+	 * This will contain a map of {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction}s, keyed by submenu text.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_MapOfStringToCollectionOfIAction%> createSiblingSubmenuActions;
+
+  <%}%>
+	/**
+	 * This is the menu manager into which menu contribution items should be added for CreateSibling actions.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.getImportedName("org.eclipse.jface.action.IMenuManager")%> createSiblingMenuManager;
+
+<%}%>
+	/**
+	 * This creates an instance of the contributor.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getActionBarContributorClassName()%>()
+	{
+		super(ADDITIONS_LAST_STYLE);
+		loadResourceAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.LoadResourceAction")%>();
+		validateAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.ValidateAction")%>();
+<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>
+		liveValidationAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DiagnosticDecorator")%>.LiveValidator.LiveValidationAction(<%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings());
+<%}%>
+		controlAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.ControlAction")%>();
+<%if (genModel.isFindAction()) {%>
+		findAction = <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.FindAction")%>.create();
+<%}%>
+<%if (genModel.isRevertAction()) {%>
+		revertAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.RevertAction")%>();
+<%}%>
+<%if (genModel.isExpandAllAction()) {%>
+		expandAllAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.ExpandAllAction")%>();
+<%}%>
+<%if (genModel.isCollapseAllAction()) {%>
+		collapseAllAction = new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.CollapseAllAction")%>();
+<%}%>
+	}
+
+	/**
+	 * This adds Separators for editor additions to the tool bar.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void contributeToToolBar(<%=genModel.getImportedName("org.eclipse.jface.action.IToolBarManager")%> toolBarManager)
+	{
+		super.contributeToToolBar(toolBarManager);
+		toolBarManager.add(new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("<%=genPackage.getPrefix().toLowerCase(genModel.getLocale())%>-settings"));<%=genModel.getNonNLS()%>
+		toolBarManager.add(new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("<%=genPackage.getPrefix().toLowerCase(genModel.getLocale())%>-additions"));<%=genModel.getNonNLS()%>
+	}
+
+	/**
+	 * 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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void contributeToMenu(<%=genModel.getImportedName("org.eclipse.jface.action.IMenuManager")%> menuManager)
+	{
+		super.contributeToMenu(menuManager);
+
+		<%=genModel.getImportedName("org.eclipse.jface.action.IMenuManager")%> submenuManager = new <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getEditorClassName()%>_menu"), "<%=genPackage.getInterfacePackageName()%>MenuID");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		menuManager.insertAfter("additions", submenuManager);<%=genModel.getNonNLS()%>
+		submenuManager.add(new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("settings"));<%=genModel.getNonNLS()%>
+		submenuManager.add(new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("actions"));<%=genModel.getNonNLS()%>
+		submenuManager.add(new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("additions"));<%=genModel.getNonNLS()%>
+		submenuManager.add(new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("additions-end"));<%=genModel.getNonNLS()%>
+
+<%if (genModel.isCreationCommands()) {%>
+		// Prepare for CreateChild item addition or removal.
+		//
+		createChildMenuManager = new <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_CreateChild_menu_item"));<%=genModel.getNonNLS()%>
+		submenuManager.insertBefore("additions", createChildMenuManager);<%=genModel.getNonNLS()%>
+
+		// Prepare for CreateSibling item addition or removal.
+		//
+		createSiblingMenuManager = new <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_CreateSibling_menu_item"));<%=genModel.getNonNLS()%>
+		submenuManager.insertBefore("additions", createSiblingMenuManager);<%=genModel.getNonNLS()%>
+
+		// Force an update because Eclipse hides empty menus now.
+		//
+		submenuManager.addMenuListener
+			(new <%=genModel.getImportedName("org.eclipse.jface.action.IMenuListener")%>()
+			 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				 @Override
+<%}%>
+				 public void menuAboutToShow(<%=genModel.getImportedName("org.eclipse.jface.action.IMenuManager")%> menuManager)
+				 {
+					 menuManager.updateAll(true);
+				 }
+			 });
+
+<%} else {%>
+		// Add your contributions.
+		// Ensure that you remove @generated or mark it @generated NOT
+
+<%}%>
+		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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void setActiveEditor(<%=genModel.getImportedName("org.eclipse.ui.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 <%=genModel.getImportedName("org.eclipse.jface.viewers.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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void selectionChanged(<%=genModel.getImportedName("org.eclipse.jface.viewers.SelectionChangedEvent")%> event)
+	{
+<%if (genModel.isCreationCommands()) {%>
+		// Remove any menu items for old selection.
+		//
+		if (createChildMenuManager != null)
+		{
+  <%if (genModel.isCreationSubmenus()) {%>
+			depopulateManager(createChildMenuManager, createChildSubmenuActions);
+  <%}%>
+			depopulateManager(createChildMenuManager, createChildActions);
+		}
+		if (createSiblingMenuManager != null)
+		{
+  <%if (genModel.isCreationSubmenus()) {%>
+			depopulateManager(createSiblingMenuManager, createSiblingSubmenuActions);
+  <%}%>
+			depopulateManager(createSiblingMenuManager, createSiblingActions);
+		}
+
+		// Query the new selection for appropriate new child/sibling descriptors
+		//
+		<%=_CollectionOfAnything%> newChildDescriptors = null;
+		<%=_CollectionOfAnything%> newSiblingDescriptors = null;
+
+		<%=genModel.getImportedName("org.eclipse.jface.viewers.ISelection")%> selection = event.getSelection();
+		if (selection instanceof <%=genModel.getImportedName("org.eclipse.jface.viewers.IStructuredSelection")%> && ((IStructuredSelection)selection).size() == 1)
+		{
+			Object object = ((<%=genModel.getImportedName("org.eclipse.jface.viewers.IStructuredSelection")%>)selection).getFirstElement();
+
+			<%=genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain")%> domain = ((<%=genModel.getImportedName("org.eclipse.emf.edit.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);
+  <%if (genModel.isCreationSubmenus()) {%>
+		createChildSubmenuActions = extractSubmenuActions(createChildActions);
+  <%}%>
+		createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
+  <%if (genModel.isCreationSubmenus()) {%>
+		createSiblingSubmenuActions = extractSubmenuActions(createSiblingActions);
+  <%}%>
+
+		if (createChildMenuManager != null)
+		{
+  <%if (genModel.isCreationSubmenus()) {%>
+			populateManager(createChildMenuManager, createChildSubmenuActions, null);
+  <%}%>
+			populateManager(createChildMenuManager, createChildActions, null);
+			createChildMenuManager.update(true);
+		}
+		if (createSiblingMenuManager != null)
+		{
+  <%if (genModel.isCreationSubmenus()) {%>
+			populateManager(createSiblingMenuManager, createSiblingSubmenuActions, null);
+  <%}%>
+			populateManager(createSiblingMenuManager, createSiblingActions, null);
+			createSiblingMenuManager.update(true);
+		}
+<%} else {%>
+		// Add your contributions.
+		// Ensure that you remove @generated or mark it @generated NOT
+<%}%>
+	}
+
+<%if (genModel.isCreationCommands()) {%>
+	/**
+	 * 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 <%=_CollectionOfIAction%> generateCreateChildActions(<%=_CollectionOfAnything%> descriptors, <%=genModel.getImportedName("org.eclipse.jface.viewers.ISelection")%> selection)
+	{
+		<%=_CollectionOfIAction%> actions = new <%=_ArrayListOfIAction%>();
+		if (descriptors != null)
+		{
+<%if (genModel.useGenerics()) {%>
+			for (<%=genModel.getImportedName("java.lang.Object")%> descriptor : descriptors)
+<%} else {%>
+			for (<%=genModel.getImportedName("java.util.Iterator")%> i = descriptors.iterator(); i.hasNext(); )
+<%}%>
+			{
+				actions.add(new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.CreateChildAction")%>(activeEditorPart, selection, <%if (genModel.useGenerics()) {%>descriptor<%} else {%>i.next()<%}%>));
+			}
+		}
+		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 <%=_CollectionOfIAction%> generateCreateSiblingActions(<%=_CollectionOfAnything%> descriptors, <%=genModel.getImportedName("org.eclipse.jface.viewers.ISelection")%> selection)
+	{
+		<%=_CollectionOfIAction%> actions = new <%=_ArrayListOfIAction%>();
+		if (descriptors != null)
+		{
+<%if (genModel.useGenerics()) {%>
+			for (<%=genModel.getImportedName("java.lang.Object")%> descriptor : descriptors)
+<%} else {%>
+			for (<%=genModel.getImportedName("java.util.Iterator")%> i = descriptors.iterator(); i.hasNext(); )
+<%}%>
+			{
+				actions.add(new <%=genModel.getImportedName("org.eclipse.emf.edit.ui.action.CreateSiblingAction")%>(activeEditorPart, selection, <%if (genModel.useGenerics()) {%>descriptor<%} else {%>i.next()<%}%>));
+			}
+		}
+		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(<%=genModel.getImportedName("org.eclipse.jface.action.IContributionManager")%> manager, <%=_CollectionOfExtendsIAction%> actions, String contributionID)
+	{
+		if (actions != null)
+		{
+<%if (genModel.useGenerics()) {%>
+			for (<%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> action : actions)
+<%} else {%>
+			for (<%=genModel.getImportedName("java.util.Iterator")%> i = actions.iterator(); i.hasNext(); )
+<%}%>
+			{
+<%if (!genModel.useGenerics()) {%>
+				<%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> action = (IAction)i.next();
+<%}%>
+				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(<%=genModel.getImportedName("org.eclipse.jface.action.IContributionManager")%> manager, <%=_CollectionOfExtendsIAction%> actions)
+	{
+		if (actions != null)
+		{
+			<%=genModel.getImportedName("org.eclipse.jface.action.IContributionItem")%>[] items = manager.getItems();
+			for (int i = 0; i < items.length; i++)
+			{
+				// Look into SubContributionItems
+				//
+				<%=genModel.getImportedName("org.eclipse.jface.action.IContributionItem")%> contributionItem = items[i];
+				while (contributionItem instanceof <%=genModel.getImportedName("org.eclipse.jface.action.SubContributionItem")%>)
+				{
+					contributionItem = ((<%=genModel.getImportedName("org.eclipse.jface.action.SubContributionItem")%>)contributionItem).getInnerItem();
+				}
+
+				// Delete the ActionContributionItems with matching action.
+				//
+				if (contributionItem instanceof <%=genModel.getImportedName("org.eclipse.jface.action.ActionContributionItem")%>)
+				{
+					<%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> action = ((<%=genModel.getImportedName("org.eclipse.jface.action.ActionContributionItem")%>)contributionItem).getAction();
+					if (actions.contains(action))
+					{
+						manager.remove(contributionItem);
+					}
+				}
+			}
+		}
+	}
+
+  <%if (genModel.isCreationSubmenus()) {%>
+	/**
+	 * This extracts those actions in the <code>submenuActions</code> collection whose text is qualified and returns
+	 * a map of these actions, keyed by submenu text.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_MapOfStringToCollectionOfIAction%> extractSubmenuActions(<%=_CollectionOfIAction%> createActions)
+	{
+		<%=_MapOfStringToCollectionOfIAction%> createSubmenuActions = new <%=_LinkedHashMapOfStringToCollectionOfIAction%>();
+		if (createActions != null)
+		{
+			for (<%=_IteratorOfIAction%> actions = createActions.iterator(); actions.hasNext(); )
+			{
+				<%=genModel.getImportedName("org.eclipse.jface.action.IAction")%> action = <%if (!genModel.useGenerics()) {%>(<%=genModel.getImportedName("org.eclipse.jface.action.IAction")%>)<%}%>actions.next();
+				<%=genModel.getImportedName("java.util.StringTokenizer")%> st = new <%=genModel.getImportedName("java.util.StringTokenizer")%>(action.getText(), "|");<%=genModel.getNonNLS()%>
+				if (st.countTokens() == 2)
+				{
+					String text = st.nextToken().trim();
+					<%=_CollectionOfIAction%> submenuActions = <%if (!genModel.useGenerics()) {%>(<%=_CollectionOfIAction%>)<%}%>createSubmenuActions.get(text);
+					if (submenuActions == null)
+					{
+						createSubmenuActions.put(text, submenuActions = new <%=_ArrayListOfIAction%>());
+					}
+					action.setText(st.nextToken().trim());
+					submenuActions.add(action);
+					actions.remove();
+				}
+			}
+		}
+		return createSubmenuActions;
+	}
+
+	/**
+	 * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.MenuManager}s containing
+	 * {@link org.eclipse.jface.action.ActionContributionItem}s based on the {@link org.eclipse.jface.action.IAction}s
+	 * contained in the <code>submenuActions</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(<%=genModel.getImportedName("org.eclipse.jface.action.IContributionManager")%> manager, <%=_MapOfStringToCollectionOfIAction%> submenuActions, String contributionID)
+	{
+		if (submenuActions != null)
+		{
+    <%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {%>
+			for (<%=_MapEntryOfStringToCollectionOfIAction%> entry : submenuActions.entrySet())
+			{
+    <%} else {%>
+			for (<%=genModel.getImportedName("java.util.Iterator")%> entries = submenuActions.entrySet().iterator(); entries.hasNext();)
+			{
+				<%=_MapEntryOfStringToCollectionOfIAction%> entry = (<%=_MapEntryOfStringToCollectionOfIAction%>)entries.next();
+    <%}%>
+				<%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%> submenuManager = new <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>(<%if (!genModel.useGenerics()) {%>(String)<%}%>entry.getKey());
+				if (contributionID != null)
+				{
+					manager.insertBefore(contributionID, submenuManager);
+				}
+				else
+				{
+					manager.add(submenuManager);
+				}
+				populateManager(submenuManager, <%if (!genModel.useGenerics()) {%>(<%=_CollectionOfIAction%>)<%}%>entry.getValue(), null);
+			}
+		}
+	}
+
+	/**
+	 * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.MenuManager}s and their
+	 * {@link org.eclipse.jface.action.ActionContributionItem}s based on the {@link org.eclipse.jface.action.IAction}s
+	 * contained in the <code>submenuActions</code> map.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void depopulateManager(<%=genModel.getImportedName("org.eclipse.jface.action.IContributionManager")%> manager, <%=_MapOfStringToCollectionOfIAction%> submenuActions)
+	{
+		if (submenuActions != null)
+		{
+			<%=genModel.getImportedName("org.eclipse.jface.action.IContributionItem")%>[] items = manager.getItems();
+			for (int i = 0; i < items.length; i++)
+			{
+				<%=genModel.getImportedName("org.eclipse.jface.action.IContributionItem")%> contributionItem = items[i];
+				if (contributionItem instanceof <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>)
+				{
+					<%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%> submenuManager = (<%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>)contributionItem;
+					if (submenuActions.containsKey(submenuManager.getMenuText()))
+					{
+						depopulateManager(submenuManager, <%if (!genModel.useGenerics()) {%>(<%=_CollectionOfIAction%>)<%}%>submenuActions.get(submenuManager.getMenuText()));
+						manager.remove(contributionItem);
+					}
+				}
+			}
+		}
+	}
+
+  <%}%>
+<%}%>
+	/**
+	 * This populates the pop-up menu before it appears.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void menuAboutToShow(<%=genModel.getImportedName("org.eclipse.jface.action.IMenuManager")%> menuManager)
+	{
+		super.menuAboutToShow(menuManager);
+<%if (genModel.isCreationCommands()) {%>
+		<%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%> submenuManager = null;
+
+		submenuManager = new <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_CreateChild_menu_item"));<%=genModel.getNonNLS()%>
+  <%if (genModel.isCreationSubmenus()) {%>
+		populateManager(submenuManager, createChildSubmenuActions, null);
+  <%}%>
+		populateManager(submenuManager, createChildActions, null);
+		menuManager.insertBefore("edit", submenuManager);<%=genModel.getNonNLS()%>
+
+		submenuManager = new <%=genModel.getImportedName("org.eclipse.jface.action.MenuManager")%>(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_CreateSibling_menu_item"));<%=genModel.getNonNLS()%>
+  <%if (genModel.isCreationSubmenus()) {%>
+		populateManager(submenuManager, createSiblingSubmenuActions, null);
+  <%}%>
+		populateManager(submenuManager, createSiblingActions, null);
+		menuManager.insertBefore("edit", submenuManager);<%=genModel.getNonNLS()%>
+<%}%>
+	}
+
+	/**
+	 * This inserts global actions before the "additions-end" separator.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected void addGlobalActions(<%=genModel.getImportedName("org.eclipse.jface.action.IMenuManager")%> menuManager)
+	{
+		menuManager.insertAfter("additions-end", new <%=genModel.getImportedName("org.eclipse.jface.action.Separator")%>("ui-actions"));<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		menuManager.insertAfter("ui-actions", showPropertiesViewAction);<%=genModel.getNonNLS()%>
+
+		refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());		
+		menuManager.insertAfter("ui-actions", refreshViewerAction);<%=genModel.getNonNLS()%>
+
+		super.addGlobalActions(menuManager);
+	}
+
+	/**
+	 * This ensures that a delete action will clean up all references to deleted objects.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected boolean removeAllReferencesOnDelete()
+	{
+		return true;
+	}
+
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPUzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPVTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPVTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._PltPVTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._SwhhWGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._SwhhWGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PltPUDG0Ed-kc8dEZsdm2w/method._SwhhWGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._-SaNhHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._-SaNhHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..ceedea9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._-SaNhHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genPackage.hasConcreteClasses() && genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._1APaWWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._1APaWWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._1APaWWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAITG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAITG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAITG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAIzG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..3763527
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getEditorDirectory();
+packageName = genPackage.getPresentationPackageName();
+className = genPackage.getEditorClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..fa0a2bd
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._PmmAJzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,2677 @@
+
+<%
+/**
+ * Copyright (c) 2002-2019 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Alexander Fedorov <alexander.fedorov@arsysop.ru> - Bug 546714
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName(); %>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%final boolean forceDefaultCase = genModel.isSwitchMissingDefaultCase();%>
+<%String importedOperationClassName = genModel.getImportedName(genModel.isRichClientPlatform() ? "org.eclipse.jface.operation.IRunnableWithProgress" : "org.eclipse.ui.actions.WorkspaceModifyOperation");%>
+<%String operationMethodName = genModel.isRichClientPlatform() ? "run" : "execute";%>
+<%String _ArrayListOfObject = "ArrayList" + (genModel.useGenerics() ? "<Object>" : "");%>
+<%String _ArrayListOfSelectionChangedListener = "ArrayList" + (genModel.useGenerics() ? "<ISelectionChangedListener>" : "");%>
+<%String _CollectionOfSelectionChangedListener = "Collection" + (genModel.useGenerics() ? "<ISelectionChangedListener>" : "");%>
+<%String _ListOfResource = "List" + (genModel.useGenerics() ? "<Resource>" : "");%>
+<%String _ArrayListOfResource = "ArrayList" + (genModel.useGenerics() ? "<Resource>" : "");%>
+<%String _CollectionOfResource = "Collection" + (genModel.useGenerics() ? "<Resource>" : "");%>
+<%String _MapOfResourceToDiagnostic = "Map" + (genModel.useGenerics() ? "<Resource, Diagnostic>" : "");%>
+<%String _HashMapOfResourceToBoolean = "HashMap" + (genModel.useGenerics() ? "<Resource, Boolean>" : "");%>
+<%String _MapOfObjectToObject = "Map" + (genModel.useGenerics() ? "<Object, Object>" : "");%>
+<%String _HashMapOfObjectToObject = "HashMap" + (genModel.useGenerics() ? "<Object, Object>" : "");%>
+<%String _LinkedHashMapOfResourceToDiagnostic = "LinkedHashMap" + (genModel.useGenerics() ? "<Resource, Diagnostic>" : "");%>
+<%String _CollectionOfAnything = "Collection" + (genModel.useGenerics() ? "<?>" : "");%>
+<%String _ListOfAnything = "List" + (genModel.useGenerics() ? "<?>" : "");%>
+<%boolean useExtendedLabelProvider = genModel.isStyleProviders() || genModel.isFontProviders() || genModel.isColorProviders();%>
+<%boolean useStyledLabelProvider = genModel.isStyleProviders();%>
+<%String _AdapterFactoryLabelProvider = (useStyledLabelProvider ? "AdapterFactoryLabelProvider.StyledLabelProvider" : "AdapterFactoryLabelProvider" + (genModel.isFontProviders() && genModel.isColorProviders() ? ".FontAndColorProvider" : genModel.isFontProviders() ? ".FontProvider" : genModel.isColorProviders() ? ".ColorProvider" : ""));%>
+<%String _DelegatingAdapterFactoryLabelProvider = useStyledLabelProvider ? genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DelegatingStyledCellLabelProvider") + (genModel.isFontProviders() && genModel.isColorProviders() ? ".FontAndColorProvider" : genModel.isFontProviders() ? ".FontProvider" : genModel.isColorProviders() ? ".ColorProvider" : "") : "";%>
+<%String _DecoratingColumLabelProvider = genModel.getDecoration() != GenDecoration.NONE ? genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider") + (useStyledLabelProvider ? ".StyledLabelProvider" : "") : "";%>
+<%String _DiagnosticDecorator = genModel.getDecoration() != GenDecoration.NONE ? genModel.getImportedName("org.eclipse.emf.edit.ui.provider.DiagnosticDecorator") + (useStyledLabelProvider ? ".Styled" : "") : "";%>
+<%String _ArrayListOfString = "ArrayList" + (genModel.useGenerics() ? "<String>" : "");%>
+<%String _ListOfString = "List" + (genModel.useGenerics() ? "<String>" : "");%>
+<%String _ListOfPropertySheetPage = "List" + (genModel.useGenerics() ? "<PropertySheetPage>" : "");%>
+<%String _ArrayListOfPropertySheetPage = "ArrayList" + (genModel.useGenerics() ? "<PropertySheetPage>" : "");%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getPresentationPackageName()%>;
+
+
+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;
+<%if (!genModel.isRichClientPlatform()) {%>
+
+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;
+<%}%>
+
+<%if (!genModel.isRichClientPlatform()) {%>
+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.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;
+
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {%>
+import org.eclipse.jface.util.LocalSelectionTransfer;
+
+<%}%>
+<%if (genPackage.isMultipleEditorPages()) {%>
+import org.eclipse.jface.viewers.ColumnWeightData;
+<%}%>
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+<%if (genPackage.isMultipleEditorPages()) {%>
+import org.eclipse.jface.viewers.ListViewer;
+<%}%>
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+<%if (genPackage.isMultipleEditorPages()) {%>
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+<%}%>
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+import org.eclipse.swt.SWT;
+
+import org.eclipse.swt.custom.CTabFolder;
+
+import org.eclipse.swt.dnd.DND;
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {%>
+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;
+<%if (genPackage.isMultipleEditorPages()) {%>
+
+import org.eclipse.swt.layout.FillLayout;
+<%}%>
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+<%if (genPackage.isMultipleEditorPages()) {%>
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+<%}%>
+import org.eclipse.swt.widgets.Tree;
+<%if (genPackage.isMultipleEditorPages()) {%>
+import org.eclipse.swt.widgets.TreeColumn;
+<%}%>
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+<%if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() < GenJDKLevel.JDK50) {%>
+import org.eclipse.ui.IFileEditorInput;
+<%}%>
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+<%if (!genModel.isRichClientPlatform()) {%>
+
+import org.eclipse.ui.dialogs.SaveAsDialog;
+
+import org.eclipse.ui.ide.IGotoMarker;
+<%}%>
+
+<%if (!genModel.isRichClientPlatform()) {%>
+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;
+
+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;
+
+<%if (!genModel.isRichClientPlatform()) {%>
+import org.eclipse.emf.common.ui.MarkerHelper;
+<%}%>
+<%if (genPackage.isMultipleEditorPages()) {%>
+import org.eclipse.emf.common.ui.ViewerPane;
+<%}%>
+
+import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
+
+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;
+
+<%if (!genModel.isRichClientPlatform() && genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF23_VALUE) {%>
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EValidator;
+<%}%>
+
+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;
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {%>
+import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
+<%}%>
+<%if (!genModel.isRichClientPlatform()) {%>
+
+import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
+<%}%>
+<%if (genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {%>
+import org.eclipse.emf.edit.ui.util.EditUIUtil;
+<%}%>
+
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
+
+import <%=genPackage.getQualifiedItemProviderAdapterFactoryClassName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+
+/**
+ * This is an example of a <%=genPackage.getPrefix()%> model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public class <%=genPackage.getEditorClassName()%>
+	extends MultiPageEditorPart
+	implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider<%if (!genModel.isRichClientPlatform()) {%>, IGotoMarker<%}%><%if (genModel.isRevertAction()) {%>, <%=genModel.getImportedName("org.eclipse.emf.edit.ui.util.IRevertablePart")%><%}%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (genModel.isRichClientPlatform()) {%>
+	/**
+	 * The filters for file extensions supported by the editor.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */<%if (genPackage.isGenerateModelWizard()) {%>
+	public static final <%=_ListOfString%> FILE_EXTENSION_FILTERS = prefixExtensions(<%=genPackage.getImportedModelWizardClassName()%>.FILE_EXTENSIONS, "*.");<%=genModel.getNonNLS()%>
+	<%} else {%>
+	public static final <%=_ListOfString%> FILE_EXTENSION_FILTERS = prefixExtensions(<%=genModel.getImportedName("java.util.Arrays")%>.asList(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getEditorClassName()%>FilenameExtensions").split("\\s*,\\s*")), "*.");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+	<%}%>
+	/**
+	 * Returns a new unmodifiable list containing prefixed versions of the extensions in the given list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static <%=_ListOfString%> prefixExtensions(<%=_ListOfString%> extensions, String prefix)
+	{
+		<%=_ListOfString%> result = new <%=_ArrayListOfString%>();
+  <%if (genModel.useGenerics()) {%>
+		for (String extension : extensions)
+		{
+			result.add(prefix + extension);
+  <%} else {%>
+		for (Iterator iterator = extensions.iterator() ; iterator.hasNext(); )
+		{
+			result.add(prefix + (String)iterator.next());
+  <%}%>
+		}
+		return Collections.unmodifiableList(result);
+	}
+
+<%}%>
+	/**
+	 * 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 <%=_ListOfPropertySheetPage%> propertySheetPages = new <%=_ArrayListOfPropertySheetPage%>();
+
+	/**
+	 * 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;
+<%if (genPackage.isMultipleEditorPages()) {%>
+
+	/**
+	 * This inverts the roll of parent and child in the content provider and show parents as a tree.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TreeViewer parentViewer;
+
+	/**
+	 * This shows how a tree view works.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TreeViewer treeViewer;
+
+	/**
+	 * This shows how a list view works.
+	 * A list viewer doesn't support icons.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ListViewer listViewer;
+
+	/**
+	 * This shows how a table view works.
+	 * A table can be used as a list with icons.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TableViewer tableViewer;
+
+	/**
+	 * This shows how a tree view with columns works.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TreeViewer treeViewerWithColumns;
+
+	/**
+	 * This keeps track of the active viewer pane, in the book.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ViewerPane currentViewerPane;
+<%}%>
+
+	/**
+	 * 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 <%=_CollectionOfSelectionChangedListener%> selectionChangedListeners = new <%=_ArrayListOfSelectionChangedListener%>();
+
+	/**
+	 * This keeps track of the selection of the editor as a whole.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ISelection editorSelection = StructuredSelection.EMPTY;
+
+<%if (!genModel.isRichClientPlatform()) {%>
+	/**
+	 * 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()
+		{
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void partActivated(IWorkbenchPart p)
+			{
+				if (p instanceof ContentOutline)
+				{
+					if (((ContentOutline)p).getCurrentPage() == contentOutlinePage)
+					{
+						getActionBarContributor().setActiveEditor(<%=genPackage.getEditorClassName()%>.this);
+
+						setCurrentViewer(contentOutlineViewer);
+					}
+				}
+				else if (p instanceof PropertySheet)
+				{
+					if (propertySheetPages.contains(((PropertySheet)p).getCurrentPage()))
+					{
+						getActionBarContributor().setActiveEditor(<%=genPackage.getEditorClassName()%>.this);
+						handleActivate();
+					}
+				}
+				else if (p == <%=genPackage.getEditorClassName()%>.this)
+				{
+					handleActivate();
+				}
+			}
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void partBroughtToTop(IWorkbenchPart p)
+			{
+				// Ignore.
+			}
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void partClosed(IWorkbenchPart p)
+			{
+				// Ignore.
+			}
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void partDeactivated(IWorkbenchPart p)
+			{
+				// Ignore.
+			}
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void partOpened(IWorkbenchPart p)
+			{
+				// Ignore.
+			}
+		};
+
+	/**
+	 * Resources that have been removed since last activation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_CollectionOfResource%> removedResources = new <%=_ArrayListOfResource%>();
+
+	/**
+	 * Resources that have been changed since last activation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_CollectionOfResource%> changedResources = new <%=_ArrayListOfResource%>();
+
+	/**
+	 * Resources that have been saved.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_CollectionOfResource%> savedResources = new <%=_ArrayListOfResource%>();
+
+	/**
+	 * Map to store the diagnostic associated with a resource.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_MapOfResourceToDiagnostic%> resourceToDiagnosticMap = new <%=_LinkedHashMapOfResourceToDiagnostic%>();
+
+	/**
+	 * 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;
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@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;
+						}
+<%if (forceDefaultCase) {%>
+						default:
+							break;
+<%}%>
+					}
+				}
+				else
+				{
+					super.notifyChanged(notification);
+				}
+			}
+
+			protected void dispatchUpdateProblemIndication()
+			{
+				if (updateProblemIndication && !dispatching)
+				{
+					dispatching = true;
+					getSite().getShell().getDisplay().asyncExec
+						(new Runnable()
+						 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+							 @Override
+<%}%>
+							 public void run()
+							 {
+								 dispatching = false;
+								 updateProblemIndication();
+							 }
+						 });
+				}
+			}
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			protected void setTarget(Resource target)
+			{
+				basicSetTarget(target);
+			}
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			protected void unsetTarget(Resource target)
+			{
+				basicUnsetTarget(target);
+				resourceToDiagnosticMap.remove(target);
+				dispatchUpdateProblemIndication();
+			}
+		};
+<%if (!genModel.isRichClientPlatform()) {%>
+
+	/**
+	 * This listens for workspace changes.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IResourceChangeListener resourceChangeListener =
+		new IResourceChangeListener()
+		{
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+			@Override
+<%}%>
+			public void resourceChanged(IResourceChangeEvent event)
+			{
+				IResourceDelta delta = event.getDelta();
+				try
+				{
+					class ResourceDeltaVisitor implements IResourceDeltaVisitor
+					{
+						protected ResourceSet resourceSet = editingDomain.getResourceSet();
+						protected <%=_CollectionOfResource%> changedResources = new <%=_ArrayListOfResource%>();
+						protected <%=_CollectionOfResource%> removedResources = new <%=_ArrayListOfResource%>();
+
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public boolean visit(<%if (genModel.getDecoration() != GenDecoration.NONE) {%>final <%}%>IResourceDelta delta)
+						{
+							if (delta.getResource().getType() == IResource.FILE)
+							{
+								if (delta.getKind() == IResourceDelta.REMOVED ||
+								    delta.getKind() == IResourceDelta.CHANGED<%if (genModel.getDecoration() == GenDecoration.NONE) {%> && delta.getFlags() != IResourceDelta.MARKERS<%}%>)
+								{
+									<%if (genModel.getDecoration() != GenDecoration.NONE) {%>final <%}%>Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);
+									if (resource != null)
+									{
+										if (delta.getKind() == IResourceDelta.REMOVED)
+										{
+											removedResources.add(resource);
+										}
+<%if (genModel.getDecoration() == GenDecoration.NONE) {%>
+										else if (!savedResources.remove(resource))
+										{
+											changedResources.add(resource);
+										}
+<%} else {%>
+										else
+										{
+											if ((delta.getFlags() & IResourceDelta.MARKERS) != 0)
+											{
+												<%=_DiagnosticDecorator%>.DiagnosticAdapter.update(resource, markerHelper.getMarkerDiagnostics(resource, (IFile)delta.getResource()<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF211_VALUE) {%>, false<%}%>));
+											}
+											if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
+											{
+												if (!savedResources.remove(resource))
+												{
+													changedResources.add(resource);
+												}
+											}
+										}
+<%}%>
+									}
+								}
+								return false;
+							}
+
+							return true;
+						}
+
+						public <%=_CollectionOfResource%> getChangedResources()
+						{
+							return changedResources;
+						}
+
+						public <%=_CollectionOfResource%> getRemovedResources()
+						{
+							return removedResources;
+						}
+					}
+
+					final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+					delta.accept(visitor);
+
+					if (!visitor.getRemovedResources().isEmpty())
+					{
+						getSite().getShell().getDisplay().asyncExec
+							(new Runnable()
+							 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+								 @Override
+<%}%>
+								 public void run()
+								 {
+									 removedResources.addAll(visitor.getRemovedResources());
+									 if (!isDirty())
+									 {
+										 getSite().getPage().closeEditor(<%=genPackage.getEditorClassName()%>.this, false);
+									 }
+								 }
+							 });
+					}
+
+					if (!visitor.getChangedResources().isEmpty())
+					{
+						getSite().getShell().getDisplay().asyncExec
+							(new Runnable()
+							 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+								 @Override
+<%}%>
+								 public void run()
+								 {
+									 changedResources.addAll(visitor.getChangedResources());
+									 if (getSite().getPage().getActiveEditor() == <%=genPackage.getEditorClassName()%>.this)
+									 {
+										 handleActivate();
+									 }
+								 }
+							 });
+					}
+				}
+				catch (CoreException exception)
+				{
+					<%=genPackage.getImportedEditorPluginClassName()%>.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(<%=genPackage.getEditorClassName()%>.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;
+<%if (genModel.useGenerics()) {%>
+			for (Resource resource : changedResources)
+<%} else {%>
+			for (Iterator i = changedResources.iterator(); i.hasNext(); )
+<%}%>
+			{
+<%if (!genModel.useGenerics()) {%>
+				Resource resource = (Resource)i.next();
+<%}%>
+				if (resource.isLoaded())
+				{
+					resource.unload();
+					try
+					{
+						resource.load(resourceSet.getLoadOptions());
+					}
+					catch (IOException exception)
+					{
+						if (!resourceToDiagnosticMap.containsKey(resource))
+						{
+							resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+						}
+					}
+				}
+			}
+
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+			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,
+					 "<%=genPackage.getGenModel().getEditorPluginID()%>",<%=genModel.getNonNLS()%>
+					 0,
+					 null,
+					 new Object [] { editingDomain.getResourceSet() });
+<%if (genModel.useGenerics()) {%>
+			for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values())
+<%} else {%>
+			for (Iterator i = resourceToDiagnosticMap.values().iterator(); i.hasNext(); )
+<%}%>
+			{
+<%if (!genModel.useGenerics()) {%>
+				Diagnostic childDiagnostic = (Diagnostic)i.next();
+<%}%>
+				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);
+<%if (!genModel.isRichClientPlatform()) {%>
+				problemEditorPart.setMarkerHelper(markerHelper);
+<%}%>
+				try
+				{
+					addPage(++lastEditorPage, problemEditorPart, getEditorInput());
+					setPageText(lastEditorPage, problemEditorPart.getPartName());
+					setActivePage(lastEditorPage);
+					showTabs();
+				}
+				catch (PartInitException exception)
+				{
+					<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.log(exception);
+				}
+			}
+<%if (!genModel.isRichClientPlatform()) {%>
+
+			if (markerHelper.hasMarkers(editingDomain.getResourceSet()))
+			{
+  <%if (genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF213_VALUE) {%>
+				markerHelper.deleteMarkers(editingDomain.getResourceSet());
+				if (diagnostic.getSeverity() != Diagnostic.OK)
+				{
+					try
+					{
+						markerHelper.createMarkers(diagnostic);
+					}
+					catch (CoreException exception)
+					{
+						<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.log(exception);
+					}
+				}
+  <%} else {%>
+				try
+				{
+					markerHelper.updateMarkers(diagnostic);
+				}
+				catch (CoreException exception)
+				{
+					<%=genPackage.getImportedEditorPluginClassName()%>.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"),<%=genModel.getNonNLS()%>
+				 getString("_WARN_FileConflict"));<%=genModel.getNonNLS()%>
+	}
+
+	/**
+	 * This creates a model editor.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getEditorClassName()%>()
+	{
+		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());
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.editor.call.Editor.Editor.addItemProviderFactories.override" args="genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,forceDefaultCase:forceDefaultCase,importedOperationClassName:importedOperationClassName,operationMethodName:operationMethodName,_ArrayListOfObject:_ArrayListOfObject,_ArrayListOfSelectionChangedListener:_ArrayListOfSelectionChangedListener,_CollectionOfSelectionChangedListener:_CollectionOfSelectionChangedListener,_ListOfResource:_ListOfResource,_ArrayListOfResource:_ArrayListOfResource,_CollectionOfResource:_CollectionOfResource,_MapOfResourceToDiagnostic:_MapOfResourceToDiagnostic,_HashMapOfResourceToBoolean:_HashMapOfResourceToBoolean,_MapOfObjectToObject:_MapOfObjectToObject,_HashMapOfObjectToObject:_HashMapOfObjectToObject,_LinkedHashMapOfResourceToDiagnostic:_LinkedHashMapOfResourceToDiagnostic,_CollectionOfAnything:_CollectionOfAnything,_ListOfAnything:_ListOfAnything,useExtendedLabelProvider:useExtendedLabelProvider,useStyledLabelProvider:useStyledLabelProvider,_AdapterFactoryLabelProvider:_AdapterFactoryLabelProvider,_DelegatingAdapterFactoryLabelProvider:_DelegatingAdapterFactoryLabelProvider,_DecoratingColumLabelProvider:_DecoratingColumLabelProvider,_DiagnosticDecorator:_DiagnosticDecorator,_ArrayListOfString:_ArrayListOfString,_ListOfString:_ListOfString,_ListOfPropertySheetPage:_ListOfPropertySheetPage,_ArrayListOfPropertySheetPage:_ArrayListOfPropertySheetPage"%><%//Editor/addItemproviderFactories.override.javajetinc"%>
+		adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
+
+		// Create the command stack that will notify this editor as commands are executed.
+		//
+<%if (genModel.getDecoration() != GenDecoration.LIVE || genModel.getRuntimeVersion().getValue() < GenRuntimeVersion.EMF212_VALUE) {%>
+		BasicCommandStack commandStack = new BasicCommandStack();
+<%} else {%>
+		BasicCommandStack commandStack =
+			new BasicCommandStack()
+			{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void execute(Command command)
+				{
+					// Cancel live validation before executing a command that will trigger a new round of validation.
+					//
+					if (!(command instanceof <%=genModel.getImportedName("org.eclipse.emf.common.command.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()
+			 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				 @Override
+<%}%>
+				 public void commandStackChanged(final EventObject event)
+				 {
+					 getContainer().getDisplay().asyncExec
+						 (new Runnable()
+						  {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+							  @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<%if (genModel.useGenerics()) {%><PropertySheetPage><%}%> i = propertySheetPages.iterator(); i.hasNext(); )
+								  {
+									  PropertySheetPage propertySheetPage = <%if (!genModel.useGenerics()) {%>(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 <%=_HashMapOfResourceToBoolean%>());
+	}
+
+	/**
+	 * This is here for the listener to be able to call it.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+			@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(<%=_CollectionOfAnything%> collection)
+	{
+		final <%=_CollectionOfAnything%> theSelection = collection;
+		// Make sure it's okay.
+		//
+		if (theSelection != null && !theSelection.isEmpty())
+		{
+			Runnable runnable =
+				new Runnable()
+				{
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+					@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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@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
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@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
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@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
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		public boolean hasChildren(Object object)
+		{
+			Object parent = super.getParent(object);
+			return parent != null;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		public Object getParent(Object object)
+		{
+			return null;
+		}
+	}
+<%if (genPackage.isMultipleEditorPages()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCurrentViewerPane(ViewerPane viewerPane)
+	{
+		if (currentViewerPane != viewerPane)
+		{
+			if (currentViewerPane != null)
+			{
+				currentViewerPane.showFocus(false);
+			}
+			currentViewerPane = viewerPane;
+		}
+		setCurrentViewer(currentViewerPane.getViewer());
+	}
+<%}%>
+
+	/**
+	 * 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.
+						//
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+						@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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@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");<%=genModel.getNonNLS()%>
+		contextMenu.add(new Separator("additions"));<%=genModel.getNonNLS()%>
+		contextMenu.setRemoveAllWhenShown(true);
+		contextMenu.addMenuListener(this);
+		Menu menu= contextMenu.createContextMenu(viewer.getControl());
+		viewer.getControl().setMenu(menu);
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {%>
+		getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
+<%} else {%>
+		getSite().registerContextMenu(contextMenu, viewer);
+<%}%>
+
+		int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
+		Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance()<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {%>, 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()
+	{
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF211_VALUE) {%>
+		URI resourceURI = EditUIUtil.getURI(getEditorInput(), editingDomain.getResourceSet().getURIConverter());
+<%} else if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {%>
+		URI resourceURI = EditUIUtil.getURI(getEditorInput());
+<%} else if (genModel.isRichClientPlatform()) {%>
+		URI resourceURI = URI.createURI(getEditorInput().getName());
+<%} else {%>
+		// Assumes that the input is a file object.
+		//
+		IFileEditorInput modelFile = (IFileEditorInput)getEditorInput();
+		URI resourceURI = URI.createPlatformResourceURI(modelFile.getFile().getFullPath().toString(), true);
+<%}%>
+		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,
+					 "<%=genPackage.getGenModel().getEditorPluginID()%>",<%=genModel.getNonNLS()%>
+					 0,
+					 getString("_UI_CreateModelError_message", resource.getURI()),<%=genModel.getNonNLS()%>
+					 new Object [] { exception == null ? (Object)resource : exception });
+			basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));
+			return basicDiagnostic;
+		}
+		else if (exception != null)
+		{
+			return
+				new BasicDiagnostic
+					(Diagnostic.ERROR,
+					 "<%=genPackage.getGenModel().getEditorPluginID()%>",<%=genModel.getNonNLS()%>
+					 0,
+					 getString("_UI_CreateModelError_message", resource.getURI()),<%=genModel.getNonNLS()%>
+					 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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@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.
+			//
+<%if (genPackage.isMultipleEditorPages()) {%>
+			{
+				ViewerPane viewerPane =
+					new ViewerPane(getSite().getPage(), <%=genPackage.getEditorClassName()%>.this)
+					{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public Viewer createViewer(Composite composite)
+						{
+							Tree tree = new Tree(composite, SWT.MULTI);
+							TreeViewer newTreeViewer = new TreeViewer(tree);
+							return newTreeViewer;
+						}
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public void requestActivation()
+						{
+							super.requestActivation();
+							setCurrentViewerPane(this);
+						}
+					};
+				viewerPane.createControl(getContainer());
+
+				selectionViewer = (TreeViewer)viewerPane.getViewer();
+				selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+				selectionViewer.setUseHashlookup(true);
+
+				selectionViewer.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%><%if (genModel.getDecoration() != GenDecoration.NONE) {%>new <%=_DecoratingColumLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, selectionViewer<%}%>)<%if (genModel.getDecoration() != GenDecoration.NONE) {%>, new <%=_DiagnosticDecorator%>(editingDomain<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>.getResourceSet()<%}%>, selectionViewer<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>, <%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings()<%}%>))<%}%><%if (useStyledLabelProvider) {%>)<%}%>);
+				selectionViewer.setInput(editingDomain.getResourceSet());
+				selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+				viewerPane.setTitle(editingDomain.getResourceSet());
+
+				new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);
+<%if (genModel.getDecoration() != GenDecoration.NONE) {%>
+				new <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport")%>(selectionViewer, new <%=_DiagnosticDecorator%>.EditingDomainLocationListener(editingDomain, selectionViewer));
+<%}%>
+
+				createContextMenuFor(selectionViewer);
+				int pageIndex = addPage(viewerPane.getControl());
+				setPageText(pageIndex, getString("_UI_SelectionPage_label"));<%=genModel.getNonNLS()%>
+			}
+
+			// Create a page for the parent tree view.
+			//
+			{
+				ViewerPane viewerPane =
+					new ViewerPane(getSite().getPage(), <%=genPackage.getEditorClassName()%>.this)
+					{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public Viewer createViewer(Composite composite)
+						{
+							Tree tree = new Tree(composite, SWT.MULTI);
+							TreeViewer newTreeViewer = new TreeViewer(tree);
+							return newTreeViewer;
+						}
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public void requestActivation()
+						{
+							super.requestActivation();
+							setCurrentViewerPane(this);
+						}
+					};
+				viewerPane.createControl(getContainer());
+
+				parentViewer = (TreeViewer)viewerPane.getViewer();
+				parentViewer.setAutoExpandLevel(30);
+				parentViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adapterFactory));
+				parentViewer.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, parentViewer<%}%>)<%if (useStyledLabelProvider) {%>)<%}%>);
+
+				createContextMenuFor(parentViewer);
+				int pageIndex = addPage(viewerPane.getControl());
+				setPageText(pageIndex, getString("_UI_ParentPage_label"));<%=genModel.getNonNLS()%>
+			}
+
+			// This is the page for the list viewer
+			//
+			{
+				ViewerPane viewerPane =
+					new ViewerPane(getSite().getPage(), <%=genPackage.getEditorClassName()%>.this)
+					{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public Viewer createViewer(Composite composite)
+						{
+							return new ListViewer(composite);
+						}
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public void requestActivation()
+						{
+							super.requestActivation();
+							setCurrentViewerPane(this);
+						}
+					};
+				viewerPane.createControl(getContainer());
+				listViewer = (ListViewer)viewerPane.getViewer();
+				listViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+				listViewer.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, listViewer<%}%>)<%if (useStyledLabelProvider) {%>)<%}%>);
+
+				createContextMenuFor(listViewer);
+				int pageIndex = addPage(viewerPane.getControl());
+				setPageText(pageIndex, getString("_UI_ListPage_label"));<%=genModel.getNonNLS()%>
+			}
+
+			// This is the page for the tree viewer
+			//
+			{
+				ViewerPane viewerPane =
+					new ViewerPane(getSite().getPage(), <%=genPackage.getEditorClassName()%>.this)
+					{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public Viewer createViewer(Composite composite)
+						{
+							return new TreeViewer(composite);
+						}
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public void requestActivation()
+						{
+							super.requestActivation();
+							setCurrentViewerPane(this);
+						}
+					};
+				viewerPane.createControl(getContainer());
+				treeViewer = (TreeViewer)viewerPane.getViewer();
+				treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+				treeViewer.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%><%if (genModel.getDecoration() != GenDecoration.NONE) {%>new <%=_DecoratingColumLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, treeViewer<%}%>)<%if (genModel.getDecoration() != GenDecoration.NONE) {%>, new <%=_DiagnosticDecorator%>(editingDomain<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>.getResourceSet()<%}%>, treeViewer))<%}%><%if (useStyledLabelProvider) {%>)<%}%>);
+
+				new AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory);
+<%if (genModel.getDecoration() != GenDecoration.NONE) {%>
+				new <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport")%>(treeViewer, new <%=_DiagnosticDecorator%>.EditingDomainLocationListener(editingDomain, treeViewer));
+<%}%>
+
+				createContextMenuFor(treeViewer);
+				int pageIndex = addPage(viewerPane.getControl());
+				setPageText(pageIndex, getString("_UI_TreePage_label"));<%=genModel.getNonNLS()%>
+			}
+
+			// This is the page for the table viewer.
+			//
+			{
+				ViewerPane viewerPane =
+					new ViewerPane(getSite().getPage(), <%=genPackage.getEditorClassName()%>.this)
+					{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public Viewer createViewer(Composite composite)
+						{
+							return new TableViewer(composite);
+						}
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public void requestActivation()
+						{
+							super.requestActivation();
+							setCurrentViewerPane(this);
+						}
+					};
+				viewerPane.createControl(getContainer());
+				tableViewer = (TableViewer)viewerPane.getViewer();
+
+				Table table = tableViewer.getTable();
+				TableLayout layout = new TableLayout();
+				table.setLayout(layout);
+				table.setHeaderVisible(true);
+				table.setLinesVisible(true);
+
+				TableColumn objectColumn = new TableColumn(table, SWT.NONE);
+				layout.addColumnData(new ColumnWeightData(3, 100, true));
+				objectColumn.setText(getString("_UI_ObjectColumn_label"));<%=genModel.getNonNLS()%>
+				objectColumn.setResizable(true);
+
+				TableColumn selfColumn = new TableColumn(table, SWT.NONE);
+				layout.addColumnData(new ColumnWeightData(2, 100, true));
+				selfColumn.setText(getString("_UI_SelfColumn_label"));<%=genModel.getNonNLS()%>
+				selfColumn.setResizable(true);
+
+				tableViewer.setColumnProperties(new String [] {"a", "b"});<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+				tableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+				tableViewer.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%><%if (genModel.getDecoration() != GenDecoration.NONE) {%>new <%=_DecoratingColumLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, tableViewer<%}%>)<%if (genModel.getDecoration() != GenDecoration.NONE) {%>, new <%=_DiagnosticDecorator%>(editingDomain<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>.getResourceSet()<%}%>, tableViewer<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>, <%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings()<%}%>))<%}%><%if (useStyledLabelProvider) {%>)<%}%>);
+
+<%if (genModel.getDecoration() != GenDecoration.NONE) {%>
+				new <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport")%>(tableViewer, new <%=_DiagnosticDecorator%>.EditingDomainLocationListener(editingDomain, tableViewer));
+
+<%}%>
+				createContextMenuFor(tableViewer);
+				int pageIndex = addPage(viewerPane.getControl());
+				setPageText(pageIndex, getString("_UI_TablePage_label"));<%=genModel.getNonNLS()%>
+			}
+
+			// This is the page for the table tree viewer.
+			//
+			{
+				ViewerPane viewerPane =
+					new ViewerPane(getSite().getPage(), <%=genPackage.getEditorClassName()%>.this)
+					{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public Viewer createViewer(Composite composite)
+						{
+							return new TreeViewer(composite);
+						}
+<%if (genModel.useClassOverrideAnnotation()) {%>
+						@Override
+<%}%>
+						public void requestActivation()
+						{
+							super.requestActivation();
+							setCurrentViewerPane(this);
+						}
+					};
+				viewerPane.createControl(getContainer());
+
+				treeViewerWithColumns = (TreeViewer)viewerPane.getViewer();
+
+				Tree tree = treeViewerWithColumns.getTree();
+				tree.setLayoutData(new FillLayout());
+				tree.setHeaderVisible(true);
+				tree.setLinesVisible(true);
+
+				TreeColumn objectColumn = new TreeColumn(tree, SWT.NONE);
+				objectColumn.setText(getString("_UI_ObjectColumn_label"));<%=genModel.getNonNLS()%>
+				objectColumn.setResizable(true);
+				objectColumn.setWidth(250);
+
+				TreeColumn selfColumn = new TreeColumn(tree, SWT.NONE);
+				selfColumn.setText(getString("_UI_SelfColumn_label"));<%=genModel.getNonNLS()%>
+				selfColumn.setResizable(true);
+				selfColumn.setWidth(200);
+
+				treeViewerWithColumns.setColumnProperties(new String [] {"a", "b"});<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+				treeViewerWithColumns.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+				treeViewerWithColumns.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%><%if (genModel.getDecoration() != GenDecoration.NONE) {%>new <%=_DecoratingColumLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, treeViewerWithColumns<%}%>)<%if (genModel.getDecoration() != GenDecoration.NONE) {%>, new <%=_DiagnosticDecorator%>(editingDomain<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>.getResourceSet()<%}%>, treeViewerWithColumns<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>, <%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings()<%}%>))<%}%><%if (useStyledLabelProvider) {%>)<%}%>);
+
+<%if (genModel.getDecoration() != GenDecoration.NONE) {%>
+				new <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport")%>(treeViewerWithColumns, new <%=_DiagnosticDecorator%>.EditingDomainLocationListener(editingDomain, treeViewerWithColumns));
+
+<%}%>
+				createContextMenuFor(treeViewerWithColumns);
+				int pageIndex = addPage(viewerPane.getControl());
+				setPageText(pageIndex, getString("_UI_TreeWithColumnsPage_label"));<%=genModel.getNonNLS()%>
+			}
+<%} else {%>
+			Tree tree = new Tree(getContainer(), SWT.MULTI);
+			selectionViewer = new TreeViewer(tree);
+			setCurrentViewer(selectionViewer);
+
+			selectionViewer.setUseHashlookup(true);
+			selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+			selectionViewer.setLabelProvider(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%><%if (genModel.getDecoration() != GenDecoration.NONE) {%>new <%=_DecoratingColumLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, selectionViewer<%}%>)<%if (genModel.getDecoration() != GenDecoration.NONE) {%>, new <%=_DiagnosticDecorator%>(editingDomain<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>.getResourceSet()<%}%>, selectionViewer<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>, <%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings()<%}%>))<%}%><%if (useStyledLabelProvider) {%>)<%}%>);
+			selectionViewer.setInput(editingDomain.getResourceSet());
+			selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+
+			new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);
+<%if (genModel.getDecoration() != GenDecoration.NONE) {%>
+			new <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport")%>(selectionViewer, new <%=_DiagnosticDecorator%>.EditingDomainLocationListener(editingDomain, selectionViewer));
+<%}%>
+
+			createContextMenuFor(selectionViewer);
+			int pageIndex = addPage(tree);
+			setPageText(pageIndex, getString("_UI_SelectionPage_label"));<%=genModel.getNonNLS()%>
+<%}%>
+
+			getSite().getShell().getDisplay().asyncExec
+				(new Runnable()
+				 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+					 @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;
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void controlResized(ControlEvent event)
+				{
+					if (!guard)
+					{
+						guard = true;
+						hideTabs();
+						guard = false;
+					}
+				}
+			 });
+
+		getSite().getShell().getDisplay().asyncExec
+			(new Runnable()
+			 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				 @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, "");<%=genModel.getNonNLS()%>
+			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"));<%=genModel.getNonNLS()%>
+			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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@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
+	 */
+<%if (genModel.useGenerics() && genModel.getEclipsePlatformVersion().getValue() < GenEclipsePlatformVersion.MARS_VALUE) {%>
+	@SuppressWarnings("<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF26_VALUE) {%>rawtypes<%} else {%>unchecked<%}%>")
+<%}%>
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+<%if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {%>
+	public <T> T getAdapter(Class<T> key)
+<%} else {%>
+	public Object getAdapter(Class key)
+<%}%>
+	{
+		if (key.equals(IContentOutlinePage.class))
+		{
+<%if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {%>
+			return showOutlineView() ? key.cast(getContentOutlinePage()) : null;
+<%} else {%>
+			return showOutlineView() ? getContentOutlinePage() : null;
+<%}%>
+		}
+		else if (key.equals(IPropertySheetPage.class))
+		{
+<%if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {%>
+			return key.cast(getPropertySheetPage());
+<%} else {%>
+			return getPropertySheetPage();
+<%}%>
+		}
+<%if (!genModel.isRichClientPlatform()) {%>
+		else if (key.equals(IGotoMarker.class))
+		{
+<%if (genModel.getEclipsePlatformVersion().getValue() >= GenEclipsePlatformVersion.MARS_VALUE) {%>
+			return key.cast(this);
+<%} else {%>
+			return this;
+<%}%>
+		}
+<%}%>
+<%if (genModel.isFindAction()) {%>
+		else if (key.equals(<%=genModel.getImportedName("org.eclipse.jface.text.IFindReplaceTarget")%>.class)) 
+		{
+			return <%=genModel.getImportedName("org.eclipse.emf.edit.ui.util.FindAndReplaceTarget")%>.getAdapter(key, this, <%=genPackage.getImportedEditorPluginClassName()%>.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
+			{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@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(<%if (useStyledLabelProvider) {%>new <%=_DelegatingAdapterFactoryLabelProvider%>(<%}%><%if (genModel.getDecoration() != GenDecoration.NONE) {%>new <%=_DecoratingColumLabelProvider%>(<%}%>new <%=_AdapterFactoryLabelProvider%>(adapterFactory<%if (useExtendedLabelProvider) {%>, contentOutlineViewer<%}%>)<%if (genModel.getDecoration() != GenDecoration.NONE) {%>, new <%=_DiagnosticDecorator%>(editingDomain<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>.getResourceSet()<%}%>, contentOutlineViewer<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>, <%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings()<%}%>))<%}%><%if (useStyledLabelProvider) {%>)<%}%>);
+					contentOutlineViewer.setInput(editingDomain.getResourceSet());
+
+<%if (genModel.getDecoration() != GenDecoration.NONE) {%>
+					new <%=genModel.getImportedName("org.eclipse.emf.common.ui.viewer.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);
+					}
+				}
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager)
+				{
+					super.makeContributions(menuManager, toolBarManager, statusLineManager);
+					contentOutlineStatusLineManager = statusLineManager;
+				}
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@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.
+					 //
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+					 @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<%if (genModel.getDecoration() == GenDecoration.MANUAL) {%>, ExtendedPropertySheetPage.Decoration.MANUAL<%} else if (genModel.getDecoration() == GenDecoration.LIVE) {%>, ExtendedPropertySheetPage.Decoration.LIVE, <%=genPackage.getImportedEditorPluginClassName()%>.getPlugin().getDialogSettings()<%}%><%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF214_VALUE) {%>, <%if (genModel.getDecoration() == GenDecoration.NONE) {%>ExtendedPropertySheetPage.Decoration.NONE, <%}%><%if (genModel.getDecoration() != GenDecoration.LIVE) {%>null, <%}%><%=genModel.getAutoExpandProperties()%>, <%=genModel.isAutoResizeProperties()%><%}%>)
+			{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void setSelectionToViewer(<%=_ListOfAnything%> selection)
+				{
+					<%=genPackage.getEditorClassName()%>.this.setSelectionToViewer(selection);
+					<%=genPackage.getEditorClassName()%>.this.setFocus();
+				}
+
+<%if (genModel.useClassOverrideAnnotation()) {%>
+				@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 (genPackage.isMultipleEditorPages()) {%>
+		if (currentViewerPane != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
+<%} else {%>
+		if (selectionViewer != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
+<%}%>
+		{
+			Iterator<%if (genModel.useGenerics()) {%><?><%}%> selectedElements = ((IStructuredSelection)selection).iterator();
+			if (selectedElements.hasNext())
+			{
+				// Get the first selected element.
+				//
+				Object selectedElement = selectedElements.next();
+
+<%if (genPackage.isMultipleEditorPages()) {%>
+				// If it's the selection viewer, then we want it to select the same selection as this selection.
+				//
+				if (currentViewerPane.getViewer() == selectionViewer)
+				{
+					<%=_ArrayListOfObject%> selectionList = new <%=_ArrayListOfObject%>();
+					selectionList.add(selectedElement);
+					while (selectedElements.hasNext())
+					{
+						selectionList.add(selectedElements.next());
+					}
+
+					// Set the selection to the widget.
+					//
+					selectionViewer.setSelection(new StructuredSelection(selectionList));
+				}
+				else
+				{
+					// Set the input to the widget.
+					//
+					if (currentViewerPane.getViewer().getInput() != selectedElement)
+					{
+						currentViewerPane.getViewer().setInput(selectedElement);
+						currentViewerPane.setTitle(selectedElement);
+					}
+				}
+<%} else {%>
+				<%=_ArrayListOfObject%> selectionList = new <%=_ArrayListOfObject%>();
+				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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public boolean isDirty()
+	{
+		return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();
+	}
+
+<%if (genModel.isRevertAction()) {%>
+	/**
+	 * This is for implementing {@link IRevertablePart}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void doRevert()
+	{
+<%if (genModel.getDecoration() == GenDecoration.LIVE) {%>
+		DiagnosticDecorator.cancel(editingDomain);
+
+<%}%>		
+		ResourceSet resourceSet = editingDomain.getResourceSet();
+		<%=_ListOfResource%> resources = resourceSet.getResources();
+		<%=_ListOfResource%> unloadedResources = new <%=_ArrayListOfResource%>();
+		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();
+<%if (genModel.useGenerics()) {%>
+		for (Resource resource : unloadedResources)
+<%} else {%>
+		for (Iterator i = unloadedResources.iterator(); i.hasNext(); )
+<%}%>
+		{
+<%if (!genModel.useGenerics()) {%>
+				Resource resource = (Resource)i.next();
+<%}%>
+			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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void doSave(IProgressMonitor progressMonitor)
+	{
+		// Save only resources that have actually changed.
+		//
+		final <%=_MapOfObjectToObject%> saveOptions = new <%=_HashMapOfObjectToObject%>();
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {%>
+		saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+<%}%>
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF29_VALUE) {%>
+		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.
+		//
+		<%=importedOperationClassName%> operation =
+			new <%=importedOperationClassName%>()
+			{
+				// This is the method that gets invoked when the operation runs.
+				//
+<%if (genModel.useInterfaceOverrideAnnotation() || !genModel.isRichClientPlatform() && genModel.useClassOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void <%=operationMethodName%>(IProgressMonitor monitor)
+				{
+					// Save the resources to the file system.
+					//
+					boolean first = true;
+					<%=_ListOfResource%> resources = editingDomain.getResourceSet().getResources();
+					for (int i = 0; i < resources.size(); ++i)
+					{
+						Resource resource = <%if (!genModel.useGenerics()) {%>(Resource)<%}%>resources.get(i);
+						if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource))
+						{
+							try
+							{
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE) {%>
+								long timeStamp = resource.getTimeStamp();
+								resource.save(saveOptions);
+								if (resource.getTimeStamp() != timeStamp)
+								{
+									savedResources.add(resource);
+								}
+<%} else {%>
+								resource.save(saveOptions);
+								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.
+			//
+			<%=genPackage.getImportedEditorPluginClassName()%>.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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public boolean isSaveAsAllowed()
+	{
+		return true;
+	}
+
+	/**
+	 * This also changes the editor's input.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void doSaveAs()
+	{
+<%if (genModel.isRichClientPlatform()) {%>
+  <%if (genModel.isRichAjaxPlatform()) {%>
+		new <%=genModel.getImportedName("org.eclipse.emf.common.ui.dialogs.ResourceDialog")%>(getSite().getShell(), null, SWT.NONE)
+			{
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+				@Override
+    <%}%>
+				protected boolean isSave()
+				{
+					return true;
+				}
+
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+				@Override
+    <%}%>
+				protected boolean processResources()
+				{
+					<%="List" + (genModel.useGenerics() ? "<URI>" : "")%> uris = getURIs();
+					if (uris.size() > 0)
+					{
+						URI uri = <%=genModel.useGenerics() ? "": "(URI)"%>uris.get(0);
+						doSaveAs(uri, new <%=genModel.getImportedName("org.eclipse.emf.common.ui.URIEditorInput")%>(uri));
+						return true;
+					}
+					else
+					{
+						return false;
+					}
+				}
+			}.open();
+  <%} else {%>
+		String[] filters = <%if (!genModel.useGenerics()) {%>(String[])<%}%>FILE_EXTENSION_FILTERS.toArray(new String[FILE_EXTENSION_FILTERS.size()]);
+		String[] files = <%=genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName())%>.openFilePathDialog(getSite().getShell(), <%=genModel.getImportedName("org.eclipse.swt.SWT")%>.SAVE, filters);
+		if (files.length > 0)
+		{
+			URI uri = URI.createFileURI(files[0]);
+			doSaveAs(uri, new <%=genModel.getImportedName("org.eclipse.emf.common.ui.URIEditorInput")%>(uri));
+		}
+  <%}%>
+<%} else {%>
+		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)
+	{
+		(<%if (!genModel.useGenerics()) {%>(Resource)<%}%>editingDomain.getResourceSet().getResources().get(0)).setURI(uri);
+		setInputWithNotify(editorInput);
+		setPartName(editorInput.getName());
+		IProgressMonitor progressMonitor =
+			getActionBars().getStatusLineManager() != null ?
+				getActionBars().getStatusLineManager().getProgressMonitor() :
+				new <%=genModel.getImportedName("org.eclipse.core.runtime.NullProgressMonitor")%>();
+		doSave(progressMonitor);
+	}
+<%if (!genModel.isRichClientPlatform()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void gotoMarker(IMarker marker)
+	{
+<%if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF23_VALUE) {%>
+		<%=_ListOfAnything%> targetObjects = markerHelper.getTargetObjects(editingDomain, marker);
+		if (!targetObjects.isEmpty())
+		{
+			setSelectionToViewer(targetObjects);
+		}
+<%} else {%>
+		try
+		{
+			if (marker.isSubtypeOf(EValidator.MARKER))
+			{
+				String uriAttribute = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
+				if (uriAttribute != null)
+				{
+					URI uri = URI.createURI(uriAttribute);
+					EObject eObject = editingDomain.getResourceSet().getEObject(uri, true);
+					if (eObject != null)
+					{
+					  setSelectionToViewer(Collections.singleton(editingDomain.getWrapper(eObject)));
+					}
+				}
+			}
+		}
+		catch (CoreException exception)
+		{
+			<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.log(exception);
+		}
+<%}%>
+	}
+<%}%>
+
+	/**
+	 * This is called during startup.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void init(IEditorSite site, IEditorInput editorInput)
+	{
+		setSite(site);
+		setInputWithNotify(editorInput);
+		setPartName(editorInput.getName());
+		site.setSelectionProvider(this);
+		site.getPage().addPartListener(partListener);
+<%if (!genModel.isRichClientPlatform()) {%>
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
+<%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void setFocus()
+	{
+<%if (genPackage.isMultipleEditorPages()) {%>
+		if (currentViewerPane != null)
+		{
+			currentViewerPane.setFocus();
+		}
+		else
+		{
+			getControl(getActivePage()).setFocus();
+		}
+<%} else {%>
+		getControl(getActivePage()).setFocus();
+<%}%>
+	}
+
+	/**
+	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void addSelectionChangedListener(ISelectionChangedListener listener)
+	{
+		selectionChangedListeners.add(listener);
+	}
+
+	/**
+	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void setSelection(ISelection selection)
+	{
+		editorSelection = selection;
+
+<%if (genModel.useGenerics()) {%>
+		for (ISelectionChangedListener listener : selectionChangedListeners)
+<%} else {%>
+		for (Iterator listeners = selectionChangedListeners.iterator(); listeners.hasNext(); )
+<%}%>
+		{
+<%if (!genModel.useGenerics()) {%>
+			ISelectionChangedListener listener = (ISelectionChangedListener)listeners.next();
+<%}%>
+			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)
+			{
+				<%=_CollectionOfAnything%> collection = ((IStructuredSelection)selection).toList();
+				switch (collection.size())
+				{
+					case 0:
+					{
+						statusLineManager.setMessage(getString("_UI_NoObjectSelected"));<%=genModel.getNonNLS()%>
+						break;
+					}
+					case 1:
+					{
+						String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());
+						statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text));<%=genModel.getNonNLS()%>
+						break;
+					}
+					default:
+					{
+						statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size())));<%=genModel.getNonNLS()%>
+						break;
+					}
+				}
+			}
+			else
+			{
+				statusLineManager.setMessage("");<%=genModel.getNonNLS()%>
+			}
+		}
+	}
+
+	/**
+	 * 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 <%=genPackage.getImportedEditorPluginClassName()%>.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 <%=genPackage.getImportedEditorPluginClassName()%>.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
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@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
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void dispose()
+	{
+		updateProblemIndication = false;
+
+<%if (!genModel.isRichClientPlatform()) {%>
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
+
+<%}%>
+		getSite().getPage().removePartListener(partListener);
+
+		adapterFactory.dispose();
+
+		if (getActionBarContributor().getActiveEditor() == this)
+		{
+			getActionBarContributor().setActiveEditor(null);
+		}
+
+<%if (genModel.useGenerics()) {%>
+		for (PropertySheetPage propertySheetPage : propertySheetPages)
+<%} else {%>
+		for (Iterator i = propertySheetPages.iterator(); i.hasNext(); )
+<%}%>
+		{
+<%if (!genModel.useGenerics()) {%>
+			PropertySheetPage propertySheetPage = (PropertySheetPage)i.next();
+<%}%>
+			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 <%=genPackage.isMultipleEditorPages()%>;
+	}
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._SwqrSGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._SwqrSGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pmc2MDG0Ed-kc8dEZsdm2w/method._SwqrSGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._-Y0XhHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._-Y0XhHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..8298b21
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._-Y0XhHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard() && genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._0_yuaWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._0_yuaWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._0_yuaWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e17c886
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getEditorDirectory();
+packageName = genPackage.getPresentationPackageName();
+className = genPackage.getModelWizardClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..250c8f3
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._Pm5iIjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,994 @@
+
+<%
+/**
+ * Copyright (c) 2002-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel=genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+<%String _ListOfString = "List" + (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");%>
+<%String _ArrayListOfString = "ArrayList" + (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");%>
+<%String _CollectionOfString = "Collection" + (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");%>
+<%String _MapOfObjectToObject = "Map" + (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.Object") + ", " + genModel.getImportedName("java.lang.Object") + ">" : "");%>
+<%String _HashMapOfObjectToObject = "HashMap" + (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.Object") + ", " + genModel.getImportedName("java.lang.Object") + ">" : "");%>
+package <%=genPackage.getPresentationPackageName()%>;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+<%if (!genModel.useGenerics()) {%>
+import java.util.Iterator;
+<%}%>
+import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.StringTokenizer;
+
+<%if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {%>
+import org.eclipse.emf.common.CommonPlugin;
+
+<%}%>
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+
+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.EObject;
+
+import org.eclipse.emf.ecore.xmi.XMLResource;
+
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+
+<%if (!genModel.isRichClientPlatform()) {%>
+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.jface.dialogs.MessageDialog;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+
+import org.eclipse.swt.SWT;
+
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.ModifyEvent;
+
+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;
+
+<%if (!genModel.isRichClientPlatform()) {%>
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.ISetSelectionTarget;
+
+<%}%>
+<%if (!genModel.isSuppressEMFMetaData()) {%>
+import <%=genPackage.getQualifiedFactoryInterfaceName()%>;
+<%}%>
+import <%=genPackage.getQualifiedPackageInterfaceName()%>;
+import <%=genPackage.getQualifiedEditPluginClassName()%>;
+
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+
+/**
+ * This is a simple wizard for creating a new model file.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public class <%=genPackage.getModelWizardClassName()%> extends Wizard implements INewWizard
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+	/**
+	 * The supported extensions for created files.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=_ListOfString%> FILE_EXTENSIONS =
+		Collections.unmodifiableList(Arrays.asList(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getEditorClassName()%>FilenameExtensions").split("\\s*,\\s*")));<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+
+	/**
+	 * A formatted list of supported file extensions, suitable for display.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final String FORMATTED_FILE_EXTENSIONS =
+		<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getEditorClassName()%>FilenameExtensions").replaceAll("\\s*,\\s*", ", ");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%><%=genModel.getNonNLS(3)%>
+
+	/**
+	 * This caches an instance of the model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.isSuppressEMFMetaData() ? genModel.getImportedName("org.eclipse.emf.ecore.EPackage") : genPackage.getPackageInterfaceName()%> <%=genPackage.getUncapPackageName()%> = <%=genPackage.getPackageInterfaceName()%>.eINSTANCE;
+
+	/**
+	 * This caches an instance of the model factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genModel.isSuppressEMFMetaData() ? genModel.getImportedName("org.eclipse.emf.ecore.EFactory") : genPackage.getFactoryInterfaceName()%> <%=genPackage.getUncapFactoryName()%> = <%=genPackage.getUncapPackageName()%>.get<%=genModel.isSuppressEMFMetaData() ? "EFactoryInstance" : genPackage.getFactoryName()%>();
+
+<%if (!genModel.isRichClientPlatform()) {%>
+	/**
+	 * This is the file creation page.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genPackage.getModelWizardClassName()%>NewFileCreationPage newFileCreationPage;
+
+<%}%>
+	/**
+	 * This is the initial object creation page.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genPackage.getModelWizardClassName()%>InitialObjectCreationPage 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;
+
+	/**
+<%if (!genPackage.hasDocumentRoot()) {%>
+	 * Caches the names of the types that can be created as the root object.
+<%} else {%>
+	 * Caches the names of the features representing global elements.
+<%}%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_ListOfString%> initialObjectNames;
+
+	/**
+	 * This just records the information.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public void init(IWorkbench workbench, IStructuredSelection selection)
+	{
+		this.workbench = workbench;
+		this.selection = selection;
+		setWindowTitle(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_Wizard_label"));<%=genModel.getNonNLS()%>
+		setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getImage("full/wizban/New<%=genPackage.getPrefix()%>")));<%=genModel.getNonNLS()%>
+	}
+
+	/**
+<%if (!genPackage.hasDocumentRoot()) {%>
+	 * Returns the names of the types that can be created as the root object.
+<%} else {%>
+	 * Returns the names of the features representing global elements.
+<%}%>
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=_CollectionOfString%> getInitialObjectNames()
+	{
+		if (initialObjectNames == null)
+		{
+			initialObjectNames = new <%=_ArrayListOfString%>();
+<%if (!genPackage.hasDocumentRoot()) {%>
+  <%if (genModel.useGenerics()) {%>
+			for (EClassifier eClassifier : <%=genPackage.getUncapPackageName()%>.getEClassifiers())
+  <%} else {%>
+			for (Iterator classifiers = <%=genPackage.getUncapPackageName()%>.getEClassifiers().iterator(); classifiers.hasNext(); )
+  <%}%>
+			{
+  <%if (!genModel.useGenerics()) {%>
+				EClassifier eClassifier = (EClassifier)classifiers.next();
+  <%}%>
+				if (eClassifier instanceof EClass)
+				{
+					EClass eClass = (EClass)eClassifier;
+					if (!eClass.isAbstract())
+					{
+						initialObjectNames.add(eClass.getName());
+					}
+				}
+			}
+<%} else {%>
+  <%if (genModel.useGenerics()) {%>
+			for (<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%> eStructuralFeature : <%=genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData")%>.INSTANCE.getAllElements(<%=genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData")%>.INSTANCE.getDocumentRoot(<%=genPackage.getUncapPackageName()%>)))
+  <%} else {%>
+			for (Iterator elements = <%=genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData")%>.INSTANCE.getAllElements(<%=genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData")%>.INSTANCE.getDocumentRoot(<%=genPackage.getUncapPackageName()%>)).iterator(); elements.hasNext(); )
+  <%}%>
+			{
+  <%if (!genModel.useGenerics()) {%>
+				<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%> eStructuralFeature = (<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>)elements.next();
+  <%}%>
+				if (eStructuralFeature.isChangeable())
+				{
+					EClassifier eClassifier = eStructuralFeature.getEType();
+					if (eClassifier instanceof EClass)
+					{
+						EClass eClass = (EClass)eClassifier;
+						if (!eClass.isAbstract())
+						{
+							initialObjectNames.add(eStructuralFeature.getName());
+						}
+					}
+				}
+			}
+<%}%>
+			Collections.sort(initialObjectNames, <%if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {%>CommonPlugin.INSTANCE.getComparator()<%} else {%>java.text.Collator.getInstance()<%}%>);
+		}
+		return initialObjectNames;
+	}
+
+	/**
+	 * Create a new model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EObject createInitialModel()
+	{
+<%if (!genPackage.hasDocumentRoot()) {%>
+		EClass eClass = (EClass)<%=genPackage.getUncapPackageName()%>.getEClassifier(initialObjectCreationPage.getInitialObjectName());
+		EObject rootObject = <%=genPackage.getUncapFactoryName()%>.create(eClass);
+<%} else {%>
+		EClass eClass = <%=genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData")%>.INSTANCE.getDocumentRoot(<%=genPackage.getUncapPackageName()%>);
+		EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(initialObjectCreationPage.getInitialObjectName());
+		EObject rootObject = <%=genPackage.getUncapFactoryName()%>.create(eClass);
+		rootObject.eSet(eStructuralFeature, <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil")%>.create((EClass)eStructuralFeature.getEType()));
+<%}%>
+		return rootObject;
+	}
+
+	/**
+	 * Do the work after everything is specified.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public boolean performFinish()
+	{
+		try
+		{
+<%if (genModel.isRichClientPlatform()) {%>
+			// Get the URI of the model file.
+			//
+			final URI fileURI = getModelURI();
+			if (new <%=genModel.getImportedName("java.io.File")%>(fileURI.toFileString()).exists())
+			{
+				if (!MessageDialog.openQuestion
+						(getShell(),
+						 <%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_Question_title"),<%=genModel.getNonNLS()%>
+						 <%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_WARN_FileConflict", new String []{ fileURI.toFileString() })))<%=genModel.getNonNLS()%>
+				{
+					initialObjectCreationPage.selectFileField();
+					return false;
+				}
+			}
+			
+			// Do the work within an operation.
+			//
+			<%=genModel.getImportedName("org.eclipse.jface.operation.IRunnableWithProgress")%> operation = new <%=genModel.getImportedName("org.eclipse.jface.operation.IRunnableWithProgress")%>()
+			{
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void run(IProgressMonitor progressMonitor)
+<%} else {%>
+			// Remember the file.
+			//
+			final IFile modelFile = getModelFile();
+
+			// Do the work within an operation.
+			//
+			WorkspaceModifyOperation operation =
+				new WorkspaceModifyOperation()
+				{
+<%if (genModel.useClassOverrideAnnotation()) {%>
+					@Override
+<%}%>
+					protected void execute(IProgressMonitor progressMonitor)
+<%}%>
+					{
+						try
+						{
+							// Create a resource set
+							//
+							ResourceSet resourceSet = new ResourceSetImpl();
+
+<%if (!genModel.isRichClientPlatform()) {%>
+							// 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<%if (genPackage.isContentType()) {%>, <%=genPackage.getImportedPackageInterfaceName()%>.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.
+							//
+							<%=_MapOfObjectToObject%> options = new <%=_HashMapOfObjectToObject%>();
+							options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());
+							resource.save(options);
+						}
+						catch (Exception exception)
+						{
+							<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.log(exception);
+						}
+						finally
+						{
+							progressMonitor.done();
+						}
+					}
+				};
+
+			getContainer().run(false, false, operation);
+
+<%if (genModel.isRichClientPlatform()) {%>
+			return <%=genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName())%>.openEditor(workbench, fileURI);			
+<%} else {%>
+			// Select the new file resource in the current view.
+			//
+			<%=genModel.getImportedName("org.eclipse.ui.IWorkbenchWindow")%> workbenchWindow = workbench.getActiveWorkbenchWindow();
+			<%=genModel.getImportedName("org.eclipse.ui.IWorkbenchPage")%> page = workbenchWindow.getActivePage();
+			final <%=genModel.getImportedName("org.eclipse.ui.IWorkbenchPart")%> activePart = page.getActivePart();
+			if (activePart instanceof ISetSelectionTarget)
+			{
+				final <%=genModel.getImportedName("org.eclipse.jface.viewers.ISelection")%> targetSelection = new <%=genModel.getImportedName("org.eclipse.jface.viewers.StructuredSelection")%>(modelFile);
+				getShell().getDisplay().asyncExec
+					(new Runnable()
+					 {
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+						 @Override
+<%}%>
+						 public void run()
+						 {
+							 ((ISetSelectionTarget)activePart).selectReveal(targetSelection);
+						 }
+					 });
+			}
+
+			// Open an editor on the new file.
+			//
+			try
+			{
+				page.openEditor
+					(new FileEditorInput(modelFile),
+					 workbench.getEditorRegistry().getDefaultEditor<%if (!genPackage.isContentType()) {%>(modelFile.getFullPath().toString()).getId());<%} else {%>
+					 	(modelFile.getFullPath().toString(),
+					 	 <%=genModel.getImportedName("org.eclipse.core.runtime.Platform")%>.getContentTypeManager().getContentType(<%=genPackage.getImportedPackageInterfaceName()%>.eCONTENT_TYPE)).getId());
+<%}%>					 	 
+			}
+			catch (<%=genModel.getImportedName("org.eclipse.ui.PartInitException")%> exception)
+			{
+				MessageDialog.openError(workbenchWindow.getShell(), <%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage());<%=genModel.getNonNLS()%>
+				return false;
+			}
+
+			return true;
+<%}%>
+		}
+		catch (Exception exception)
+		{
+			<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.log(exception);
+			return false;
+		}
+	}
+
+<%if (!genModel.isRichClientPlatform()) {%>
+	/**
+	 * This is the one page of the wizard.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public class <%=genPackage.getModelWizardClassName()%>NewFileCreationPage extends WizardNewFileCreationPage
+	{
+		/**
+		 * Pass in the selection.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=genPackage.getModelWizardClassName()%>NewFileCreationPage(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
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		protected boolean validatePage()
+		{
+			if (super.validatePage())
+			{
+				String extension = new <%=genModel.getImportedName("org.eclipse.core.runtime.Path")%>(getFileName()).getFileExtension();
+				if (extension == null || !FILE_EXTENSIONS.contains(extension))
+				{
+					String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+					setErrorMessage(<%=genPackage.getImportedEditorPluginClassName()%>.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 <%=genPackage.getModelWizardClassName()%>InitialObjectCreationPage extends WizardPage
+	{
+<%if (genModel.isRichClientPlatform()) {%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=genModel.getImportedName("org.eclipse.swt.widgets.Text")%> fileField;
+
+<%}%>
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected Combo initialObjectField;
+
+		/**
+		 * @generated
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 */
+		protected <%=_ListOfString%> encodings;
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected Combo encodingField;
+
+		/**
+		 * Pass in the selection.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public <%=genPackage.getModelWizardClassName()%>InitialObjectCreationPage(String pageId)
+		{
+			super(pageId);
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+		@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);
+			}
+
+<%if (genModel.isRichClientPlatform()) {%>			
+			Label resourceURILabel = new Label(composite, SWT.LEFT);
+			{
+				resourceURILabel.setText(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_File_label"));<%=genModel.getNonNLS()%>
+
+				GridData data = new GridData();
+				data.horizontalAlignment = GridData.FILL;
+				resourceURILabel.setLayoutData(data);
+			}
+
+			Composite fileComposite = new Composite(composite, SWT.NONE);
+			{
+				GridData data = new GridData();
+				data.horizontalAlignment = GridData.END;
+				fileComposite.setLayoutData(data);
+
+				GridLayout layout = new GridLayout();
+				data.horizontalAlignment = GridData.FILL;
+				layout.marginHeight = 0;
+				layout.marginWidth = 0;
+				layout.numColumns = 2;
+				fileComposite.setLayout(layout);
+			}
+
+			fileField = new <%=genModel.getImportedName("org.eclipse.swt.widgets.Text")%>(fileComposite, SWT.BORDER);
+			{
+				GridData data = new GridData();
+				data.horizontalAlignment = GridData.FILL;
+				data.grabExcessHorizontalSpace = true;
+				data.horizontalSpan = 1;
+				fileField.setLayoutData(data);
+			}
+
+			fileField.addModifyListener(validator);
+
+  <%if (!genModel.isRichAjaxPlatform()) {%>
+			<%=genModel.getImportedName("org.eclipse.swt.widgets.Button")%> resourceURIBrowseFileSystemButton = new <%=genModel.getImportedName("org.eclipse.swt.widgets.Button")%>(fileComposite, SWT.PUSH);
+			resourceURIBrowseFileSystemButton.setText(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_Browse_label"));<%=genModel.getNonNLS()%>
+
+			resourceURIBrowseFileSystemButton.addSelectionListener
+				(new <%=genModel.getImportedName("org.eclipse.swt.events.SelectionAdapter")%>()
+				 {
+    <%if (genModel.useClassOverrideAnnotation()) {%>
+					 @Override
+    <%}%>
+					 public void widgetSelected(<%=genModel.getImportedName("org.eclipse.swt.events.SelectionEvent")%> event)
+					 {
+						 String[] filters = <%if (!genModel.useGenerics()) {%>(String[])<%}%><%=genPackage.getImportedEditorClassName()%>.FILE_EXTENSION_FILTERS.toArray(new String[<%=genPackage.getImportedEditorClassName()%>.FILE_EXTENSION_FILTERS.size()]);
+						 String[] files = <%=genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName())%>.openFilePathDialog(getShell(), <%=genModel.getImportedName("org.eclipse.swt.SWT")%>.SAVE, filters);
+						 if (files.length > 0)
+						 {
+							 fileField.setText(files[0]);
+						 }
+					 }
+				 });
+  <%}%>
+<%}%>
+			Label containerLabel = new Label(composite, SWT.LEFT);
+			{
+				containerLabel.setText(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_ModelObject"));<%=genModel.getNonNLS()%>
+
+				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);
+			}
+
+  <%if (genModel.useGenerics()) {%>
+			for (String objectName : getInitialObjectNames())
+			{
+				initialObjectField.add(getLabel(objectName));
+			}
+  <%} else {%>
+			for (Iterator i = getInitialObjectNames().iterator(); i.hasNext(); )
+			{
+				initialObjectField.add(getLabel((String)i.next()));
+			}
+  <%}%>
+
+			if (initialObjectField.getItemCount() == 1)
+			{
+				initialObjectField.select(0);
+			}
+			initialObjectField.addModifyListener(validator);
+
+			Label encodingLabel = new Label(composite, SWT.LEFT);
+			{
+				encodingLabel.setText(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_XMLEncoding"));<%=genModel.getNonNLS()%>
+
+				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);
+			}
+
+  <%if (genModel.useGenerics()) {%>
+			for (String encoding : getEncodings())
+			{
+				encodingField.add(encoding);
+			}
+  <%} else {%>
+			for (Iterator i = getEncodings().iterator(); i.hasNext(); )
+			{
+				encodingField.add((String)i.next());
+			}
+  <%}%>
+
+			encodingField.select(0);
+			encodingField.addModifyListener(validator);
+
+			setPageComplete(validatePage());
+			setControl(composite);
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected ModifyListener validator =
+			new ModifyListener()
+			{
+<%if (genModel.useInterfaceOverrideAnnotation()) {%>
+				@Override
+<%}%>
+				public void modifyText(ModifyEvent e)
+				{
+					setPageComplete(validatePage());
+				}
+			};
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected boolean validatePage()
+		{
+<%if (genModel.isRichClientPlatform()) {%>
+			URI fileURI = getFileURI();
+			if (fileURI == null || fileURI.isEmpty())
+			{
+				setErrorMessage(null);
+				return false;
+			}
+
+			String extension = fileURI.fileExtension();
+			if (extension == null || !FILE_EXTENSIONS.contains(extension))
+			{
+				String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+				setErrorMessage(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));
+				return false;
+			}
+
+			setErrorMessage(null);
+<%}%>
+			return getInitialObjectName() != null && getEncodings().contains(encodingField.getText());
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		public void setVisible(boolean visible)
+		{
+			super.setVisible(visible);
+			if (visible)
+			{
+<%if (!genModel.isRichClientPlatform()) {%>
+				if (initialObjectField.getItemCount() == 1)
+				{
+					initialObjectField.clearSelection();
+					encodingField.setFocus();
+				}
+				else
+				{
+					encodingField.clearSelection();
+					initialObjectField.setFocus();
+				}
+<%} else {%>
+				initialObjectField.clearSelection();
+				encodingField.clearSelection();
+				fileField.setFocus();
+<%}%>
+			}
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public String getInitialObjectName()
+		{
+			String label = initialObjectField.getText();
+
+  <%if (genModel.useGenerics()) {%>
+			for (String name : getInitialObjectNames())
+  <%} else {%>
+			for (Iterator i = getInitialObjectNames().iterator(); i.hasNext(); )
+  <%}%>
+			{
+  <%if (!genModel.useGenerics()) {%>
+				String name = (String)i.next();
+  <%}%>
+				if (getLabel(name).equals(label))
+				{
+					return name;
+				}
+			}
+			return null;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public String getEncoding()
+		{
+			return encodingField.getText();
+		}
+<%if (genModel.isRichClientPlatform()) {%>
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public URI getFileURI()
+		{
+			try
+			{
+				return URI.createFileURI(fileField.getText());
+			}
+			catch (Exception exception)
+			{
+				// Ignore
+			}
+			return null;
+		}
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public void selectFileField()
+		{
+				initialObjectField.clearSelection();
+				encodingField.clearSelection();
+				fileField.selectAll();
+				fileField.setFocus();
+		}		
+<%}%>
+<%{ String type = genPackage.hasDocumentRoot() ? "feature" : "type"; String prefix = genPackage.hasDocumentRoot() ? "_UI_DocumentRoot_" : "_UI_";%>
+
+		/**
+		 * Returns the label for the specified <%=type%> name.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected String getLabel(String <%=type%>Name)
+		{
+			try
+			{
+				return <%=genPackage.getEditPluginClassName()%>.INSTANCE.getString("<%=prefix%>" + <%=type%>Name + "_<%=type%>");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+			}
+			catch(MissingResourceException mre)
+			{
+				<%=genModel.getImportedName(genModel.getQualifiedEditorPluginClassName())%>.INSTANCE.log(mre);
+			}
+			return <%=type%>Name;
+		}
+<%}%>
+
+		/**
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected <%=_CollectionOfString%> getEncodings()
+		{
+			if (encodings == null)
+			{
+				encodings = new <%=_ArrayListOfString%>();
+				for (StringTokenizer stringTokenizer = new StringTokenizer(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens(); )<%=genModel.getNonNLS()%>
+				{
+					encodings.add(stringTokenizer.nextToken());
+				}
+			}
+			return encodings;
+		}
+	}
+
+	/**
+	 * The framework calls this to create the contents of the wizard.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+	public void addPages()
+	{
+<%if (!genModel.isRichClientPlatform()) {%>
+		// Create a page, set the title, and the initial model file name.
+		//
+		newFileCreationPage = new <%=genPackage.getModelWizardClassName()%>NewFileCreationPage("Whatever", selection);<%=genModel.getNonNLS()%>
+		newFileCreationPage.setTitle(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getModelWizardClassName()%>_label"));<%=genModel.getNonNLS()%>
+		newFileCreationPage.setDescription(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getModelWizardClassName()%>_description"));<%=genModel.getNonNLS()%>
+		newFileCreationPage.setFileName(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getEditorClassName()%>FilenameDefaultBase") + "." + <%if (!genModel.useGenerics()) {%>(String)<%}%>FILE_EXTENSIONS.get(0));<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		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 = <%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getEditorClassName()%>FilenameDefaultBase");<%=genModel.getNonNLS()%>
+					String defaultModelFilenameExtension = <%if (!genModel.useGenerics()) {%>(String)<%}%>FILE_EXTENSIONS.get(0);
+					String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;<%=genModel.getNonNLS()%>
+					for (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i)
+					{
+						modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension;<%=genModel.getNonNLS()%>
+					}
+					newFileCreationPage.setFileName(modelFilename);
+				}
+			}
+		}
+<%}%>
+		initialObjectCreationPage = new <%=genPackage.getModelWizardClassName()%>InitialObjectCreationPage("Whatever2");<%=genModel.getNonNLS()%>
+		initialObjectCreationPage.setTitle(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_<%=genPackage.getModelWizardClassName()%>_label"));<%=genModel.getNonNLS()%>
+		initialObjectCreationPage.setDescription(<%=genPackage.getImportedEditorPluginClassName()%>.INSTANCE.getString("_UI_Wizard_initial_object_description"));<%=genModel.getNonNLS()%>
+		addPage(initialObjectCreationPage);
+	}
+
+<%if (genModel.isRichClientPlatform()) {%>
+	/**
+	 * Get the URI from the page.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public URI getModelURI()
+	{
+		return initialObjectCreationPage.getFileURI();
+	}
+
+<%} else {%>
+	/**
+	 * Get the file from the page.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IFile getModelFile()
+	{
+		return newFileCreationPage.getModelFile();
+	}
+
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxIzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxJTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxJTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._PmvxJTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._SwN_WGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._SwN_WGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PmvxIDG0Ed-kc8dEZsdm2w/method._SwN_WGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._-dcY1HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._-dcY1HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..5bdb29c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._-dcY1HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,4 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._1AYkSGKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._1AYkSGKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._1AYkSGKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D-TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D-TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..60cf2f2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D-TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,8 @@
+<%
+GenPackage genPackage = parameter;
+if (genPackage.hasConcreteClasses()) {
+new CodegenGeneratorAdapter(parameter).generateGIF("editor/ModelFile.gif", genPackage.getModelIconFileName(), genPackage.getPrefix(), null, false);
+}
+ else {
+}
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D8zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D9TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D9TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pn8D8DG0Ed-kc8dEZsdm2w/method._Pn8D9TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._-NpCRHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._-NpCRHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..6c9a61a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._-NpCRHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._0_fzeWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._0_fzeWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._0_fzeWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsEzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..163f874
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsFzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getEditorPluginDirectory();
+packageName = genModel.getEditorPluginPackageName();
+className = genModel.getEditorPluginClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsGTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsGTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..fbf5dcc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._PnCsGTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,142 @@
+
+<%
+/**
+ * Copyright (c) 2002-2004 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getEditorPluginPackageName()%>;
+
+<%genModel.addImport("org.eclipse.emf.common.EMFPlugin");%>
+<%genModel.addImport("org.eclipse.emf.common.util.ResourceLocator");%>
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This is the central singleton for the <%=genModel.getModelName()%> editor plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genModel.hasAPITags()) {%>
+ * <%=genModel.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genModel.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public final class <%=genModel.getEditorPluginClassName()%> extends EMFPlugin
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+	
+<%}%>
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getEditorPluginClassName()%> INSTANCE = new <%=genModel.getEditorPluginClassName()%>();
+	
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+	/**
+	 * 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 <%=genModel.getEditorPluginClassName()%>()
+	{
+		super
+			(new ResourceLocator [] 
+			{
+<%for (String pluginClassName : genModel.getEditResourceDelegateImportedPluginClassNames()) {%>
+				<%=pluginClassName%>.INSTANCE,
+<%}%>
+			});
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	public ResourceLocator getPluginResourceLocator()
+	{
+<%if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {%>
+		return null;
+<%} else {%>
+		return plugin;
+<%}%>
+	}
+	
+<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>
+	/**
+	 * 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 <%=genModel.getImportedName("org.eclipse.emf.common.ui.EclipseUIPlugin")%>
+	{
+		/**
+		 * Creates an instance.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+<%if (genModel.needsRuntimeCompatibility()) {%>
+		 * @param descriptor the description of the plugin.
+<%}%>
+		 * @generated
+		 */
+		public Implementation(<%if (genModel.needsRuntimeCompatibility()) {%><%=genModel.getImportedName("org.eclipse.core.runtime.IPluginDescriptor")%> descriptor<%}%>)
+		{
+			super(<%if (genModel.needsRuntimeCompatibility()) {%>descriptor<%}%>);
+	
+			// Remember the static instance.
+			//
+			plugin = this;
+		}
+	}
+
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._SwE1aGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._SwE1aGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnCsEDG0Ed-kc8dEZsdm2w/method._SwE1aGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._-P4d9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._-P4d9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..427b54c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._-P4d9HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.isRichClientPlatform());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._0_o9aWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._0_o9aWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._0_o9aWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnAzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..b0ee89b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnBzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getEditorPluginDirectory();
+packageName = genModel.getEditorPluginPackageName();
+className = genModel.getEditorAdvisorClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnCTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnCTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..9e4752d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._PnVnCTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,738 @@
+
+<%
+/**
+ * Copyright (c) 2004-2010 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%String _ListOfString = "List" + (genModel.useGenerics() ? "<String>" : "");%>
+<%String _UniqueEListOfString = "UniqueEList" + (genModel.useGenerics() ? "<String>" : "");%>
+<%String _StringBuilder = genModel.getImportedName(genModel.useGenerics() ? "java.lang.StringBuilder" : "java.lang.StringBuffer");%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getEditorPluginPackageName()%>;
+
+<%if (!genModel.isRichAjaxPlatform()) {%>
+import java.io.File;
+import java.util.Arrays;
+<%}%>
+<%if (!genModel.useGenerics()) {%>
+import java.util.Iterator;
+<%}%>
+<%if (genModel.getAllGenPackagesWithConcreteClasses().size() > 1) {%>
+import java.util.List;
+<%}%>
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+<%if (!genModel.isRichAjaxPlatform()) {%>
+import org.eclipse.swt.SWT;
+<%}%>
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+<%if (!genModel.isRichAjaxPlatform()) {%>
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+<%}%>
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+<%if (!genModel.isRichAjaxPlatform()) {%>
+import org.eclipse.ui.actions.ContributionItemFactory;
+<%}%>
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+import org.eclipse.ui.application.IWorkbenchConfigurer;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchAdvisor;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.common.ui.action.WorkbenchWindowActionDelegate;
+import org.eclipse.emf.common.util.URI;
+<%if (genModel.getAllGenPackagesWithConcreteClasses().size() > 1) {%>
+import org.eclipse.emf.common.util.UniqueEList;
+<%}%>
+import org.eclipse.emf.edit.ui.action.LoadResourceAction;
+import org.eclipse.emf.edit.ui.util.EditUIUtil;
+
+import <%=genModel.getQualifiedEditorPluginClassName()%>;
+<%genModel.markImportLocation(stringBuffer);%>
+
+
+/**
+ * Customized {@link WorkbenchAdvisor} for the RCP application.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genModel.hasAPITags()) {%>
+ * <%=genModel.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genModel.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genModel.getAllGenPackagesWithConcreteClasses())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public final class <%=genModel.getEditorAdvisorClassName()%> extends WorkbenchAdvisor
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final String copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+
+<%}%>
+<%if (!genModel.isRichAjaxPlatform()) {%>
+	/**
+	 * The default file extension filters for use in dialogs.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+  <%if (genModel.getAllGenPackagesWithConcreteClasses().size() == 1) {%>
+	private static final String[] FILE_EXTENSION_FILTERS = <%if (!genModel.useGenerics()) {%>(String[])<%}%><%=genModel.getAllGenPackagesWithConcreteClasses().get(0).getImportedEditorClassName()%>.FILE_EXTENSION_FILTERS.toArray(new String[0]);
+  <%} else {%>
+	private static final String[] FILE_EXTENSION_FILTERS = getFileExtensionFilters();
+
+	/**
+	 * Returns the default file extension filters. This method should only be used to initialize {@link #FILE_EXTENSION_FILTERS}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static String[] getFileExtensionFilters()
+	{
+		<%=_ListOfString%> result = new <%=_UniqueEListOfString%>();
+    <%for (GenPackage genPackage : genModel.getAllGenPackagesWithConcreteClasses()) {%>
+		result.addAll(<%=genPackage.getImportedEditorClassName()%>.FILE_EXTENSION_FILTERS);
+    <%}%>
+		return <%if (!genModel.useGenerics()) {%>(String[])<%}%>result.toArray(new String[0]);
+	}
+  <%}%> 
+<%}%>
+
+	/**
+	 * 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 <%=genModel.getEditorPluginClassName()%>.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 <%=genModel.getQualifiedEditorPluginClassName()%>.INSTANCE.getString(key, new Object [] { s1 });
+	}
+
+	/**
+	 * RCP's application
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class Application implements IApplication
+	{
+		/**
+		 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+		@Override
+<%}%>
+		public Object start(IApplicationContext context) throws Exception
+		{
+			WorkbenchAdvisor workbenchAdvisor = new <%=genModel.getEditorAdvisorClassName()%>();
+			Display display = PlatformUI.createDisplay();
+			try
+			{
+				int returnCode = PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
+				if (returnCode == PlatformUI.RETURN_RESTART)
+				{
+					return IApplication.EXIT_RESTART;
+				}
+				else
+				{
+					return IApplication.EXIT_OK;
+				}
+			}
+			finally
+			{
+				display.dispose();
+			}
+		}
+
+		/**
+		 * @see org.eclipse.equinox.app.IApplication#stop()
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+		@Override
+<%}%>
+		public void stop()
+		{
+			// Do nothing.
+		}
+	}
+
+	/**
+	 * RCP's perspective
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class Perspective implements IPerspectiveFactory
+	{
+		/**
+		 * Perspective ID
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public static final String ID_PERSPECTIVE = "<%=genModel.getQualifiedEditorAdvisorClassName()%>Perspective";<%=genModel.getNonNLS()%>
+
+		/**
+		 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+		@Override
+<%}%>
+		public void createInitialLayout(IPageLayout layout)
+		{
+			layout.setEditorAreaVisible(true);
+			layout.addPerspectiveShortcut(ID_PERSPECTIVE);
+
+			IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT, (float)0.66, layout.getEditorArea());<%=genModel.getNonNLS()%>
+			right.addView(IPageLayout.ID_OUTLINE);
+
+			IFolderLayout bottonRight = layout.createFolder("bottonRight", IPageLayout.BOTTOM, (float)0.60, "right");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+			bottonRight.addView(IPageLayout.ID_PROP_SHEET);
+		}
+	}
+	
+	/**
+	 * RCP's window advisor
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class WindowAdvisor extends WorkbenchWindowAdvisor
+	{
+		/**
+		 * @see WorkbenchWindowAdvisor#WorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public WindowAdvisor(IWorkbenchWindowConfigurer configurer)
+		{
+			super(configurer);
+		}
+		
+		/**
+		 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#preWindowOpen()
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		public void preWindowOpen()
+		{
+			IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+			configurer.setInitialSize(new Point(600, 450));
+			configurer.setShowCoolBar(false);
+			configurer.setShowStatusLine(true);
+			configurer.setTitle(getString("_UI_Application_title"));<%=genModel.getNonNLS()%>
+		}
+		
+		/**
+		 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)
+		{
+			return new WindowActionBarAdvisor(configurer);
+		}
+	}
+
+	/**
+	 * RCP's action bar advisor
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class WindowActionBarAdvisor extends ActionBarAdvisor
+	{
+		/**
+		 * @see ActionBarAdvisor#ActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public WindowActionBarAdvisor(IActionBarConfigurer configurer)
+		{
+			super(configurer);
+		}
+		
+		/**
+		 * @see org.eclipse.ui.application.ActionBarAdvisor#fillMenuBar(org.eclipse.jface.action.IMenuManager)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+		protected void fillMenuBar(IMenuManager menuBar)
+		{
+			IWorkbenchWindow window = getActionBarConfigurer().getWindowConfigurer().getWindow();
+			menuBar.add(createFileMenu(window));
+			menuBar.add(createEditMenu(window));
+			menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+			menuBar.add(createWindowMenu(window));
+			menuBar.add(createHelpMenu(window));					
+		}
+		
+		/**
+		 * Creates the 'File' menu.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected IMenuManager createFileMenu(IWorkbenchWindow window)
+		{
+			IMenuManager menu = new MenuManager(getString("_UI_Menu_File_label"),<%=genModel.getNonNLS()%>
+			IWorkbenchActionConstants.M_FILE);    
+			menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));
+	
+			IMenuManager newMenu = new MenuManager(getString("_UI_Menu_New_label"), "new");<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+			newMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+	
+			menu.add(newMenu);
+			menu.add(new Separator());
+			menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+			menu.add(new Separator());
+			addToMenuAndRegister(menu, ActionFactory.CLOSE.create(window));
+			addToMenuAndRegister(menu, ActionFactory.CLOSE_ALL.create(window));
+			menu.add(new Separator());
+			addToMenuAndRegister(menu, ActionFactory.SAVE.create(window));
+			addToMenuAndRegister(menu, ActionFactory.SAVE_AS.create(window));
+			addToMenuAndRegister(menu, ActionFactory.SAVE_ALL.create(window));
+			menu.add(new Separator());
+			addToMenuAndRegister(menu, ActionFactory.QUIT.create(window));
+			menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));
+			return menu;
+		}
+
+		/**
+		 * Creates the 'Edit' menu.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected IMenuManager createEditMenu(IWorkbenchWindow window)
+		{
+			IMenuManager menu = new MenuManager(getString("_UI_Menu_Edit_label"),<%=genModel.getNonNLS()%>
+			IWorkbenchActionConstants.M_EDIT);
+			menu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_START));
+	
+			addToMenuAndRegister(menu, ActionFactory.UNDO.create(window));
+			addToMenuAndRegister(menu, ActionFactory.REDO.create(window));
+			menu.add(new GroupMarker(IWorkbenchActionConstants.UNDO_EXT));
+			menu.add(new Separator());
+	
+			addToMenuAndRegister(menu, ActionFactory.CUT.create(window));
+			addToMenuAndRegister(menu, ActionFactory.COPY.create(window));
+			addToMenuAndRegister(menu, ActionFactory.PASTE.create(window));
+			menu.add(new GroupMarker(IWorkbenchActionConstants.CUT_EXT));
+			menu.add(new Separator());
+	
+			addToMenuAndRegister(menu, ActionFactory.DELETE.create(window));
+			addToMenuAndRegister(menu, ActionFactory.SELECT_ALL.create(window));
+			menu.add(new Separator());
+	
+			menu.add(new GroupMarker(IWorkbenchActionConstants.ADD_EXT));
+	
+			menu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_END));
+			menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+			return menu;
+		}
+	
+		/**
+		 * Creates the 'Window' menu.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected IMenuManager createWindowMenu(IWorkbenchWindow window)
+		{
+			IMenuManager menu = new MenuManager(getString("_UI_Menu_Window_label"),<%=genModel.getNonNLS()%>
+			IWorkbenchActionConstants.M_WINDOW);
+	
+			addToMenuAndRegister(menu, ActionFactory.OPEN_NEW_WINDOW.create(window));
+			menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+<%if (!genModel.isRichAjaxPlatform()) {%>
+			menu.add(ContributionItemFactory.OPEN_WINDOWS.create(window));
+<%}%>
+	
+			return menu;
+		}
+	
+		/**
+		 * Creates the 'Help' menu.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected IMenuManager createHelpMenu(IWorkbenchWindow window)
+		{
+			IMenuManager menu = new MenuManager(getString("_UI_Menu_Help_label"), IWorkbenchActionConstants.M_HELP);<%=genModel.getNonNLS()%>
+			// Welcome or intro page would go here
+			// Help contents would go here
+			// Tips and tricks page would go here
+			menu.add(new GroupMarker(IWorkbenchActionConstants.HELP_START));
+			menu.add(new GroupMarker(IWorkbenchActionConstants.HELP_END));
+			menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+			return menu;
+		}
+		
+		/**
+		 * Adds the specified action to the given menu and also registers the action with the
+		 * action bar configurer, in order to activate its key binding.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		protected void addToMenuAndRegister(IMenuManager menuManager, IAction action)
+		{
+			menuManager.add(action);
+			getActionBarConfigurer().registerGlobalAction(action);
+		}
+	}
+	
+	/**
+	 * About action for the RCP application.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class AboutAction extends WorkbenchWindowActionDelegate
+	{
+		/**
+		 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+		@Override
+<%}%>
+		public void run(IAction action)
+		{
+			MessageDialog.openInformation(getWindow().getShell(), getString("_UI_About_title"),<%=genModel.getNonNLS()%>
+			getString("_UI_About_text"));<%=genModel.getNonNLS()%>
+		}
+	}
+	
+<%if (!genModel.isRichAjaxPlatform()) {%>
+	/**
+	 * Open action for the objects from the <%=genModel.getModelName()%> model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class OpenAction extends WorkbenchWindowActionDelegate
+	{
+		/**
+		 * Opens the editors for the files selected using the file dialog.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+		@Override
+<%}%>
+		public void run(IAction action)
+		{
+			String[] filePaths = openFilePathDialog(getWindow().getShell(), SWT.OPEN, null);
+			if (filePaths.length > 0)
+			{
+				openEditor(getWindow().getWorkbench(), URI.createFileURI(filePaths[0]));
+			}
+		}
+	}
+<%}%>
+	
+	/**
+	 * Open URI action for the objects from the <%=genModel.getModelName()%> model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class OpenURIAction extends WorkbenchWindowActionDelegate
+	{
+		/**
+		 * Opens the editors for the files selected using the LoadResourceDialog.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+<%if (genModel.useInterfaceOverrideAnnotation()){%>
+		@Override
+<%}%>
+		public void run(IAction action)
+		{
+			LoadResourceAction.LoadResourceDialog loadResourceDialog = new LoadResourceAction.LoadResourceDialog(getWindow().getShell());
+			if (Window.OK == loadResourceDialog.open())
+			{
+<%if (genModel.useGenerics()) {%>
+				for (URI uri : loadResourceDialog.getURIs())
+				{
+					openEditor(getWindow().getWorkbench(), uri);
+				}
+<%} else {%>
+				for (Iterator i = loadResourceDialog.getURIs().iterator(); i.hasNext();)
+				{
+					openEditor(getWindow().getWorkbench(), (URI)i.next());
+				}
+<%}%>
+			}
+		}
+	}
+	
+<%if (!genModel.isRichAjaxPlatform()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static String[] openFilePathDialog(Shell shell, int style, String[] fileExtensionFilters)
+	{
+		return openFilePathDialog(shell, style, fileExtensionFilters, (style & SWT.OPEN) != 0, (style & SWT.OPEN) != 0, (style & SWT.SAVE) != 0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static String[] openFilePathDialog(Shell shell, int style, String[] fileExtensionFilters, boolean includeGroupFilter, boolean includeAllFilter, boolean addExtension)
+	{
+		FileDialog fileDialog = new FileDialog(shell, style);
+		if (fileExtensionFilters == null)
+		{
+			fileExtensionFilters = FILE_EXTENSION_FILTERS;
+		}
+		
+		// If requested, augment the file extension filters by adding a group of all the other filters (*.ext1;*.ext2;...)
+		// at the beginning and/or an all files wildcard (*.*) at the end.
+		//
+		includeGroupFilter &= fileExtensionFilters.length > 1;
+		int offset = includeGroupFilter ? 1 : 0;
+		
+		if (includeGroupFilter || includeAllFilter)
+		{
+			int size = fileExtensionFilters.length + offset + (includeAllFilter ? 1 : 0);
+			String[] allFilters = new String[size];
+			<%=_StringBuilder%> group = includeGroupFilter ? new <%=_StringBuilder%>() : null;
+			
+			for (int i = 0; i < fileExtensionFilters.length; i++)
+			{
+				if (includeGroupFilter)
+				{
+					if (i != 0)
+					{
+						group.append(';');
+					}
+					group.append(fileExtensionFilters[i]);
+				}
+				allFilters[i + offset] = fileExtensionFilters[i];
+			}
+			
+			if (includeGroupFilter)
+			{
+				allFilters[0] = group.toString();
+			}
+			if (includeAllFilter)
+			{
+				allFilters[allFilters.length - 1] = "*.*";<%=genModel.getNonNLS()%>
+			}
+			
+			fileDialog.setFilterExtensions(allFilters);
+		}
+		else
+		{
+			fileDialog.setFilterExtensions(fileExtensionFilters);
+		}
+		fileDialog.open();
+		
+		String[] filenames = fileDialog.getFileNames();
+		String[] result = new String[filenames.length];
+		String path = fileDialog.getFilterPath() + File.separator;
+		String extension = null;
+		
+		// If extension adding requested, get the dotted extension corresponding to the selected filter.
+		//
+		if (addExtension)
+		{
+			int i = fileDialog.getFilterIndex();
+			if (i != -1 && (!includeAllFilter || i != fileExtensionFilters.length))
+			{
+				i = includeGroupFilter && i == 0 ? 0 : i - offset;
+				String filter = fileExtensionFilters[i];
+				int dot = filter.lastIndexOf('.');
+				if (dot == 1 && filter.charAt(0) == '*')
+				{
+					extension = filter.substring(dot);
+				}
+			}
+		}
+		
+		// Build the result by adding the selected path and, if needed, auto-appending the extension.
+		//
+		for (int i = 0; i < filenames.length; i++)
+		{
+			String filename = path + filenames[i];
+			if (extension != null)
+			{
+				int dot = filename.lastIndexOf('.');
+				if (dot == -1 || !Arrays.asList(fileExtensionFilters).contains("*" + filename.substring(dot)))<%=genModel.getNonNLS()%>
+				{
+					filename += extension;
+				}
+			}
+			result[i] = filename;
+		}
+		return result;
+	}
+<%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static boolean openEditor(IWorkbench workbench, URI uri)
+	{
+		IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+		IWorkbenchPage page = workbenchWindow.getActivePage();
+		
+		IEditorDescriptor editorDescriptor = EditUIUtil.getDefaultEditor(uri, null);
+		if (editorDescriptor == null)
+		{
+			MessageDialog.openError(
+				workbenchWindow.getShell(),
+				getString("_UI_Error_title"),<%=genModel.getNonNLS()%>
+				getString("_WARN_No_Editor", uri.lastSegment()));<%=genModel.getNonNLS()%>
+			return false;
+		}
+		else
+		{
+			try
+			{
+				page.openEditor(new URIEditorInput(uri), editorDescriptor.getId());
+			}
+			catch (PartInitException exception)
+			{
+				MessageDialog.openError(
+					workbenchWindow.getShell(),
+					getString("_UI_OpenEditorError_label"),<%=genModel.getNonNLS()%>
+					exception.getMessage());
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * @see org.eclipse.ui.application.WorkbenchAdvisor#getInitialWindowPerspectiveId()
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+	public String getInitialWindowPerspectiveId()
+	{
+		return Perspective.ID_PERSPECTIVE;
+	}
+
+	/**
+	 * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize(org.eclipse.ui.application.IWorkbenchConfigurer)
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+	public void initialize(IWorkbenchConfigurer configurer)
+	{
+		super.initialize(configurer);
+		configurer.setSaveAndRestore(true);
+	}
+	
+	/**
+	 * @see org.eclipse.ui.application.WorkbenchAdvisor#createWorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+		@Override
+<%}%>
+	public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)
+	{
+		return new WindowAdvisor(configurer);
+	}
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._Sv7EaGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._Sv7EaGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnVnADG0Ed-kc8dEZsdm2w/method._Sv7EaGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._-bppFHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._-bppFHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..5bdb29c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._-bppFHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,4 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._1AiVSGKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._1AiVSGKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._1AiVSGKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJAzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJBTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJBTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJBTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJCTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJCTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..f5168ad
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PnpJADG0Ed-kc8dEZsdm2w/method._PnpJCTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,8 @@
+<%
+GenPackage genPackage = parameter;
+if (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard()) {
+new CodegenGeneratorAdapter(parameter).generateGIF("editor/NewModel.gif", genPackage.getModelWizardIconFileName(), genPackage.getPrefix(), null, false);
+}
+ else {
+}
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._-e7mmHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._-e7mmHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..579cb47
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._-e7mmHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (genModel.isBundleManifest()) && (!genModel.sameModelTestsProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._1BIyOWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._1BIyOWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._1BIyOWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b0zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..07bdc33
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b1zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getTestsProjectDirectory() + "/META-INF/MANIFEST.MF";
+overwrite = genModel.isUpdateClasspath();
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b2TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b2TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..f0387b6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._Po1b2TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,48 @@
+
+<%
+/**
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: <%=genModel.getTestsBundleNameKey()%>
+Bundle-SymbolicName: <%=genModel.getTestsPluginID()%>;singleton:=true
+Automatic-Module-Name: <%=genModel.getTestsPluginID()%>
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: <%if (genModel.isRuntimeJar()) {%><%=genModel.getTestsPluginID()%>.jar<%}else{%>.<%}%>
+Bundle-Vendor: <%=genModel.getTestsBundleVendorKey()%>
+Bundle-Localization: <%=genModel.getTestsBundleLocalization()%>
+<%if (genModel.getComplianceLevel() == GenJDKLevel.JDK50_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK60_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK70_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK80_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK90_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-9
+<%} else if (genModel.getComplianceLevel() == GenJDKLevel.JDK100_LITERAL) {%>
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+<%}%>
+<%Iterator<String> packagesIterator = genModel.getTestsQualifiedPackageNames().iterator(); if (packagesIterator.hasNext()) { String pack = packagesIterator.next();%>
+Export-Package: <%=pack%><%while(packagesIterator.hasNext()) { pack = packagesIterator.next();%>,
+ <%=pack%><%}%>
+<%}%>
+<%Iterator<String> requiredPluginIterator = genModel.getTestsRequiredPlugins().iterator(); if (requiredPluginIterator.hasNext()) { String pluginID = requiredPluginIterator.next();%>
+Require-Bundle: <%=pluginID%><%if (!pluginID.startsWith("org.eclipse.core.runtime")){%>;visibility:=reexport<%} while(requiredPluginIterator.hasNext()) { pluginID = requiredPluginIterator.next();%>,
+ <%=pluginID%><%if (!pluginID.startsWith("org.eclipse.core.runtime") && !pluginID.equals("org.eclipse.xtext.xbase.lib") && !pluginID.equals("org.eclipse.emf.ecore.xcore.lib")) {%>;visibility:=reexport<%}}%>
+<%}%>
+<%if (genModel.getRuntimeVersion() == GenRuntimeVersion.EMF22 || genModel.getRuntimeVersion() == GenRuntimeVersion.EMF23) {%>
+Eclipse-LazyStart: true
+<%}%>
+Bundle-ActivationPolicy: lazy
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._SxRIOGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._SxRIOGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Po1b0DG0Ed-kc8dEZsdm2w/method._SxRIOGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._-pXU9HLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._-pXU9HLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..11b8a25
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._-pXU9HLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) && (!(genModel.isBundleManifest())) && (!genModel.sameModelTestsProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._1A1QOWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._1A1QOWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._1A1QOWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-5jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6DG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6DG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6DG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..8535ba5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-6jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getTestsProjectDirectory() + "/plugin.xml";
+overwrite = true;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-7DG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-7DG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..fb9be3a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._PoO-7DG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,46 @@
+
+<%
+/**
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<%if (genModel.isBundleManifest()) {%>
+<plugin>
+<%} else {%>
+<plugin
+      name="%pluginName"
+      id="<%=genModel.getTestsPluginID()%>"
+      version="1.0.0"
+      provider-name="%providerName">
+
+   <requires>
+  <%for (String pluginID : genModel.getTestsRequiredPlugins()) {%>
+      <import plugin="<%=pluginID%>"<%if (!pluginID.startsWith("org.eclipse.core.runtime")) {%> export="true"<%}%>/>
+  <%}%>
+   </requires>
+
+   <runtime>
+  <%if (genModel.isRuntimeJar()) {%>
+      <library name="<%=genModel.getTestsPluginID()%>.jar">
+  <%} else {%>
+      <library name=".">
+  <%}%>
+         <export name="*"/>
+      </library>
+   </runtime>
+
+<%}%>
+</plugin>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._SxaSKGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._SxaSKGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoO-4zG0Ed-kc8dEZsdm2w/method._SxaSKGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._-iWuBHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._-iWuBHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e5fc461
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._-iWuBHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (!genModel.sameModelTestsProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._1AsGTWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._1AsGTWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._1AsGTWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4jG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4jG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4jG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv4zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5TG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5zG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5zG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..33fc1e0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv5zG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getTestsProjectDirectory() + "/build.properties";
+overwrite = false;
+encoding = "ISO-8859-1";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv6TG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv6TG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..24484d2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._PoYv6TG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,33 @@
+
+<%
+/**
+ * Copyright (c) 2005-2008 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%String pluginClassesLocation = genModel.isRuntimeJar() ? genModel.getTestsPluginID()+".jar" : ".";%>
+<%List<String> sourceFolders = genModel.getTestsSourceFolders();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+bin.includes = <%=pluginClassesLocation%>,\
+<%if (genModel.isBundleManifest()) {%>
+               META-INF/,\
+<%} else {%>
+               plugin.xml,\
+<%}%>
+<%String testsBundleLocalization = genModel.getTestsBundleLocalization(); int index = testsBundleLocalization.indexOf("/"); if (index == -1) {%>
+               <%=testsBundleLocalization%>.properties
+<%} else {%>
+               <%=testsBundleLocalization.substring(0, index + 1)%>
+<%}%>
+jars.compile.order = <%=pluginClassesLocation%>
+<% boolean first=true; for (Iterator<String> i = sourceFolders.iterator(); i.hasNext();) { String sourceFolder = i.next(); if (i.hasNext()){sourceFolder +=",\\";} if (first) {%>
+source.<%=pluginClassesLocation%> = <%=sourceFolder%><%first=false;} else {%><%=sourceFolder%><%}}%>
+output.<%=pluginClassesLocation%> = bin/
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._SxHXPGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._SxHXPGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PoYv4DG0Ed-kc8dEZsdm2w/method._SxHXPGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._-w9xxHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._-w9xxHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..beedc08
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._-w9xxHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenClass genClass = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && true;
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._1BuoGWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._1BuoGWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._1BuoGWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ojG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ojG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ojG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ozG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ozG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39ozG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39pTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39pTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Pp39pTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuoDG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuoDG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e93b9a5
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuoDG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenClass genClass = parameter;
+targetPath = genClass.getGenModel().getTestsDirectory();
+packageName = genClass.getGenPackage().getTestsPackageName();
+className = genClass.getTestCaseClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuojG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuojG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..0b6232d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._PqBuojG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,193 @@
+
+<%
+/**
+ * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenClass genClass = (GenClass)argument; GenPackage genPackage = genClass.getGenPackage(); GenModel genModel=genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getTestsPackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
+ * <!-- end-user-doc -->
+<%if (!genClass.getImplementedGenFeatures().isEmpty()) { boolean first = true;%>
+  <%for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {%>
+    <%if (genFeature.isTested() && !genFeature.isSuppressedGetVisibility()) {%>
+      <%if (first) { first = false;%>
+ * <p>
+ * The following features are tested:
+ * <ul>
+      <%}%>
+ *   <li>{@link <%=genFeature.getGenClass().getRawQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}</li>
+    <%}%>
+  <%}%>
+  <% if (!first) {%>
+ * </ul>
+ * </p>
+  <%}%>
+<%}%>
+<%if (!genClass.getImplementedGenOperations().isEmpty()) { boolean first = true;%>
+  <%for (GenOperation genOperation : genClass.getImplementedGenOperations()) {%>
+    <%if (first) { first = false;%>
+ * <p>
+ * The following operations are tested:
+ * <ul>
+    <%}%>
+ *   <li>{@link <%=genOperation.getGenClass().getRawQualifiedInterfaceName()%>#<%=genOperation.getName()%>(<%=genOperation.getParameterTypes(", ")%>) <em><%=genOperation.getFormattedName()%></em>}</li>
+  <%}%>
+  <% if (!first) {%>
+ * </ul>
+ * </p>
+  <%}%>
+<%}%>
+<%if (genClass.hasImplicitAPITags()) {%>
+ * <%=genClass.getImplicitAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genClass.hasImplicitAPIDeprecatedTag()) {%>
+@Deprecated
+<%}%>
+public<%if (genClass.isAbstract()) {%> abstract<%}%> class <%=genClass.getTestCaseClassName()%> extends <%=genClass.isModelRoot() ? genModel.getImportedName("junit.framework.TestCase") : genClass.getClassExtendsGenClass().getImportedTestCaseClassName()%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+<%}%>
+<%if (genModel.getDriverNumber() != null) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> mofDriverNumber = "<%=genModel.getDriverNumber()%>";<%=genModel.getNonNLS()%>
+<%}%>
+<%if (genClass.isModelRoot()) {%>
+
+	/**
+	 * The fixture for this <%=genClass.getFormattedName()%> test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected <%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%> fixture = null;
+<%}%>
+<%if (!genClass.isAbstract()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args)
+	{
+		<%=genModel.getImportedName("junit.textui.TestRunner")%>.run(<%=genClass.getTestCaseClassName()%>.class);
+	}
+<%}%>
+
+	/**
+	 * Constructs a new <%=genClass.getFormattedName()%> test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genClass.getTestCaseClassName()%>(String name)
+	{
+		super(name);
+	}
+<%if (genClass.isModelRoot()) {%>
+
+	/**
+	 * Sets the fixture for this <%=genClass.getFormattedName()%> test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%> fixture)
+	{
+		this.fixture = fixture;
+	}
+<%}%>
+
+	/**
+	 * Returns the fixture for this <%=genClass.getFormattedName()%> test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+<%if (!genClass.isModelRoot() && genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	<%if (genModel.useGenerics()) {%>protected<%} else {%>private<%}%> <%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%> getFixture()
+	{
+<%if (genClass.isModelRoot()) {%>
+		return fixture;
+<%} else {%>
+		return (<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)fixture;
+<%}%>
+	}
+<%if (!genClass.isAbstract()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+<%if (genModel.useGenerics() && genClass.isMapEntry()) {%>
+	@SuppressWarnings("unchecked")
+<%}%>
+	protected void setUp() throws Exception
+	{
+  <%if (genClass.isMapEntry()) {%>
+		setFixture((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)<%=genPackage.getQualifiedEFactoryInternalInstanceAccessor()%>.create(<%=genClass.getQualifiedClassifierAccessor()%>));
+  <%} else {%>
+		setFixture(<%=genPackage.getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=genClass.getName()%>());
+  <%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+<%if (genModel.useClassOverrideAnnotation()) {%>
+	@Override
+<%}%>
+	protected void tearDown() throws Exception
+	{
+		setFixture(null);
+	}
+<%}%>
+<%for (GenFeature genFeature : genClass.getImplementedGenFeatures()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenFeature.override" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/implementedGenFeature.override.javajetinc%>
+<%}%>
+<%for (GenOperation genOperation : genClass.getImplementedGenOperations()) {%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.implementedGenOperation.override" args="genOperation:genOperation,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%><%//TestCase/implementedGenOperation.override.javajetinc%>
+<%}%>
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.tests.call.TestCase.TestCase.insert" args="genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>
+} //<%=genClass.getTestCaseClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Sx2-GGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Sx2-GGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..671872d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pp39oDG0Ed-kc8dEZsdm2w/method._Sx2-GGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenClass genClass = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._-uRqJHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._-uRqJHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..e5fc461
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._-uRqJHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (!genModel.sameModelTestsProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._1BR8KWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._1BR8KWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._1BR8KWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCsjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCsjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCsjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCszG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCszG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCszG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d5cf19c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCtzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getTestsProjectDirectory() + "/" + genModel.getTestsBundleLocalization()+ ".properties";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCuTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCuTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..9d89de6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._PplCuTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,18 @@
+
+<%
+/**
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>
+
+pluginName = <%=genModel.getTestsBundleName()%>
+providerName = <%=genModel.getTestsBundleVendorName()%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._SxkDKGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._SxkDKGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PplCsDG0Ed-kc8dEZsdm2w/method._SxkDKGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._-7Y5FHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._-7Y5FHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..92700a9
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._-7Y5FHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (genModel.hasTestSuiteClass());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._1BbtKWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._1BbtKWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._1BbtKWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fcjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fcjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fcjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fczG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fczG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fczG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..4ef1855
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6fdzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getTestsDirectory();
+packageName = genModel.getTestSuitePackageName();
+className = genModel.getTestSuiteClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6feTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6feTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..578a983
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._Pq6feTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,87 @@
+
+<%
+/**
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getTestSuitePackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b><%=genModel.getModelName()%></b></em>' model.
+ * <!-- end-user-doc -->
+<%if (genModel.hasAPITags()) {%>
+ * <%=genModel.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genModel.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50) {
+  boolean needsSuppressDeprecation = false;
+  LOOP: for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) { if (genPackage.hasTests()) { for (GenClass genClass : genPackage.getGenClasses()) { if (!genClass.isExternalInterface() && !genClass.isAbstract() && genClass.hasTests() && genClass.hasImplicitAPIDeprecatedTag()) { needsSuppressDeprecation = true; break LOOP; }}}}
+  if (needsSuppressDeprecation) {%>
+@SuppressWarnings("deprecation")
+<%}}%>
+public class <%=genModel.getTestSuiteClassName()%> extends <%=genModel.getImportedName("junit.framework.TestSuite")%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+<%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args)
+	{
+		<%=genModel.getImportedName("junit.textui.TestRunner")%>.run(suite());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static <%=genModel.getImportedName("junit.framework.Test")%> suite()
+	{
+		<%=genModel.getImportedName("junit.framework.TestSuite")%> suite = new <%=genModel.getTestSuiteClassName()%>("<%=genModel.getModelName()%> Tests");<%=genModel.getNonNLS()%>
+<%for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.hasTests()) {%>
+		suite.addTest(<%=genModel.getImportedName(genPackage.getImportedTestSuiteClassName())%>.suite());
+  <%}%>
+<%}%>
+		return suite;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genModel.getTestSuiteClassName()%>(String name)
+	{
+		super(name);
+	}
+
+} //<%=genModel.getTestSuiteClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._SyAvGGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._SyAvGGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Pq6fcDG0Ed-kc8dEZsdm2w/method._SyAvGGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._-0r0JHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._-0r0JHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..41ab56a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._-0r0JHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers() && genPackage.isGenerateExampleClass());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._1Bk3GWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._1Bk3GWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._1Bk3GWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeakzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..6faeced
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqealzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getTestsDirectory();
+packageName = genPackage.getTestsPackageName();
+className = genPackage.getExampleClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeamTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeamTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..b631d3d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._PqeamTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,210 @@
+
+<%
+/**
+ * Copyright (c) 2005-2007 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel = genPackage.getGenModel();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%
+String _System = genModel.getImportedName("java.lang.System");
+String _String = genModel.getImportedName("java.lang.String");
+String _RuntimeException = genModel.getImportedName("java.lang.RuntimeException");
+String _File = genModel.getImportedName("java.io.File");
+String _Iterator = null;
+if (!genModel.useGenerics()) {
+  _Iterator = genModel.getImportedName("java.util.Iterator");
+}
+String _Diagnostic = genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic");
+String _URI = genModel.getImportedName("org.eclipse.emf.common.util.URI");
+String _EObject = genModel.getImportedName("org.eclipse.emf.ecore.EObject");
+String _Diagnostician = genModel.getImportedName("org.eclipse.emf.ecore.util.Diagnostician");
+String _Resource = genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource");
+String _ResourceSet = genModel.getImportedName("org.eclipse.emf.ecore.resource.ResourceSet");
+String _ResourceSetImpl = genModel.getImportedName("org.eclipse.emf.ecore.resource.impl.ResourceSetImpl");
+%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getTestsPackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * A sample utility for the '<em><b><%=genPackage.getPackageName()%></b></em>' package.
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && genPackage.getRootClass() != null && genPackage.getRootClass().hasAPIDeprecatedTag()) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public class <%=genPackage.getExampleClassName()%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=_String%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+	
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * Load all the argument file paths or URIs as instances of the model.
+	 * <!-- end-user-doc -->
+	 * @param args the file paths or URIs.
+	 * @generated
+	 */
+	public static void main(String[] args)
+	{
+		// Create a resource set to hold the resources.
+		//
+		<%=_ResourceSet%> resourceSet = new <%=_ResourceSetImpl%>();
+		
+<%if (genPackage.isContentType()) {%>
+		// Register the appropriate resource factory to handle the content type.
+		//
+		resourceSet.getResourceFactoryRegistry().getContentTypeToFactoryMap().put
+			(<%=genPackage.getImportedPackageInterfaceName()%>.eCONTENT_TYPE,
+			 new <%=genModel.getImportedName(genPackage.getQualifiedEffectiveResourceFactoryClassName())%>());
+		
+		// Register the appropriate content handler for all file extensions and any element from the package's namespace.
+		//
+		resourceSet.getURIConverter().getContentHandlers().add
+			(new <%=genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl")%>(<%=genPackage.getImportedPackageInterfaceName()%>.eCONTENT_TYPE, null, null, <%if (genPackage.hasTargetNamespace()) {%><%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI<%} else {%>(<%=_String%>)null<%}%>, null));
+<%} else {%>
+		// Register the appropriate resource factory to handle all file extensions.
+		//
+		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
+			(Resource.Factory.Registry.DEFAULT_EXTENSION, 
+			 new <%=genModel.getImportedName(genPackage.getQualifiedEffectiveResourceFactoryClassName())%>());
+<%}%>
+
+		// Register the package to ensure it is available during loading.
+		//
+		resourceSet.getPackageRegistry().put
+			(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI, 
+			 <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE);
+        
+		// If there are no arguments, emit an appropriate usage message.
+		//
+		if (args.length == 0)
+		{
+<%if (genPackage.getRootClass() != null) { GenClass rootClass = genPackage.getRootClass();%>
+			System.out.println("Enter a list of file paths or URIs that have content like this:");<%=genModel.getNonNLS()%>
+			try
+			{
+  <%if (genPackage.isContentType()) {%>
+				<%=_Resource%> resource = resourceSet.createResource(<%=_URI%>.createURI("http:///My.<%=genPackage.getFileExtension()%>"), <%=genPackage.getImportedPackageInterfaceName()%>.eCONTENT_TYPE);<%=genModel.getNonNLS()%>
+  <%} else {%>
+				<%=_Resource%> resource = resourceSet.createResource(<%=_URI%>.createURI("http:///My.<%=genPackage.getFileExtension()%>"));<%=genModel.getNonNLS()%>
+  <%}%>
+  <%if (genPackage.getRootFeature() != null) { GenFeature rootFeature = genPackage.getRootFeature(); GenClass documentRoot = rootFeature.getGenClass();%>
+				<%=documentRoot.getImportedInterfaceName()%> documentRoot = <%=genPackage.getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=documentRoot.getName()%>();
+				<%=rootClass.getImportedInterfaceName()%> root = <%=rootClass.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=rootClass.getName()%>();
+    <%if (documentRoot.isDynamic()) {%>
+				documentRoot.eSet(<%=rootFeature.getQualifiedFeatureAccessor()%>, root);
+    <%} else {%>
+				documentRoot.set<%=rootFeature.getCapName()%>(root);
+    <%}%>
+				resource.getContents().add(<%if (!documentRoot.isEObjectExtension()){%>(<%=_EObject%>)<%}%>documentRoot);
+  <%} else {%>
+				<%=rootClass.getImportedInterfaceName()%><%=rootClass.getInterfaceWildTypeArguments()%> root = <%=rootClass.getGenPackage().getQualifiedEFactoryInternalInstanceAccessor()%>.create<%=rootClass.getName()%>();
+				resource.getContents().add(<%if (!rootClass.isEObjectExtension()){%>(<%=_EObject%>)<%}%>root);
+  <%}%>
+				resource.save(<%=_System%>.out, null);
+			}
+			catch (<%=genModel.getImportedName("java.io.IOException")%> exception) 
+			{
+				exception.printStackTrace();
+			}
+<%} else {%>
+			System.out.println("Enter a list of file paths or URIs");
+<%}%>
+		}
+		else
+		{
+			// Iterate over all the arguments.
+			//
+			for (int i = 0; i < args.length; ++i)
+			{
+				// Construct the URI for the instance file.
+				// The argument is treated as a file path only if it denotes an existing file.
+				// Otherwise, it's directly treated as a URL.
+				//
+				<%=_File%> file = new <%=_File%>(args[i]);
+				<%=_URI%> uri = file.isFile() ? <%=_URI%>.createFileURI(file.getAbsolutePath()): URI.createURI(args[i]);
+
+				try
+				{
+					// Demand load resource for this file.
+					//
+					<%=_Resource%> resource = resourceSet.getResource(uri, true);
+					System.out.println("Loaded " + uri);<%=genModel.getNonNLS()%>
+
+					// Validate the contents of the loaded resource.
+					//
+<%if (genModel.useGenerics()) {%>
+					for (<%=_EObject%> eObject : resource.getContents())
+<%} else {%>
+					for (<%=_Iterator%> j = resource.getContents().iterator(); j.hasNext(); )
+<%}%>
+					{
+<%if (!genModel.useGenerics()) {%>
+						<%=_EObject%> eObject = (<%=_EObject%>)j.next();
+<%}%>
+						<%=_Diagnostic%> diagnostic = <%=_Diagnostician%>.INSTANCE.validate(eObject);
+						if (diagnostic.getSeverity() != Diagnostic.OK)
+						{
+							printDiagnostic(diagnostic, "");<%=genModel.getNonNLS()%>
+						}
+					}
+				}
+				catch (<%=_RuntimeException%> exception) 
+				{
+					System.out.println("Problem loading " + uri);<%=genModel.getNonNLS()%>
+					exception.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	/**
+	 * <!-- begin-user-doc -->
+	 * Prints diagnostics with indentation.
+	 * <!-- end-user-doc -->
+	 * @param diagnostic the diagnostic to print.
+	 * @param indent the indentation for printing.
+	 * @generated
+	 */
+	protected static void printDiagnostic(Diagnostic diagnostic, String indent)
+	{
+		System.out.print(indent);
+		System.out.println(diagnostic.getMessage());
+<%if (genModel.useGenerics()) {%>
+		for (Diagnostic child : diagnostic.getChildren())
+		{
+			printDiagnostic(child, indent + "  ");<%=genModel.getNonNLS()%>
+		}
+<%} else {%>
+		for (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); )
+		{
+			printDiagnostic((Diagnostic)i.next(), indent + "  ");<%=genModel.getNonNLS()%>
+		}
+<%}%>
+	}
+
+} //<%=genPackage.getExampleClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._Sxt0KGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._Sxt0KGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PqeakDG0Ed-kc8dEZsdm2w/method._Sxt0KGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._-5ATdHLYEd-09ds9dfYpFw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._-5ATdHLYEd-09ds9dfYpFw.pt
new file mode 100644
index 0000000..cca9836
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._-5ATdHLYEd-09ds9dfYpFw.pt
@@ -0,0 +1,5 @@
+GenPackage genPackage = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.TestsProject");
+canGenerate = canGenerate && (genPackage.hasClassifiers());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._1B4ZGWKMEd-_wNQtGaQ-lw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._1B4ZGWKMEd-_wNQtGaQ-lw.pt
new file mode 100644
index 0000000..7d63b7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._1B4ZGWKMEd-_wNQtGaQ-lw.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getTestsDirectory(), genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBcjG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBcjG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBcjG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBczG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBczG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBczG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdTG0Ed-kc8dEZsdm2w.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdzG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdzG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..de41b71
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBdzG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,6 @@
+<%
+GenPackage genPackage = parameter;
+targetPath = genPackage.getGenModel().getTestsDirectory();
+packageName = genPackage.getTestsPackageName();
+className = genPackage.getTestSuiteClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBeTG0Ed-kc8dEZsdm2w.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBeTG0Ed-kc8dEZsdm2w.pt
new file mode 100644
index 0000000..9d1099c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._PrOBeTG0Ed-kc8dEZsdm2w.pt
@@ -0,0 +1,87 @@
+
+<%
+/**
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   IBM - Initial API and implementation
+ */
+%>
+<%GenPackage genPackage = (GenPackage)argument; GenModel genModel = genPackage.getGenModel(); /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genPackage.getTestsPackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b><%=genPackage.getPackageName()%></b></em>' package.
+ * <!-- end-user-doc -->
+<%if (genPackage.hasAPITags()) {%>
+ * <%=genPackage.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50) {
+  boolean needsSuppressDeprecation = false;
+  for (GenClass genClass : genPackage.getGenClasses()) { if (!genClass.isExternalInterface() && !genClass.isAbstract() && genClass.hasTests() && genClass.hasImplicitAPIDeprecatedTag()) { needsSuppressDeprecation = true; break; }} 
+  if (needsSuppressDeprecation) {%>
+@SuppressWarnings("deprecation")
+<%}}%>
+public class <%=genPackage.getTestSuiteClassName()%> extends <%=genModel.getImportedName("junit.framework.TestSuite")%>
+{
+<%if (genModel.hasCopyrightField()) {%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+<%}%>
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args)
+	{
+		<%=genModel.getImportedName("junit.textui.TestRunner")%>.run(suite());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static <%=genModel.getImportedName("junit.framework.Test")%> suite()
+	{
+		<%=genModel.getImportedName("junit.framework.TestSuite")%> suite = new <%=genPackage.getTestSuiteClassName()%>("<%=genPackage.getPackageName()%> Tests");<%=genModel.getNonNLS()%>
+<%for (GenClass genClass : genPackage.getGenClasses()) {%>
+  <%if (!genClass.isExternalInterface() && !genClass.isAbstract() && genClass.hasTests()) {%>
+		suite.addTestSuite(<%=genClass.getImportedTestCaseClassName()%>.class);
+  <%}%>
+<%}%>
+		return suite;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public <%=genPackage.getTestSuiteClassName()%>(String name)
+	{
+		super(name);
+	}
+
+} //<%=genPackage.getTestSuiteClassName()%>
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._SyKgGGKPEd-2a5uccsiuZA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._SyKgGGKPEd-2a5uccsiuZA.pt
new file mode 100644
index 0000000..6c7369f
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._PrOBcDG0Ed-kc8dEZsdm2w/method._SyKgGGKPEd-2a5uccsiuZA.pt
@@ -0,0 +1,4 @@
+<%
+GenPackage genPackage = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxo37rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxo37rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxo37rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxon7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxon7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxon7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..7eeec39
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT && !genModel.sameModelEditProject() && !genModel.sameModelEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxpn7rEd-W9_ZFSEQEPg.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..f6e0339
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getModelDirectory() + "/" + genModel.getQualifiedModelModuleName().replace(".","/")+ ".gwt.xml";
+overwrite = false;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqX7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqX7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqX7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..24cd6fc
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxqn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxrH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxrH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..14684af
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QIGxoH7rEd-W9_ZFSEQEPg/method._QIGxrH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,27 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<module>
+<%for (String inherits : genModel.getModelModuleInherits()) {%>
+  <inherits name="<%=inherits%>" />
+<%}%>
+<%for (String source : genModel.getModelModuleSources()) {%>
+  <source path="<%=source%>"/>
+<%}%>
+</module>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..731ee31
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditDirectory() + "/" + genModel.getQualifiedEditModuleName().replace(".","/")+ ".gwt.xml";
+overwrite = false;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYX7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYX7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYX7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YYn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YZH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YZH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..ba08e7a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QP2YZH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,27 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<module>
+<%for (String inherits : genModel.getEditModuleInherits()) {%>
+  <inherits name="<%=inherits%>" />
+<%}%>
+<%for (String source : genModel.getEditModuleSources()) {%>
+  <source path="<%=source%>"/>
+<%}%>
+</module>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOc37rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOc37rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOc37rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOcn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOcn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOcn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..b4876d2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT && !genModel.sameModelEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QPtOcH7rEd-W9_ZFSEQEPg/method._QPtOdn7rEd-W9_ZFSEQEPg.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DE37rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DE37rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DE37rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DEn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DEn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DEn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..78d6cb1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) && (!genModel.sameEditEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DFn7rEd-W9_ZFSEQEPg.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..8f73337
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getEditPluginDirectory();
+packageName = genModel.getEditPluginPackageName();
+className = genModel.getEditPluginClassName() + "Properties";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGX7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGX7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGX7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DGn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DHH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DHH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..c0a27e7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QR8DEH7rEd-W9_ZFSEQEPg/method._QR8DHH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,186 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getEditPluginPackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public interface <%=genModel.getEditPluginClassName()%>Properties extends <%=genModel.getImportedName("com.google.gwt.i18n.client.Messages")%>
+{
+<%if (genModel.isCreationCommands()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_CreateChild_text")
+	@DefaultMessage("{0}")
+	String createChildText(Object type);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_CreateChild_text2")
+	@DefaultMessage("{1} <%if (genModel.isCreationSubmenus()) {%>| <%}%>{0}")
+	String createChildText2(Object type, Object feature);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_CreateChild_text3")
+	@DefaultMessage("{0}")
+	String createChildText3(Object feature);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_CreateChild_tooltip")
+	@DefaultMessage("Create New {0} Under {1} Feature")
+	String createChildTooltip(Object type, Object feature);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_CreateChild_description")
+	@DefaultMessage("Create a new child of type {0} for the {1} feature of the selected {2}.")
+	String createChildDescripition(Object type, Object feature, Object selection);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_CreateSibling_description")
+	@DefaultMessage("Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.")
+	String createSiblingDescription(Object type, Object feature, Object selection);
+
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_PropertyDescriptor_description")
+	@DefaultMessage("The {0} of the {1}")
+	String propertyDescriptorDescription(Object feature, Object type);
+
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) { %>
+    <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_<%=genClass.getName()%>_type")
+	@DefaultMessage("<%=genClass.getFormattedName()%>")
+	String <%=genClass.getUncapName()%>Type();
+
+    <%}%>
+  <%}%>
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_Unknown_type")
+	@DefaultMessage("Object")
+	String unknownType();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_Unknown_datatype")
+	@DefaultMessage("Value")
+	String unknownDatatype();
+
+<%for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) { String description = genFeature.getPropertyDescription();%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_feature")
+	@DefaultMessage("<%=genFeature.getFormattedName()%>")
+	String <%=genFeature.getGenClass().getUncapName()%>_<%=genFeature.getCapName()%>Feature();
+
+  <%if (description != null && description.length() > 0) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_description")
+	@DefaultMessage("<%=description%>")
+	String <%=genFeature.getGenClass().getUncapName()%>_<%=genFeature.getCapName()%>Description();
+
+  <%}%>
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_Unknown_feature")
+	@DefaultMessage("Unspecified")
+	String unknownFeature();
+
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {%>
+    <%for (GenEnum genEnum : genPackage.getGenEnums()) {%>
+      <%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("_UI_<%=genEnum.getName()%>_<%=genEnumLiteral.getName()%>_literal")
+	@DefaultMessage("<%=genEnumLiteral.getLiteral()%>")
+	String <%=genEnum.getSafeUncapName()%>_<%=genEnumLiteral.getName()%>Literal();
+
+      <%}%>
+    <%}%>
+  <%}%>
+<%}%>
+<%for (String category : genModel.getPropertyCategories()) {%>
+<%=genModel.getPropertyCategoryKey(category)%> = <%=category%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Key("<%=genModel.getPropertyCategoryKey(category)%>")
+	@DefaultMessage("<%=category%>")
+	String <%=genModel.getPropertyCategoryKey(category)%>();
+
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpII37rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpII37rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpII37rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIIn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIIn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIIn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..78d6cb1
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) && (!genModel.sameEditEditorProject());
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIJn7rEd-W9_ZFSEQEPg.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..133ed9a
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getEditPluginDirectory();
+packageName = genModel.getEditPluginPackageName();
+className = genModel.getEditPluginClassName() + "Images";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKX7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKX7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKX7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKn7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKn7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..a3911c8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpIKn7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpILH7rEd-W9_ZFSEQEPg.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpILH7rEd-W9_ZFSEQEPg.pt
new file mode 100644
index 0000000..c79f59b
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._QRpIIH7rEd-W9_ZFSEQEPg/method._QRpILH7rEd-W9_ZFSEQEPg.pt
@@ -0,0 +1,42 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getEditPluginPackageName()%>;
+
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public interface <%=genModel.getEditPluginClassName()%>Images extends <%=genModel.getImportedName("com.google.gwt.resources.client.ClientBundle")%>
+{
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+  <%for (GenClass genClass : genPackage.getGenClasses()) {%>
+    <%if (genClass.isImage()) { String image = genClass.getItemIconFileName(); image = image.substring(image.lastIndexOf("/icons/") + 1); %>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Source("<%=image%>")
+	<%=genModel.getImportedName("com.google.gwt.resources.client.ImageResource")%> <%=genClass.getItemIconAccessorName()%>();
+
+    <%}%>
+  <%}%>
+<%}%>
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WU7GoCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WU7GoCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WU7GoCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVOBkCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVOBkCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVOBkCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVqtgCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVqtgCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WVqtgCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WWQjYCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WWQjYCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WWQjYCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WZig4CSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WZig4CSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._WUeasCSWEemxeP6B0lLOpA/method._WZig4CSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZA4WkCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZA4WkCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZA4WkCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZAcRsCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZAcRsCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZAcRsCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZB7fcCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZB7fcCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZB7fcCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZBVCgCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZBVCgCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZBVCgCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZFqI4CSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZFqI4CSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._Y__lwCSWEemxeP6B0lLOpA/method._ZFqI4CSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZG2bsCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZG2bsCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZG2bsCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZGZvwCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZGZvwCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZGZvwCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHSgkCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHSgkCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHSgkCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHvMgCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHvMgCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZHvMgCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZLd18CSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZLd18CSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._ZGGNwCSWEemxeP6B0lLOpA/method._ZLd18CSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-BmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-BmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..f7d1c04
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-BmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPath = genModel.getEditorPluginDirectory();
+packageName = genModel.getEditorPluginPackageName();
+className = genModel.getEditorEntryPointClassName();
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-RmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-RmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-RmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-hmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-hmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4-hmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48hmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48hmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48hmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48xmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48xmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b48xmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49BmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49BmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..c949aa2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49BmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49hmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49hmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b49hmtEeCMbfVQrOfmzQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4_BmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4_BmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..075ceca
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__9b48BmtEeCMbfVQrOfmzQ/method.__9b4_BmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,95 @@
+
+<%
+/**
+ * Copyright (c) 20010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * Contributors:
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<%final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>
+package <%=genModel.getEditorPluginPackageName()%>;
+
+import org.eclipse.emf.edit.ui.EditorEntryPoint;
+<%genModel.markImportLocation(stringBuffer);%>
+
+/**
+ * This is the entry point.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+<%if (genModel.hasAPITags()) {%>
+ * <%=genModel.getAPITags(genModel.getIndentation(stringBuffer))%>
+<%}%>
+ * @generated
+ */
+<%if (isJDK50 && genModel.hasAPIDeprecatedTag()) {%>
+@Deprecated
+<%} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genModel.getAllGenAndUsedGenPackagesWithClassifiers())) {%>
+@SuppressWarnings("deprecation")
+<%}%>
+public class <%=genModel.getEditorEntryPointClassName()%> extends EditorEntryPoint
+{
+<%if (genModel.hasCopyrightField()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final <%=genModel.getImportedName("java.lang.String")%> copyright = <%=genModel.getCopyrightFieldLiteral()%>;<%=genModel.getNonNLS()%>
+	
+<%}%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void onModuleLoad()
+	{
+		super.onModuleLoad();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void registerPackages(<%=genModel.getImportedName("org.eclipse.emf.ecore.EPackage")%>.Registry packageRegistry)
+	{
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+		packageRegistry.put(<%=genPackage.getImportedPackageInterfaceName()%>.eNS_URI, <%=genPackage.getImportedPackageInterfaceName()%>.eINSTANCE);
+<%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void configureItemProviderAdapterFactories(<%=genModel.getImportedName("org.eclipse.emf.edit.provider.ComposedAdapterFactory")%> adapterFactory)
+	{
+<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
+		adapterFactory.addAdapterFactory(new <%=genPackage.getImportedItemProviderAdapterFactoryClassName()%>());
+<%}%>
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected String getApplicationTitle()
+	{
+		return "<%=genModel.getModelName()%> Application";<%=genModel.getNonNLS()%>
+	}
+}
+<%genModel.emitSortedImports();%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZhmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZxmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZxmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bZxmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8baBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8baBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..c949aa2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8baBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bahmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bahmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bahmtEeCMbfVQrOfmzQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..6789e1e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/war/WEB-INF/appengine-web.xml";
+overwrite = false;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbRmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbRmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbRmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bbhmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bcBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bcBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..281a0827
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__H8bZBmtEeCMbfVQrOfmzQ/method.__H8bcBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,21 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
+	<application><%=genModel.getModelName().toLowerCase().replaceAll("\\s", "-")%>-editor</application>
+	<version>1</version>
+	<threadsafe>true</threadsafe>
+</appengine-web-app>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQhmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQxmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQxmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zQxmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..c949aa2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zRhmtEeCMbfVQrOfmzQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..dae6503
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/war/" + genModel.getEditorHomePageName()+ ".html";
+overwrite = false;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSRmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSRmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zSRmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zShmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zShmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zShmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zTBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zTBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..14ade3c
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__I1zQBmtEeCMbfVQrOfmzQ/method.__I1zTBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,82 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<!doctype html>
+<html style="height : 100%"> 
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+
+    <!--                                           -->
+    <!-- Any title is fine                         -->
+    <!--                                           -->
+    <title><%=genModel.getModelName()%> Application</title>
+    
+    <style TYPE="text/css">
+      <!--
+        .ToolBar
+        {
+          background-color: #d0e4f6;
+        }
+        .ToolBarButton
+        {
+          float: left;
+          margin-top: 5px;
+        }
+        .ToolBarButtonLeftMargin
+        {
+          float: left;
+          margin-left: 10px;
+          margin-top: 5px;
+        }
+        .Header
+        {
+          background-color: #628cd5;
+          color: #FFFFFF;
+          float: left;
+          font-weight: bold;
+          font-size: xx-large;
+        }
+        .HeaderLabel
+        {
+          float: left;
+          margin-left: 10px;
+        }
+        .PropertiesTitle
+        {
+          background-color: #628cd5;
+          color: #FFFFFF;
+          font-weight: bold;
+          font-size: large;
+        }
+        .PropertiesTitleLabel
+        {
+          float: left;
+          margin-left: 5px;
+        }
+      -->
+    </style>
+
+    <!--                                           -->
+    <!-- This script loads your compiled module.   -->
+    <!-- If you add any GWT meta tags, they must   -->
+    <!-- be added before this line.                -->
+    <script type="text/javascript" language="javascript" src="<%=genModel.getQualifiedEditorModuleName()%>/<%=genModel.getQualifiedEditorModuleName()%>.nocache.js"></script>
+  </head>
+
+  <body style="height : 100%">
+    <div id="main" style="height : 100%">
+    </div>
+  </body>
+</html>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAhmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAxmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAxmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQAxmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..c949aa2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQBhmtEeCMbfVQrOfmzQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..f004d4e
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorDirectory() + "/" + genModel.getQualifiedEditorModuleName().replace(".","/")+ ".gwt.xml";
+overwrite = false;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCRmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCRmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQCRmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQChmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQChmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQChmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQDBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQDBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..8bd4afe
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__KLQABmtEeCMbfVQrOfmzQ/method.__KLQDBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,31 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+
+<module>
+  <inherits name='com.google.gwt.user.theme.standard.Standard'/>
+<%for (String inherits : genModel.getEditorModuleInherits()) {%>
+  <inherits name="<%=inherits%>" />
+<%}%>
+
+  <entry-point class='<%=genModel.getQualifiedEditorEntryPointClassName()%>'/>
+
+<%for (String source : genModel.getEditorModuleSources()) {%>
+  <source path="<%=source%>"/>
+<%}%>
+</module>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_khmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_khmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_khmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_kxmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_kxmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_kxmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..c949aa2
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,5 @@
+GenModel genModel = parameter;
+genModel = parameter.getGenModel();
+boolean canGenerate = new CodegenGeneratorAdapter(parameter).canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
+canGenerate = canGenerate && (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT);
+return canGenerate;
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_lhmtEeCMbfVQrOfmzQ.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..f7259b7
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,6 @@
+<%
+GenModel genModel = parameter;
+targetPathName = genModel.getEditorProjectDirectory() + "/war/WEB-INF/web.xml";
+overwrite = false;
+encoding = "UTF-8";
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mRmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mRmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..76ca0ef
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mRmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,4 @@
+<%
+GenModel genModel = parameter;
+argument = parameter;
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mhmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mhmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..da5fad6
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_mhmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,3 @@
+<%
+new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());
+%>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_nBmtEeCMbfVQrOfmzQ.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_nBmtEeCMbfVQrOfmzQ.pt
new file mode 100644
index 0000000..2fea7fb
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern.__gO_kBmtEeCMbfVQrOfmzQ/method.__gO_nBmtEeCMbfVQrOfmzQ.pt
@@ -0,0 +1,32 @@
+
+<%
+/**
+ * Copyright (c) 2010 Ed Merks and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * Contributors: 
+ *   Ed Merks - Initial API and implementation
+ */
+%>
+<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderXml" args="parameter:argument"%>
+<web-app>
+  <servlet>
+    <servlet-name>uriServlet</servlet-name>
+    <servlet-class>org.eclipse.emf.server.ecore.resource.URIServiceImpl</servlet-class>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>uriServlet</servlet-name>
+    <url-pattern>/<%=genModel.getQualifiedEditorModuleName()%>/uriService</url-pattern>
+  </servlet-mapping>
+
+  <welcome-file-list>
+    <welcome-file><%=genModel.getEditorHomePageName()%>.html</welcome-file>
+  </welcome-file-list>
+</web-app>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cA-DcCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cA-DcCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cA-DcCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cAhXgCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cAhXgCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cAhXgCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cB3bUCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cB3bUCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cB3bUCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cBQ-YCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cBQ-YCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cBQ-YCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cFSiwCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cFSiwCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._cAErkCSWEemxeP6B0lLOpA/method._cFSiwCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eT5vYCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eT5vYCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eT5vYCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUMqUCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUMqUCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUMqUCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUpWQCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUpWQCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eUpWQCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eVPMICSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eVPMICSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eVPMICSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eY91kCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eY91kCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eTdDcCSWEemxeP6B0lLOpA/method._eY91kCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eZ3NcCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eZ3NcCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eZ3NcCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eaTSUCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eaTSUCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eaTSUCSWEemxeP6B0lLOpA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eam0UCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eam0UCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._eam0UCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._ebMqMCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._ebMqMCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._ebMqMCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._efOOkCSWEemxeP6B0lLOpA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._efOOkCSWEemxeP6B0lLOpA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._eZahgCSWEemxeP6B0lLOpA/method._efOOkCSWEemxeP6B0lLOpA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp07M-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp07M-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp07M-EeKd56X4hcZPSw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp0rM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp0rM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp0rM-EeKd56X4hcZPSw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1LM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1LM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1LM-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1rM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1rM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp1rM-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp6LM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp6LM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e2f25c0
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._odzp0LM-EeKd56X4hcZPSw/method._odzp6LM-EeKd56X4hcZPSw.pt
@@ -0,0 +1,128 @@
+
+
+  <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String arrayElementType = genFeature.getArrayItemType(genClass);%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific element type known in this context.
+	 * @see #<%=genFeature.getGetAccessor()%>()
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public <%=arrayElementType%>[] <%=genFeature.getGetArrayAccessor()%>()
+	{
+      <%if (genFeature.isVolatile()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>();
+		if (list.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+      <%} else {%>
+		if (<%=genFeature.getSafeName()%> == null || <%=genFeature.getSafeName()%>.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getSafeName()%>;
+      <%}%>
+		list.shrink();
+		return (<%=arrayElementType%>[])list.data();
+	}
+
+  <%}%>
+  <%if (genFeature.isGet() && genFeature.isListType()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific element type known in this context.
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+  <%if (genFeature.isListType() && genModel.isVirtualDelegation()) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public <%=genFeature.getImportedType(genClass)%> <%=genFeature.getGetAccessor()%><%if (genClass.hasCollidingGetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> == null)
+		{
+        <%if (genModel.isVirtualDelegation()) {%>
+			eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>);
+        <%} else {%>
+			<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
+        <%}%>
+		}
+		return <%=genFeature.getSafeName()%><%=genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : ""%>;
+	}
+
+  <%}%>
+  <%if (!genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific type known in this context.
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedInternalType(genClass)%> new<%=genFeature.getCapName()%>, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		return super.basicSet<%=genFeature.getAccessorName()%>(new<%=genFeature.getCapName()%>, msgs);
+	}
+
+  <%}%>
+  <%if (genFeature.isSet() && !(!genModel.isReflectiveDelegation() && genFeature.isBasicSet())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific type known in this context.
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Class.Class.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%{ GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public void set<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingSetAccessorOperation(genFeature)) {%>_<%}%>(<%=genFeature.getImportedType(genClass)%> <%=setAccessorOperation == null ? "new" + genFeature.getCapName() : setAccessorOperation.getGenParameters().get(0).getName()%>)
+	{
+		super.set<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingSetAccessorOperation(genFeature)) {%>_<%}%>(<%=setAccessorOperation == null ? "new" + genFeature.getCapName() : setAccessorOperation.getGenParameters().get(0).getName()%>);
+	}
+
+<%}%>
+  <%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcoc7M-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcoc7M-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcoc7M-EeKd56X4hcZPSw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcod7M-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcod7M-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcod7M-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodLM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodLM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodLM-EeKd56X4hcZPSw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodbM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodbM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcodbM-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcof7M-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcof7M-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._omcocbM-EeKd56X4hcZPSw/method._omcof7M-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQ7M-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQ7M-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQ7M-EeKd56X4hcZPSw.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQrM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQrM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysQrM-EeKd56X4hcZPSw.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRLM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRLM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRLM-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRrM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRrM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysRrM-EeKd56X4hcZPSw.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysWLM-EeKd56X4hcZPSw.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysWLM-EeKd56X4hcZPSw.pt
new file mode 100644
index 0000000..fbe94e8
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._onysQLM-EeKd56X4hcZPSw/method._onysWLM-EeKd56X4hcZPSw.pt
@@ -0,0 +1,128 @@
+
+
+  <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) { String arrayElementType = genFeature.getArrayItemType(genClass);%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific element type known in this context.
+	 * @see #<%=genFeature.getGetAccessor()%>()
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+    <%if (genModel.useGenerics() && CodeGenUtil.isUncheckedCast(arrayElementType)) {%>
+	@SuppressWarnings("unchecked")
+    <%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public <%=arrayElementType%>[] <%=genFeature.getGetArrayAccessor()%>()
+	{
+      <%if (genFeature.isVolatile()) {%>
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getGetAccessor()%>();
+		if (list.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+      <%} else {%>
+		if (<%=genFeature.getSafeName()%> == null || <%=genFeature.getSafeName()%>.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
+		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%><%=genFeature.getListTemplateArguments(genClass)%>)<%=genFeature.getSafeName()%>;
+      <%}%>
+		list.shrink();
+		return (<%=arrayElementType%>[])list.data();
+	}
+
+  <%}%>
+  <%if (genFeature.isGet() && genFeature.isListType()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific element type known in this context.
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/getGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+  <%if (genFeature.isListType() && genModel.isVirtualDelegation()) {%>
+	@SuppressWarnings("unchecked")
+  <%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (useInterfaceOverrideAnnotation || classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public <%=genFeature.getImportedType(genClass)%> <%=genFeature.getGetAccessor()%><%if (genClass.hasCollidingGetAccessorOperation(genFeature)) {%>_<%}%>()
+	{
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.getGenFeature.pre.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+        <%if (genModel.isVirtualDelegation()) {%>
+		<%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType(genClass)%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>);
+        <%}%>
+		if (<%=genFeature.getSafeName()%> == null)
+		{
+        <%if (genModel.isVirtualDelegation()) {%>
+			eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%><%=positiveOffsetCorrection%>, <%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>);
+        <%} else {%>
+			<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
+        <%}%>
+		}
+		return <%=genFeature.getSafeName()%><%=genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : ""%>;
+	}
+
+  <%}%>
+  <%if (!genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific type known in this context.
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/basicSetGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.basicSetGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedInternalType(genClass)%> new<%=genFeature.getCapName()%>, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
+	{
+		return super.basicSet<%=genFeature.getAccessorName()%>(new<%=genFeature.getCapName()%>, msgs);
+	}
+
+  <%}%>
+  <%if (genFeature.isSet() && !(!genModel.isReflectiveDelegation() && genFeature.isBasicSet())) {%>
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * This is specialized for the more specific type known in this context.
+    <%if (genFeature.hasAPITags()) {%>
+	 * <%=genFeature.getAPITags(genModel.getIndentation(stringBuffer))%>
+    <%}%>
+	 * @generated
+	 */
+<%if (isJDK50) { //Class/setGenFeature.annotations.insert.javajetinc%>
+<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.model.call.Interface.Interface.setGenFeature.annotations.insert" args="genFeature:genFeature,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50,isInterface:isInterface,isImplementation:isImplementation,useInterfaceOverrideAnnotation:useInterfaceOverrideAnnotation,isGWT:isGWT,forceDefaultCase:forceDefaultCase,indentDefaultCase:indentDefaultCase,publicStaticFinalFlag:publicStaticFinalFlag,singleWildcard:singleWildcard,negativeOffsetCorrection:negativeOffsetCorrection,positiveOffsetCorrection:positiveOffsetCorrection,negativeOperationOffsetCorrection:negativeOperationOffsetCorrection,positiveOperationOffsetCorrection:positiveOperationOffsetCorrection"%>
+<%}%>
+<%{ GenOperation setAccessorOperation = genClass.getSetAccessorOperation(genFeature);%>
+    <%if (isJDK50 && genFeature.hasAPIDeprecatedTag()) {%>
+	@Deprecated
+    <%}%>
+    <%if (classExtendsAllGenFeatures.contains(genFeature)) {%>
+	@Override
+    <%}%>
+	public void set<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingSetAccessorOperation(genFeature)) {%>_<%}%>(<%=genFeature.getImportedType(genClass)%> <%=setAccessorOperation == null ? "new" + genFeature.getCapName() : setAccessorOperation.getGenParameters().get(0).getName()%>)
+	{
+		super.set<%=genFeature.getAccessorName()%><%if (genClass.hasCollidingSetAccessorOperation(genFeature)) {%>_<%}%>(<%=setAccessorOperation == null ? "new" + genFeature.getCapName() : setAccessorOperation.getGenParameters().get(0).getName()%>);
+	}
+
+<%}%>
+  <%}%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EM6oMEeOCpsO1cKKCxA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EM6oMEeOCpsO1cKKCxA.pt
new file mode 100644
index 0000000..d630053
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EM6oMEeOCpsO1cKKCxA.pt
@@ -0,0 +1 @@
+<%// add initialisation of the pattern variables (declaration has been already done).%>
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EMqoMEeOCpsO1cKKCxA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EMqoMEeOCpsO1cKKCxA.pt
new file mode 100644
index 0000000..7bf6f2d
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EMqoMEeOCpsO1cKKCxA.pt
@@ -0,0 +1 @@
+<%@ jet package="PACKAGE" class="CLASS" imports="org.eclipse.egf.emf.pattern.base.* org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil org.eclipse.emf.codegen.ecore.genmodel.* org.eclipse.emf.codegen.ecore.genmodel.impl.* org.eclipse.emf.codegen.ecore.genmodel.generator.* org.eclipse.emf.codegen.util.* org.eclipse.emf.ecore.util.* org.eclipse.emf.common.util.* org.eclipse.egf.common.helper.* java.util.* org.eclipse.emf.ecore.* org.eclipse.egf.model.pattern.* org.eclipse.egf.pattern.execution.* org.eclipse.egf.pattern.query.*"  %>
\ No newline at end of file
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENKoMEeOCpsO1cKKCxA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENKoMEeOCpsO1cKKCxA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENKoMEeOCpsO1cKKCxA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENqoMEeOCpsO1cKKCxA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENqoMEeOCpsO1cKKCxA.pt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5ENqoMEeOCpsO1cKKCxA.pt
diff --git a/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EPKoMEeOCpsO1cKKCxA.pt b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EPKoMEeOCpsO1cKKCxA.pt
new file mode 100644
index 0000000..f42c830
--- /dev/null
+++ b/platform_specific/2019-09/org.eclipse.egf.emf.pattern/templates/pattern._sd5EMKoMEeOCpsO1cKKCxA/method._sd5EPKoMEeOCpsO1cKKCxA.pt
@@ -0,0 +1,50 @@
+
+
+<%if (genClass.isMapEntry()) {%>
+		<%=genClass.getImportedInterfaceName()%><%if (genModel.useGenerics()) {%><?, ?><%}%> <%=genClass.getSafeUncapName()%> = (<%=genClass.getImportedInterfaceName()%><%if (genModel.useGenerics()) {%><?, ?><%}%>)object;
+  <%if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine() && !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {%>
+		return new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%>("" + <%=genClass.getSafeUncapName()%>.getKey()).append(" -> ", <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style")%>.QUALIFIER_STYLER).append("" + <%=genClass.getSafeUncapName()%>.getValue());<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+  <%} else {%>
+    <%if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {%>
+		String key = crop("" + <%=genClass.getSafeUncapName()%>.getKey());<%=genModel.getNonNLS()%>
+    <%} else {%>
+		String key = "" + <%=genClass.getSafeUncapName()%>.getKey();<%=genModel.getNonNLS()%>
+    <%}%>
+    <%if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {%>
+		String value = crop("" + <%=genClass.getSafeUncapName()%>.getValue());<%=genModel.getNonNLS()%>
+    <%} else {%>
+		String value = "" + <%=genClass.getSafeUncapName()%>.getValue();<%=genModel.getNonNLS()%>
+    <%}%>
+		return new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%>(key).append(" -> ", <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style")%>.QUALIFIER_STYLER).append(value);<%=genModel.getNonNLS()%>
+  <%}%>
+<%} else if (genClass.getLabelFeature() != null) { GenFeature labelFeature = genClass.getLabelFeature();%>
+  <%if (labelFeature.isPrimitiveType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {%>
+		<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%> <%=genClass.getSafeUncapName()%> = (<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object;
+		return new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%>(getString("_UI_<%=genClass.getName()%>_type"), <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style")%>.QUALIFIER_STYLER).append(" ").append(<%=labelFeature.getObjectType(genClass)%>.toString(<%=genClass.getSafeUncapName()%>.<%=genClass.getLabelFeature().getGetAccessor()%>()));<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+  <%} else {%>
+    <%if (labelFeature.isStringType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {%>
+      <%if (labelFeature.isPropertyMultiLine()) {%>
+		String label = crop(((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object).<%=labelFeature.getGetAccessor()%>());
+      <%} else {%>
+		String label = ((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object).<%=labelFeature.getGetAccessor()%>();
+      <%}%>
+    <%} else {%>
+      <%if (labelFeature.isSuppressedGetVisibility() || labelFeature.getGenClass().isDynamic()) {%>
+		<%=genModel.getImportedName("java.lang.Object")%> labelValue = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%>)object).eGet(<%=labelFeature.getQualifiedFeatureAccessor()%>);
+      <%} else {%>
+		<%=labelFeature.getRawImportedType()%> labelValue = ((<%=genClass.getImportedInterfaceName()%><%=genClass.getInterfaceWildTypeArguments()%>)object).<%=labelFeature.getGetAccessor()%>();
+      <%}%>
+		String label = labelValue == null ? null : labelValue.toString();
+    <%}%>
+    	<%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%> styledLabel = new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%>();
+		if (label == null || label.length() == 0)
+		{
+			styledLabel.append(getString("_UI_<%=genClass.getName()%>_type"), <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style")%>.QUALIFIER_STYLER); <%=genModel.getNonNLS()%>
+		} else {
+			styledLabel.append(getString("_UI_<%=genClass.getName()%>_type"), <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style")%>.QUALIFIER_STYLER).append(" " + label);<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
+		}
+		return styledLabel;
+  <%}%>
+<%} else {%>
+		return new <%=genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString")%>(getString("_UI_<%=genClass.getName()%>_type"));<%=genModel.getNonNLS()%>
+<%}%>
diff --git a/platform_specific/2019-09/pom.xml b/platform_specific/2019-09/pom.xml
new file mode 100644
index 0000000..e712c7b
--- /dev/null
+++ b/platform_specific/2019-09/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2018, 2019 THALES GLOBAL SERVICES.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Public License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/legal/epl-v10.html
+
+  Contributors:
+       Thales - initial API and implementation
+-->
+<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/maven-v4_0_0.xsd">
+	
+	<modelVersion>4.0.0</modelVersion>
+	
+	<artifactId>egf_platform_specific_photon</artifactId>
+	<packaging>pom</packaging>
+	
+	<parent>
+		<groupId>org.eclipse.egf</groupId>
+		<artifactId>egf_root</artifactId>
+		<version>1.6.1-SNAPSHOT</version>
+		<relativePath>../..</relativePath>
+	</parent>
+</project>
diff --git a/pom.xml b/pom.xml
index ef8d485..af4e9ea 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,7 +37,7 @@
 	<properties>
 		<tycho-version>1.4.0</tycho-version>
 		<tycho-extras-version>${tycho-version}</tycho-extras-version>
-		<platform-version-name>2019-06</platform-version-name>
+		<platform-version-name>2019-09</platform-version-name>
 		
 		<tycho.scmUrl>scm:git:https://git.eclipse.org/r/egf/org.eclipse.emf.egf</tycho.scmUrl>
 		
diff --git a/releng/org.eclipse.egf.targets/core-2019-09.target b/releng/org.eclipse.egf.targets/core-2019-09.target
new file mode 100644
index 0000000..2d8e858
--- /dev/null
+++ b/releng/org.eclipse.egf.targets/core-2019-09.target
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde?>
+<!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform -->
+<target name="core" sequenceNumber="1570031034">
+  <locations>
+    <location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
+      <unit id="org.eclipse.emf.workspace.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.emf.transaction.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.emf.query.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.emf.validation.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.sdk.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.jdt.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.pde.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.platform.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.m2m.atl.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.uml2.uml.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.sirius.runtime.ide.eef.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.sirius.runtime.ide.ui.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.sirius.runtime.ide.xtext.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.sirius.runtime.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.sirius.runtime.aql.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.emf.ecoretools.sdk.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.emf.ecoretools.design.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
+      <repository id="eclipse" location="https://download.eclipse.org/releases/2019-09/"/>
+    </location>
+    <location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
+      <unit id="org.eclipse.license.feature.group" version="0.0.0"/>
+      <repository location="https://download.eclipse.org/cbi/updates/license/"/>
+    </location>
+    <location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
+      <unit id="org.eclipse.acceleo.sdk.feature.group" version="0.0.0"/>
+      <repository id="acceleo" location="https://download.eclipse.org/acceleo/updates/releases/3.7/R201705121344/"/>
+    </location>
+    <location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
+      <unit id="org.eclipse.amalgam.explorer.activity.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.activity.source.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.contextual.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.contextual.source.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.contextual.sirius.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.contextual.sirius.source.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.contextual.core.feature.group" version="0.0.0"/>
+      <unit id="org.eclipse.amalgam.explorer.contextual.core.source.feature.group" version="0.0.0"/>
+      <repository id="amalgam" location="https://download.eclipse.org/modeling/amalgam/staging/nightly/1.11.0-N133/capella"/>
+    </location>
+  </locations>
+</target>
diff --git a/releng/org.eclipse.egf.targets/core-2019-09.targetplatform b/releng/org.eclipse.egf.targets/core-2019-09.targetplatform
new file mode 100644
index 0000000..d107d7a
--- /dev/null
+++ b/releng/org.eclipse.egf.targets/core-2019-09.targetplatform
@@ -0,0 +1,43 @@
+target "core"  with source, requirements
+
+
+location eclipse "https://download.eclipse.org/releases/2019-09/" {
+	org.eclipse.emf.workspace.feature.group lazy
+	org.eclipse.emf.transaction.feature.group lazy
+	org.eclipse.emf.query.feature.group lazy
+	org.eclipse.emf.validation.feature.group lazy
+	org.eclipse.sdk.feature.group lazy
+	org.eclipse.jdt.feature.group lazy
+	org.eclipse.pde.feature.group lazy
+	org.eclipse.platform.feature.group lazy
+	org.eclipse.m2m.atl.feature.group lazy
+	org.eclipse.uml2.uml.feature.group lazy
+	org.eclipse.equinox.executable.feature.group lazy
+	org.eclipse.sirius.runtime.ide.eef.feature.group lazy
+	org.eclipse.sirius.runtime.ide.ui.feature.group lazy
+	org.eclipse.sirius.runtime.ide.xtext.feature.group lazy
+	org.eclipse.sirius.runtime.feature.group lazy
+	org.eclipse.sirius.runtime.aql.feature.group lazy
+	org.eclipse.emf.ecoretools.sdk.feature.group lazy
+	org.eclipse.emf.ecoretools.design.feature.group lazy
+	org.eclipse.emf.sdk.feature.group lazy
+}
+
+location "https://download.eclipse.org/cbi/updates/license/" {
+	org.eclipse.license.feature.group lazy
+}
+
+location acceleo "https://download.eclipse.org/acceleo/updates/releases/3.7/R201705121344/" {
+	org.eclipse.acceleo.sdk.feature.group lazy
+}
+
+location amalgam "https://download.eclipse.org/modeling/amalgam/staging/nightly/1.11.0-N133/capella" {
+	org.eclipse.amalgam.explorer.activity.feature.group lazy
+	org.eclipse.amalgam.explorer.activity.source.feature.group lazy
+	org.eclipse.amalgam.explorer.contextual.feature.group lazy
+	org.eclipse.amalgam.explorer.contextual.source.feature.group lazy
+	org.eclipse.amalgam.explorer.contextual.sirius.feature.group lazy
+	org.eclipse.amalgam.explorer.contextual.sirius.source.feature.group lazy
+	org.eclipse.amalgam.explorer.contextual.core.feature.group lazy
+	org.eclipse.amalgam.explorer.contextual.core.source.feature.group lazy
+}
diff --git a/tests/org.eclipse.egf.core.test.pattern/generated/substitution_chain/replace1.java b/tests/org.eclipse.egf.core.test.pattern/generated/substitution_chain/replace1.java
index 2cdad9c..0381c8d 100644
--- a/tests/org.eclipse.egf.core.test.pattern/generated/substitution_chain/replace1.java
+++ b/tests/org.eclipse.egf.core.test.pattern/generated/substitution_chain/replace1.java
@@ -1,4 +1,4 @@
-//Generated with EGF 1.6.0.201901231006
+//Generated with EGF 1.6.0.201805040915
 package substitution_chain;
 
 import org.eclipse.egf.common.helper.*;
@@ -21,6 +21,7 @@
 	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
 	protected final String TEXT_1 = "replace1" + NL;
 	protected final String TEXT_2 = NL;
+	protected final String TEXT_3 = NL;
 
 	public replace1() {
 		//Here is the constructor
@@ -49,7 +50,7 @@
 		}
 
 		stringBuffer.append(TEXT_2);
-		stringBuffer.append(TEXT_2);
+		stringBuffer.append(TEXT_3);
 		return stringBuffer.toString();
 	}
 
