Merge "[releng] junit tests won't run in gerrit job because of juni4 launcher"
diff --git a/plugins/org.eclipse.emf.codegen.ecore.ui/plugin.properties b/plugins/org.eclipse.emf.codegen.ecore.ui/plugin.properties
index 7fab4da..3bb9deb 100644
--- a/plugins/org.eclipse.emf.codegen.ecore.ui/plugin.properties
+++ b/plugins/org.eclipse.emf.codegen.ecore.ui/plugin.properties
@@ -446,3 +446,5 @@
 _UI_GenModel_styleProviders_description = Whether item providers should provide support for specifying styled labels
 _UI_GenModel_cleanup_feature = Cleanup
 _UI_GenModel_cleanup_description = Whether to invoke the configured source clean actions after generating
+_UI_GenPackage_publicationLocation_feature = Publication Location
+_UI_GenPackage_publicationLocation_description = The workspace-relative location at which to generate a published version of the Ecore model resource
diff --git a/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/presentation/GenModelActionBarContributor.java b/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/presentation/GenModelActionBarContributor.java
index dab85f6..862847b 100644
--- a/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/presentation/GenModelActionBarContributor.java
+++ b/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/presentation/GenModelActionBarContributor.java
@@ -274,49 +274,53 @@
       Set<IWorkingSet> workingSets = new HashSet<IWorkingSet>();
       if (genModel != null)
       {
-        IProject project = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getModelDirectory())).getProject();
-        if (project != null)
+        String modelDirectory = genModel.getModelDirectory();
+        if (modelDirectory != null && !"".equals(modelDirectory))
         {
-          IWorkbench workbench = PlatformUI.getWorkbench();
-          for (IWorkingSet workingSet : workbench.getWorkingSetManager().getAllWorkingSets())
+          IProject project = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(modelDirectory)).getProject();
+          if (project != null)
           {
-            IAdaptable[] elements = workingSet.getElements();
-            for (IAdaptable element : elements)
+            IWorkbench workbench = PlatformUI.getWorkbench();
+            for (IWorkingSet workingSet : workbench.getWorkingSetManager().getAllWorkingSets())
             {
-              if (project.equals(element.getAdapter(IProject.class)))
+              IAdaptable[] elements = workingSet.getElements();
+              for (IAdaptable element : elements)
               {
-                workingSets.add(workingSet);
-                continue;
+                if (project.equals(element.getAdapter(IProject.class)))
+                {
+                  workingSets.add(workingSet);
+                  continue;
+                }
               }
             }
-          }
-          if (!workingSets.isEmpty())
-          {
-            for (int i = 0; i < projectTypes.length; i++)
+            if (!workingSets.isEmpty())
             {
-              Object projectType = projectTypes[i].getType();
-              if (GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE.equals(projectType) && genModel.hasEditSupport())
+              for (int i = 0; i < projectTypes.length; i++)
               {
-                IProject editProject = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getEditDirectory())).getProject();
-                if (!editProject.exists())
+                Object projectType = projectTypes[i].getType();
+                if (GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE.equals(projectType) && genModel.hasEditSupport())
                 {
-                  projects.add(editProject);
+                  IProject editProject = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getEditDirectory())).getProject();
+                  if (!editProject.exists())
+                  {
+                    projects.add(editProject);
+                  }
                 }
-              }
-              if (GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE.equals(projectType) && genModel.hasEditorSupport())
-              {
-                IProject editorProject = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getEditorDirectory())).getProject();
-                if (!editorProject.exists())
+                if (GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE.equals(projectType) && genModel.hasEditorSupport())
                 {
-                  projects.add(editorProject);
+                  IProject editorProject = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getEditorDirectory())).getProject();
+                  if (!editorProject.exists())
+                  {
+                    projects.add(editorProject);
+                  }
                 }
-              }
-              if (GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE.equals(projectType) && genModel.hasTestSupport())
-              {
-                IProject testsProject = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getTestsDirectory())).getProject();
-                if (!testsProject.exists())
+                if (GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE.equals(projectType) && genModel.hasTestSupport())
                 {
-                  projects.add(testsProject);
+                  IProject testsProject = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(genModel.getTestsDirectory())).getProject();
+                  if (!testsProject.exists())
+                  {
+                    projects.add(testsProject);
+                  }
                 }
               }
             }
diff --git a/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/provider/GenPackageItemProvider.java b/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/provider/GenPackageItemProvider.java
index 81b09ea..0095695 100644
--- a/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/provider/GenPackageItemProvider.java
+++ b/plugins/org.eclipse.emf.codegen.ecore.ui/src/org/eclipse/emf/codegen/ecore/genmodel/provider/GenPackageItemProvider.java
@@ -93,6 +93,7 @@
       addContentTypeIdentifierPropertyDescriptor(object);
       addFileExtensionsPropertyDescriptor(object);
       addEcorePackagePropertyDescriptor(object);
+      addPublicationLocationPropertyDescriptor(object);
     }
     return itemPropertyDescriptors;
   }
@@ -627,6 +628,29 @@
   }
 
   /**
+   * This adds a property descriptor for the Publication Location feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addPublicationLocationPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add
+      (createItemPropertyDescriptor
+        (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+         getResourceLocator(),
+         getString("_UI_GenPackage_publicationLocation_feature"),
+         getString("_UI_GenPackage_publicationLocation_description"),
+         GenModelPackage.Literals.GEN_PACKAGE__PUBLICATION_LOCATION,
+         true,
+         false,
+         false,
+         ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+         getString("_UI_ModelPropertyCategory"),
+         null));
+  }
+
+  /**
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated
@@ -735,6 +759,7 @@
       case GenModelPackage.GEN_PACKAGE__CONTENT_TYPE_IDENTIFIER:
       case GenModelPackage.GEN_PACKAGE__FILE_EXTENSIONS:
       case GenModelPackage.GEN_PACKAGE__ECORE_PACKAGE:
+      case GenModelPackage.GEN_PACKAGE__PUBLICATION_LOCATION:
         fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
         return;
       case GenModelPackage.GEN_PACKAGE__GEN_ENUMS:
diff --git a/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.ecore b/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.ecore
index d80178a..5760f0e 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.ecore
+++ b/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.ecore
@@ -185,6 +185,7 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="genClassifiers" upperBound="-1"
         eType="#//GenClassifier" changeable="false" volatile="true" transient="true"
         resolveProxies="false" eOpposite="#//GenClassifier/genPackage"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="publicationLocation" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="GenClass" eSuperTypes="#//GenClassifier">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="provider" eType="#//GenProviderKind"/>
diff --git a/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel b/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel
index d1d2925..f7c0d53 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel
+++ b/plugins/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel
@@ -282,6 +282,8 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference GenModel.ecore#//GenPackage/genClasses"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference GenModel.ecore#//GenPackage/nestedGenPackages"/>
       <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference GenModel.ecore#//GenPackage/genClassifiers"/>
+      <genFeatures createChild="false" propertyCategory="Model" propertyDescription="The workspace-relative location at which to generate a published version of the Ecore model resource"
+          ecoreFeature="ecore:EAttribute GenModel.ecore#//GenPackage/publicationLocation"/>
     </genClasses>
     <genClasses image="false" ecoreClass="GenModel.ecore#//GenClass">
       <genFeatures createChild="false" propertyCategory="Edit" propertyDescription="Whether to generate an item provider and which pattern to use"
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/generator/AbstractGeneratorAdapter.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/generator/AbstractGeneratorAdapter.java
index 3fd7131..b8ed45c 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/generator/AbstractGeneratorAdapter.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/generator/AbstractGeneratorAdapter.java
@@ -1111,16 +1111,16 @@
           }
           result.append(valueComponent);
         }
-        for (Directive directive : directives)
-        {
-          result.append(';');
-          result.append(directive);
-        }
         for (Attribute attribute : attributes)
         {
           result.append(';');
           result.append(attribute);
         }
+        for (Directive directive : directives)
+        {
+          result.append(';');
+          result.append(directive);
+        }
         return result.toString();
       }
 
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenClass.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenClass.java
index 07e313e..37b6e7e 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenClass.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenClass.java
@@ -455,6 +455,10 @@
   GenClass getProviderExtendsGenClass();
   String getProviderBaseClassName();
   List<GenClass> getProviderImplementedGenClasses();
+  /**
+   * @since 2.10
+   */
+  List<String> getProviderImplementsClassNames();
 
   List<GenFeature> getLabelFeatureCandidates();
   List<GenFeature> getPropertyFeatures();
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenModelPackage.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenModelPackage.java
index 38cbb25..04fb94a 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenModelPackage.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenModelPackage.java
@@ -1182,13 +1182,22 @@
   int GEN_PACKAGE__GEN_CLASSIFIERS = GEN_BASE_FEATURE_COUNT + 28;
 
   /**
+   * The feature id for the '<em><b>Publication Location</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int GEN_PACKAGE__PUBLICATION_LOCATION = GEN_BASE_FEATURE_COUNT + 29;
+
+  /**
    * The number of structural features of the '<em>Gen Package</em>' class.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated
    * @ordered
    */
-  int GEN_PACKAGE_FEATURE_COUNT = GEN_BASE_FEATURE_COUNT + 29;
+  int GEN_PACKAGE_FEATURE_COUNT = GEN_BASE_FEATURE_COUNT + 30;
 
   /**
    * The meta object id for the '{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenClassifierImpl <em>Gen Classifier</em>}' class.
@@ -3267,6 +3276,17 @@
   EReference getGenPackage_GenClassifiers();
 
   /**
+   * Returns the meta object for the attribute '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPublicationLocation <em>Publication Location</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Publication Location</em>'.
+   * @see org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPublicationLocation()
+   * @see #getGenPackage()
+   * @generated
+   */
+  EAttribute getGenPackage_PublicationLocation();
+
+  /**
    * Returns the meta object for class '{@link org.eclipse.emf.codegen.ecore.genmodel.GenClass <em>Gen Class</em>}'.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
@@ -4852,6 +4872,14 @@
     EReference GEN_PACKAGE__GEN_CLASSIFIERS = eINSTANCE.getGenPackage_GenClassifiers();
 
     /**
+     * The meta object literal for the '<em><b>Publication Location</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute GEN_PACKAGE__PUBLICATION_LOCATION = eINSTANCE.getGenPackage_PublicationLocation();
+
+    /**
      * The meta object literal for the '{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenClassImpl <em>Gen Class</em>}' class.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenPackage.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenPackage.java
index 619e5f2..0b5c3f1 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenPackage.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/GenPackage.java
@@ -56,6 +56,7 @@
  *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenClasses <em>Gen Classes</em>}</li>
  *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getNestedGenPackages <em>Nested Gen Packages</em>}</li>
  *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenClassifiers <em>Gen Classifiers</em>}</li>
+ *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPublicationLocation <em>Publication Location</em>}</li>
  * </ul>
  * </p>
  *
@@ -693,6 +694,31 @@
    */
   EList<GenClassifier> getGenClassifiers();
 
+  /**
+   * Returns the value of the '<em><b>Publication Location</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * @since 2.10
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Publication Location</em>' attribute.
+   * @see #setPublicationLocation(String)
+   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_PublicationLocation()
+   * @model
+   * @generated
+   */
+  String getPublicationLocation();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPublicationLocation <em>Publication Location</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Publication Location</em>' attribute.
+   * @see #getPublicationLocation()
+   * @generated
+   */
+  void setPublicationLocation(String value);
+
   String getInterfacePackageName();
   String getReflectionPackageName();
   String getReflectionClassPackageName();
@@ -966,6 +992,11 @@
   boolean hasTests();
 
   /**
+   * @since 2.10
+   */
+  String getSchemaLocation();
+
+  /**
    * Returns a nested map structure describing the child creation extensions that this package provides to other packages.
    * The result maps other packages to their classes that have child creation extension provided by this package.
    * Each inner map maps from the class to the list of child creation data for these extensions.
@@ -1022,5 +1053,11 @@
    * @see #getFileExtensions
    * @since 2.4
    */
-  String getFileExtension(); // getFirstFileExtension?
+  String getFileExtension();
+
+  /**
+   * Returns a list of the comma-separated contents of {@link #getFileExtensions()}.
+   * @since 2.10
+   */
+  List<String> getFileExtensionList();
 }
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenBaseGeneratorAdapter.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenBaseGeneratorAdapter.java
index e45f2a3..9bbaf4b 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenBaseGeneratorAdapter.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenBaseGeneratorAdapter.java
@@ -399,8 +399,14 @@
               }
             }
 
-            IProject modelProject = workspace.getRoot().getProject(genModel.getModelProjectDirectory());
-            IPath javaSource = new Path(genModel.getModelDirectory());
+            IProject modelProject = null;
+            IPath javaSource = null;
+            String modelProjectDirectory = genModel.getModelProjectDirectory();
+            if (modelProjectDirectory != null && !"".equals(modelProjectDirectory))
+            {
+              modelProject = workspace.getRoot().getProject(modelProjectDirectory);
+              javaSource = new Path(genModel.getModelDirectory());
+            }
 
             //DMS factor this into a method? Use a non-static subclass? 
             int style = 0;
@@ -426,8 +432,11 @@
                   projectLocation = getLocationURI(testsProject);
                 }
 
-                referencedProjects.add(modelProject);
-                referencedProjects.addAll(Arrays.asList(modelProject.getDescription().getReferencedProjects()));
+                if (modelProject != null)
+                {
+                  referencedProjects.add(modelProject);
+                  referencedProjects.addAll(Arrays.asList(modelProject.getDescription().getReferencedProjects()));
+                }
               }
             }
             else if ((style & Generator.EMF_MODEL_PROJECT_STYLE) == 0 && genModel.hasEditSupport())
@@ -442,7 +451,10 @@
                   projectLocation = getLocationURI(editProject);
                 }
 
-                referencedProjects.add(modelProject);
+                if (modelProject != null)
+                {
+                  referencedProjects.add(modelProject);
+                }
               }
   
               for (GenPackage genPackage : genModel.getUsedGenPackages())
@@ -482,7 +494,7 @@
               }
             }
 
-            if (projectLocation != null)
+            if (projectLocation != null && javaSource != null)
             {
               projectLocation = projectLocation.trimSegments(1).appendSegment(javaSource.segment(0));
             }
@@ -497,6 +509,11 @@
               style |= Generator.EMF_PLUGIN_PROJECT_STYLE;
             }
 
+            if (javaSource == null)
+            {
+              javaSource = new Path(genModel.getEditorDirectory());
+            }
+
             Generator.createEMFProject
               (javaSource,
                projectLocation, 
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenPackageGeneratorAdapter.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenPackageGeneratorAdapter.java
index e4bfd27..88a03a1 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenPackageGeneratorAdapter.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/generator/GenPackageGeneratorAdapter.java
@@ -209,6 +209,7 @@
       (genModel.getModelDirectory(), genPackage, MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
 
     generateSchema(genPackage, monitor);
+    generatePackagePublication(genPackage, monitor);
     generatePackageSerialization(genPackage, monitor);
     generatePackageInterface(genPackage, monitor);
     generatePackageClass(genPackage, monitor);
@@ -237,6 +238,140 @@
     monitor.worked(1);      
   }
 
+  /**
+   * @since 2.10
+   */
+  protected void generatePackagePublication(GenPackage genPackage, Monitor monitor)
+  {
+    String publicationLocation = genPackage.getPublicationLocation();
+    if (publicationLocation != null && !"".equals(publicationLocation))
+    {
+      monitor = createMonitor(monitor, 1);
+
+      try
+      {
+        monitor.beginTask("", 2);
+
+        final GenModel genModel = genPackage.getGenModel();
+        message = CodeGenEcorePlugin.INSTANCE.getString("_UI_GeneratingPackageSerialization_message", new Object[] { publicationLocation });
+        monitor.subTask(message);
+
+        URI targetFile = toURI(publicationLocation);
+        ensureContainerExists(targetFile.trimSegments(1), createMonitor(monitor, 1));
+
+        final ResourceSet originalSet = genModel.eResource().getResourceSet();
+        EPackage originalPackage = genPackage.getEcorePackage();
+
+        ResourceSet outputSet = new ResourceSetImpl();
+        outputSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new EcoreResourceFactoryImpl());
+        URI targetURI = toPlatformResourceURI(targetFile);
+        Resource outputResource = outputSet.createResource(targetURI);
+
+        // Copy the package.
+        EPackage outputPackage = EcoreUtil.copy(originalPackage);
+        outputResource.getContents().add(outputPackage);
+
+        // This URI handler redirects cross-document references to correct schema-location-based or namespace-based values.
+        //
+        XMLResource.URIHandler uriHandler = 
+          new URIHandlerImpl.PlatformSchemeAware()
+          {
+            private EPackage getRootContainingPackage(EObject object)
+            {
+              EPackage result = null;
+              while (object != null)
+              {
+                if (object instanceof EPackage)
+                {
+                  result = (EPackage)object;
+                }
+                object = object.eContainer();
+              }
+              return result;
+            }
+            
+            private EPackage getContainingPackage(EObject object)
+            {
+              while (object != null)
+              {
+                if (object instanceof EPackage)
+                {
+                  return (EPackage)object;
+                }
+                object = object.eContainer();
+              }
+              return null;
+            }
+
+            private URI redirect(URI uri)
+            {
+              if (!uri.isCurrentDocumentReference() && uri.hasFragment())
+              {
+                EObject object = originalSet.getEObject(uri, false);
+                if (object != null)
+                {
+                  EPackage ePackage = getRootContainingPackage(object);
+                  if (ePackage != null)
+                  {
+                    String schemaLocation = EcoreUtil.getAnnotation(ePackage, EcorePackage.eNS_URI, "schemaLocation");
+                    if (schemaLocation != null)
+                    {
+                      return URI.createURI(schemaLocation).appendFragment(uri.fragment());
+                    }
+                    else
+                    {
+                      String relativeURIFragmentPath = EcoreUtil.getRelativeURIFragmentPath(getContainingPackage(object), object);
+                      return URI.createURI(ePackage.getNsURI()).appendFragment("//" + relativeURIFragmentPath);
+                    }
+                  }
+                }
+              }
+              return uri;
+            }
+
+            @Override
+            public URI deresolve(URI uri)
+            {
+              return redirect(uri);
+            }
+
+            @Override
+            public URI resolve(URI uri)
+            {
+              throw new UnsupportedOperationException("There should be no resolving while serializing");
+            }
+
+            @Override
+            public void setBaseURI(URI uri)
+            {
+              baseURI = uri;
+            }
+          };
+        Map<Object, Object> options = new HashMap<Object, Object>();
+        options.put(XMLResource.OPTION_URI_HANDLER, uriHandler);
+        options.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+        options.put(Resource.OPTION_LINE_DELIMITER, Resource.OPTION_LINE_DELIMITER_UNSPECIFIED);
+
+        try
+        {
+          outputResource.save(options);
+        }
+        catch (IOException exception)
+        {
+          CodeGenEcorePlugin.INSTANCE.log(exception);
+        }
+      }
+      finally
+      {
+        monitor.done();
+      }
+    }
+    else
+    {
+      monitor.worked(1);
+    }
+  }
+
   protected void generatePackageSerialization(GenPackage genPackage, Monitor monitor)
   {
     if (genPackage.hasClassifiers() && genPackage.isLoadingInitialization())
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenClassImpl.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenClassImpl.java
index e02ee0e..000539e 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenClassImpl.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenClassImpl.java
@@ -2119,6 +2119,17 @@
     return baseClass;
   }
 
+  public List<String> getProviderImplementsClassNames()
+  {
+    List<String> result = new ArrayList<String>(getGenPackage().getProviderSupportedTypes());
+    GenClass classExtendsGenClass = getClassExtendsGenClass();
+    if (classExtendsGenClass != null)
+    {
+      result.removeAll(classExtendsGenClass.getGenPackage().getProviderSupportedTypes());
+    }
+    return result;
+  }
+
   public String getProviderBaseClassName()
   {
     GenClass baseClass = getProviderExtendsGenClass();
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelImpl.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelImpl.java
index 34ecb98..9305f08 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelImpl.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelImpl.java
@@ -7804,7 +7804,7 @@
 
   public String getEditPluginID()
   {
-    if (sameModelEditProject())
+    if (sameModelEditProject() && !isBlank(getModelDirectory()))
     {
       return getModelPluginID();
     }
@@ -8714,14 +8714,24 @@
 
     if (!sameEditEditorProject())
     {
+      boolean added = false;
       for (GenPackage genPackage : getGenPackages())
       {
         GenModel genModel = genPackage.getGenModel();
         if (genModel.hasEditSupport())
         {
+          added = true;
           result.add(genModel.getEditPluginID());
         }
       }
+
+      // Assume there is at least one model contributing item providers.
+      // E.g., when generating an RCP editor for a model generated by another GenModel.
+      //
+      if (!added)
+      {
+        result.add(getGenPackages().get(0).getGenModel().getEditPluginID());
+      }
     }
     else
     {
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelPackageImpl.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelPackageImpl.java
index f380471..19b101f 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelPackageImpl.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenModelPackageImpl.java
@@ -1453,6 +1453,16 @@
    * <!-- end-user-doc -->
    * @generated
    */
+  public EAttribute getGenPackage_PublicationLocation()
+  {
+    return (EAttribute)genPackageEClass.getEStructuralFeatures().get(29);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
   public EClass getGenClass()
   {
     return genClassEClass;
@@ -2185,6 +2195,7 @@
     createEReference(genPackageEClass, GEN_PACKAGE__GEN_CLASSES);
     createEReference(genPackageEClass, GEN_PACKAGE__NESTED_GEN_PACKAGES);
     createEReference(genPackageEClass, GEN_PACKAGE__GEN_CLASSIFIERS);
+    createEAttribute(genPackageEClass, GEN_PACKAGE__PUBLICATION_LOCATION);
 
     genClassEClass = createEClass(GEN_CLASS);
     createEAttribute(genClassEClass, GEN_CLASS__PROVIDER);
@@ -2424,6 +2435,7 @@
     initEReference(getGenPackage_GenClasses(), this.getGenClass(), null, "genClasses", null, 0, -1, GenPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
     initEReference(getGenPackage_NestedGenPackages(), this.getGenPackage(), null, "nestedGenPackages", null, 0, -1, GenPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
     initEReference(getGenPackage_GenClassifiers(), this.getGenClassifier(), this.getGenClassifier_GenPackage(), "genClassifiers", null, 0, -1, GenPackage.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getGenPackage_PublicationLocation(), theEcorePackage.getEString(), "publicationLocation", null, 0, 1, GenPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
     initEClass(genClassEClass, GenClass.class, "GenClass", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
     initEAttribute(getGenClass_Provider(), this.getGenProviderKind(), "provider", null, 0, 1, GenClass.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenPackageImpl.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenPackageImpl.java
index 0c0833d..f50b4c8 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenPackageImpl.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenPackageImpl.java
@@ -15,6 +15,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -122,6 +123,7 @@
  *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenPackageImpl#getGenClasses <em>Gen Classes</em>}</li>
  *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenPackageImpl#getNestedGenPackages <em>Nested Gen Packages</em>}</li>
  *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenPackageImpl#getGenClassifiers <em>Gen Classifiers</em>}</li>
+ *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenPackageImpl#getPublicationLocation <em>Publication Location</em>}</li>
  * </ul>
  * </p>
  *
@@ -622,6 +624,26 @@
   protected EList<GenPackage> nestedGenPackages;
 
   /**
+   * The default value of the '{@link #getPublicationLocation() <em>Publication Location</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getPublicationLocation()
+   * @generated
+   * @ordered
+   */
+  protected static final String PUBLICATION_LOCATION_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getPublicationLocation() <em>Publication Location</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getPublicationLocation()
+   * @generated
+   * @ordered
+   */
+  protected String publicationLocation = PUBLICATION_LOCATION_EDEFAULT;
+
+  /**
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated modifiable
@@ -1168,6 +1190,11 @@
     return COMMA_SEPARATOR_PATTERN.matcher(fileExtensions).replaceAll(",");
   }
 
+  public List<String> getFileExtensionList()
+  {
+    return Arrays.asList(getFileExtensions().split(","));
+  }
+
   /**
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
@@ -1387,6 +1414,29 @@
    * <!-- end-user-doc -->
    * @generated
    */
+  public String getPublicationLocation()
+  {
+    return publicationLocation;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setPublicationLocation(String newPublicationLocation)
+  {
+    String oldPublicationLocation = publicationLocation;
+    publicationLocation = newPublicationLocation;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, GenModelPackage.GEN_PACKAGE__PUBLICATION_LOCATION, oldPublicationLocation, publicationLocation));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
   @Override
   public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
@@ -1509,6 +1559,8 @@
         return getNestedGenPackages();
       case GenModelPackage.GEN_PACKAGE__GEN_CLASSIFIERS:
         return getGenClassifiers();
+      case GenModelPackage.GEN_PACKAGE__PUBLICATION_LOCATION:
+        return getPublicationLocation();
     }
     return super.eGet(featureID, resolve, coreType);
   }
@@ -1612,6 +1664,9 @@
         getNestedGenPackages().clear();
         getNestedGenPackages().addAll((Collection<? extends GenPackage>)newValue);
         return;
+      case GenModelPackage.GEN_PACKAGE__PUBLICATION_LOCATION:
+        setPublicationLocation((String)newValue);
+        return;
     }
     super.eSet(featureID, newValue);
   }
@@ -1710,6 +1765,9 @@
       case GenModelPackage.GEN_PACKAGE__NESTED_GEN_PACKAGES:
         getNestedGenPackages().clear();
         return;
+      case GenModelPackage.GEN_PACKAGE__PUBLICATION_LOCATION:
+        setPublicationLocation(PUBLICATION_LOCATION_EDEFAULT);
+        return;
     }
     super.eUnset(featureID);
   }
@@ -1782,6 +1840,8 @@
         return nestedGenPackages != null && !nestedGenPackages.isEmpty();
       case GenModelPackage.GEN_PACKAGE__GEN_CLASSIFIERS:
         return !getGenClassifiers().isEmpty();
+      case GenModelPackage.GEN_PACKAGE__PUBLICATION_LOCATION:
+        return PUBLICATION_LOCATION_EDEFAULT == null ? publicationLocation != null : !PUBLICATION_LOCATION_EDEFAULT.equals(publicationLocation);
     }
     return super.eIsSet(featureID);
   }
@@ -1841,6 +1901,8 @@
     result.append(contentTypeIdentifier);
     result.append(", fileExtensions: ");
     result.append(fileExtensions);
+    result.append(", publicationLocation: ");
+    result.append(publicationLocation);
     result.append(')');
     return result.toString();
   }
@@ -2087,6 +2149,12 @@
     return getTestsPackageName() + "." + getExampleClassName();
   }
 
+  public String getSchemaLocation()
+  {
+    String schemaLocation = EcoreUtil.getAnnotation(getEcorePackage(), EcorePackage.eNS_URI, "schemaLocation");
+    return schemaLocation == null ? "eNS_URI" : Literals.toStringLiteral(schemaLocation, getGenModel());
+  }
+
   protected static final boolean NO_CONSTRAINTS = "true".equals(System.getProperty("EMF_NO_CONSTRAINTS")); 
 
   public boolean hasConstraints()
@@ -4040,6 +4108,8 @@
     }
 
     reconcileGenAnnotations(oldGenPackageVersion);
+
+    setPublicationLocation(oldGenPackageVersion.getPublicationLocation());
   }
 
   public boolean reconcile()
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/ItemProvider.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/ItemProvider.java
index ecb8557..46a4ee3 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/ItemProvider.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/ItemProvider.java
@@ -22,283 +22,285 @@
   protected final String TEXT_5 = ";" + NL + NL;
   protected final String TEXT_6 = NL + NL + "/**" + NL + " * This is the item provider adapter for a {@link ";
   protected final String TEXT_7 = "} object." + NL + " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->" + NL + " * @generated" + NL + " */" + NL + "public class ";
-  protected final String TEXT_8 = NL + "\textends ";
-  protected final String TEXT_9 = NL + "\timplements";
-  protected final String TEXT_10 = NL + "\t\t";
-  protected final String TEXT_11 = ",";
-  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 ";
-  protected final String TEXT_14 = " copyright = ";
-  protected final String TEXT_15 = ";";
-  protected final String TEXT_16 = NL;
-  protected final String TEXT_17 = 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_18 = "(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_19 = NL + "\t@Override";
-  protected final String TEXT_20 = NL + "\tpublic ";
-  protected final String TEXT_21 = " getPropertyDescriptors(Object object)" + NL + "\t{" + NL + "\t\tif (itemPropertyDescriptors == null)" + NL + "\t\t{" + NL + "\t\t\tsuper.getPropertyDescriptors(object);" + NL;
-  protected final String TEXT_22 = NL + "\t\t\tadd";
-  protected final String TEXT_23 = "PropertyDescriptor(object);";
-  protected final String TEXT_24 = NL + "\t\t}" + NL + "\t\treturn itemPropertyDescriptors;" + NL + "\t}" + NL;
-  protected final String TEXT_25 = NL + "\t/**" + NL + "\t * This adds a property descriptor for the ";
-  protected final String TEXT_26 = " feature." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void add";
-  protected final String TEXT_27 = "PropertyDescriptor(Object object)" + NL + "\t{";
-  protected final String TEXT_28 = NL + "\t\titemPropertyDescriptors.add" + NL + "\t\t\t(createItemPropertyDescriptor" + NL + "\t\t\t\t(((";
-  protected final String TEXT_29 = ")adapterFactory).getRootAdapterFactory()," + NL + "\t\t\t\t getResourceLocator()," + NL + "\t\t\t\t getString(\"_UI_";
-  protected final String TEXT_30 = "_";
-  protected final String TEXT_31 = "_feature\"),";
-  protected final String TEXT_32 = NL + "\t\t\t\t getString(\"_UI_PropertyDescriptor_description\", \"_UI_";
-  protected final String TEXT_33 = "_";
-  protected final String TEXT_34 = "_feature\", \"_UI_";
-  protected final String TEXT_35 = "_type\"),";
-  protected final String TEXT_36 = NL + "\t\t\t\t getString(\"_UI_";
-  protected final String TEXT_37 = "_";
-  protected final String TEXT_38 = "_description\"),";
-  protected final String TEXT_39 = NL + "\t\t\t\t ";
-  protected final String TEXT_40 = "," + NL + "\t\t\t\t ";
-  protected final String TEXT_41 = "," + NL + "\t\t\t\t ";
+  protected final String TEXT_8 = " ";
+  protected final String TEXT_9 = "extends ";
+  protected final String TEXT_10 = NL + "\textends ";
+  protected final String TEXT_11 = NL + "\timplements";
+  protected final String TEXT_12 = NL + "\t\t";
+  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 + "\tpublic static final ";
+  protected final String TEXT_16 = " copyright = ";
+  protected final String TEXT_17 = ";";
+  protected final String TEXT_18 = NL;
+  protected final String TEXT_19 = 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_20 = "(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_21 = NL + "\t@Override";
+  protected final String TEXT_22 = NL + "\tpublic ";
+  protected final String TEXT_23 = " getPropertyDescriptors(Object object)" + NL + "\t{" + NL + "\t\tif (itemPropertyDescriptors == null)" + NL + "\t\t{" + NL + "\t\t\tsuper.getPropertyDescriptors(object);" + NL;
+  protected final String TEXT_24 = NL + "\t\t\tadd";
+  protected final String TEXT_25 = "PropertyDescriptor(object);";
+  protected final String TEXT_26 = NL + "\t\t}" + NL + "\t\treturn itemPropertyDescriptors;" + NL + "\t}" + NL;
+  protected final String TEXT_27 = NL + "\t/**" + NL + "\t * This adds a property descriptor for the ";
+  protected final String TEXT_28 = " feature." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void add";
+  protected final String TEXT_29 = "PropertyDescriptor(Object object)" + NL + "\t{";
+  protected final String TEXT_30 = NL + "\t\titemPropertyDescriptors.add" + NL + "\t\t\t(createItemPropertyDescriptor" + NL + "\t\t\t\t(((";
+  protected final String TEXT_31 = ")adapterFactory).getRootAdapterFactory()," + NL + "\t\t\t\t getResourceLocator()," + NL + "\t\t\t\t getString(\"_UI_";
+  protected final String TEXT_32 = "_";
+  protected final String TEXT_33 = "_feature\"),";
+  protected final String TEXT_34 = NL + "\t\t\t\t getString(\"_UI_PropertyDescriptor_description\", \"_UI_";
+  protected final String TEXT_35 = "_";
+  protected final String TEXT_36 = "_feature\", \"_UI_";
+  protected final String TEXT_37 = "_type\"),";
+  protected final String TEXT_38 = NL + "\t\t\t\t getString(\"_UI_";
+  protected final String TEXT_39 = "_";
+  protected final String TEXT_40 = "_description\"),";
+  protected final String TEXT_41 = NL + "\t\t\t\t ";
   protected final String TEXT_42 = "," + NL + "\t\t\t\t ";
-  protected final String TEXT_43 = ",";
-  protected final String TEXT_44 = NL + "\t\t\t\t null,";
-  protected final String TEXT_45 = NL + "\t\t\t\t ";
-  protected final String TEXT_46 = ".";
-  protected final String TEXT_47 = ",";
-  protected final String TEXT_48 = NL + "\t\t\t\t null,";
-  protected final String TEXT_49 = NL + "\t\t\t\t getString(\"";
-  protected final String TEXT_50 = "\"),";
-  protected final String TEXT_51 = NL + "\t\t\t\t null));";
-  protected final String TEXT_52 = NL + "\t\t\t\t new String[] {";
-  protected final String TEXT_53 = NL + "\t\t\t\t\t\"";
-  protected final String TEXT_54 = "\"";
-  protected final String TEXT_55 = ",";
-  protected final String TEXT_56 = NL + "\t\t\t\t }));";
-  protected final String TEXT_57 = NL + "\t}" + NL;
-  protected final String TEXT_58 = 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_59 = NL + "\t@Override";
-  protected final String TEXT_60 = NL + "\tpublic ";
-  protected final String TEXT_61 = " getChildrenFeatures(Object object)" + NL + "\t{" + NL + "\t\tif (childrenFeatures == null)" + NL + "\t\t{" + NL + "\t\t\tsuper.getChildrenFeatures(object);";
-  protected final String TEXT_62 = NL + "\t\t\tchildrenFeatures.add(";
-  protected final String TEXT_63 = ");";
-  protected final String TEXT_64 = NL + "\t\t}" + NL + "\t\treturn childrenFeatures;" + NL + "\t}" + NL;
-  protected final String TEXT_65 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
-  protected final String TEXT_66 = NL + "\t@Override";
-  protected final String TEXT_67 = NL + "\tprotected ";
-  protected final String TEXT_68 = " 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_69 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
-  protected final String TEXT_70 = NL + "\t@Override";
-  protected final String TEXT_71 = NL + "\tpublic boolean hasChildren(Object object)" + NL + "\t{" + NL + "\t\treturn hasChildren(object, ";
-  protected final String TEXT_72 = ");" + NL + "\t}" + NL;
-  protected final String TEXT_73 = NL + "\t/**" + NL + "\t * This returns ";
-  protected final String TEXT_74 = ".gif." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
-  protected final String TEXT_75 = NL + "\t@Override";
-  protected final String TEXT_76 = NL + "\tpublic Object getImage(Object object)" + NL + "\t{" + NL + "\t\treturn overlayImage(object, getResourceLocator().getImage(\"full/obj16/";
-  protected final String TEXT_77 = "\"));";
-  protected final String TEXT_78 = NL + "\t}" + NL;
-  protected final String TEXT_79 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
-  protected final String TEXT_80 = NL + "\t@Override";
-  protected final String TEXT_81 = NL + "\tprotected boolean shouldComposeCreationImage() " + NL + "\t{" + NL + "\t\treturn true;" + NL + "\t}" + NL;
-  protected final String TEXT_82 = 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_83 = NL + "\t@Override";
-  protected final String TEXT_84 = NL + "\tpublic String getText(Object object)" + NL + "\t{";
-  protected final String TEXT_85 = NL + "\t\treturn ((";
-  protected final String TEXT_86 = ")getStyledText(object)).getString();";
-  protected final String TEXT_87 = NL + "\t\t";
-  protected final String TEXT_88 = "<?, ?>";
-  protected final String TEXT_89 = " ";
-  protected final String TEXT_90 = " = (";
-  protected final String TEXT_91 = "<?, ?>";
-  protected final String TEXT_92 = ")object;";
-  protected final String TEXT_93 = NL + "\t\treturn \"\" + ";
-  protected final String TEXT_94 = ".getKey() + \" -> \" + ";
-  protected final String TEXT_95 = ".getValue();";
-  protected final String TEXT_96 = NL + "\t\tString key = crop(\"\" + ";
-  protected final String TEXT_97 = ".getKey());";
-  protected final String TEXT_98 = NL + "\t\tString key = \"\" + ";
-  protected final String TEXT_99 = ".getKey();";
-  protected final String TEXT_100 = NL + "\t\tString value = crop(\"\" + ";
-  protected final String TEXT_101 = ".getValue());";
-  protected final String TEXT_102 = NL + "\t\tString value = \"\" + ";
-  protected final String TEXT_103 = ".getValue();";
-  protected final String TEXT_104 = NL + "\t\treturn key + \" -> \" + value;";
-  protected final String TEXT_105 = NL + "\t\t";
-  protected final String TEXT_106 = " ";
-  protected final String TEXT_107 = " = (";
-  protected final String TEXT_108 = ")object;" + NL + "\t\treturn getString(\"_UI_";
-  protected final String TEXT_109 = "_type\") + \" \" + ";
-  protected final String TEXT_110 = ".";
-  protected final String TEXT_111 = "();";
-  protected final String TEXT_112 = NL + "\t\tString label = crop(((";
-  protected final String TEXT_113 = ")object).";
-  protected final String TEXT_114 = "());";
-  protected final String TEXT_115 = NL + "\t\tString label = ((";
-  protected final String TEXT_116 = ")object).";
-  protected final String TEXT_117 = "();";
-  protected final String TEXT_118 = NL + "\t\t";
-  protected final String TEXT_119 = " labelValue = ((";
-  protected final String TEXT_120 = ")object).eGet(";
-  protected final String TEXT_121 = ");";
-  protected final String TEXT_122 = NL + "\t\t";
-  protected final String TEXT_123 = " labelValue = ((";
-  protected final String TEXT_124 = ")object).";
-  protected final String TEXT_125 = "();";
-  protected final String TEXT_126 = NL + "\t\tString label = labelValue == null ? null : labelValue.toString();";
-  protected final String TEXT_127 = NL + "\t\treturn label == null || label.length() == 0 ?" + NL + "\t\t\tgetString(\"_UI_";
-  protected final String TEXT_128 = "_type\") :";
-  protected final String TEXT_129 = NL + "\t\t\tgetString(\"_UI_";
-  protected final String TEXT_130 = "_type\") + \" \" + label;";
-  protected final String TEXT_131 = NL + "\t\treturn getString(\"_UI_";
-  protected final String TEXT_132 = "_type\");";
-  protected final String TEXT_133 = NL + "\t}" + NL + "\t";
-  protected final String TEXT_134 = 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_135 = NL + "\t@Override";
-  protected final String TEXT_136 = NL + "\tpublic Object getStyledText(Object object)" + NL + "\t{";
-  protected final String TEXT_137 = NL + "\t\t";
-  protected final String TEXT_138 = "<?, ?>";
-  protected final String TEXT_139 = " ";
-  protected final String TEXT_140 = " = (";
-  protected final String TEXT_141 = "<?, ?>";
-  protected final String TEXT_142 = ")object;";
-  protected final String TEXT_143 = NL + "\t\treturn new ";
-  protected final String TEXT_144 = "(\"\" + ";
-  protected final String TEXT_145 = ".getKey()).append(\" -> \", ";
-  protected final String TEXT_146 = ".QUALIFIER_STYLER).append(\"\" + ";
-  protected final String TEXT_147 = ".getValue());";
-  protected final String TEXT_148 = NL + "\t\tString key = crop(\"\" + ";
-  protected final String TEXT_149 = ".getKey());";
-  protected final String TEXT_150 = NL + "\t\tString key = \"\" + ";
-  protected final String TEXT_151 = ".getKey();";
-  protected final String TEXT_152 = NL + "\t\tString value = crop(\"\" + ";
-  protected final String TEXT_153 = ".getValue());";
-  protected final String TEXT_154 = NL + "\t\tString value = \"\" + ";
-  protected final String TEXT_155 = ".getValue();";
-  protected final String TEXT_156 = NL + "\t\treturn new ";
-  protected final String TEXT_157 = "(key).append(\" -> \", ";
-  protected final String TEXT_158 = ".QUALIFIER_STYLER).append(value);";
-  protected final String TEXT_159 = NL + "\t\t";
-  protected final String TEXT_160 = " ";
-  protected final String TEXT_161 = " = (";
-  protected final String TEXT_162 = ")object;" + NL + "\t\treturn new ";
-  protected final String TEXT_163 = "(getString(\"_UI_";
-  protected final String TEXT_164 = "_type\", ";
-  protected final String TEXT_165 = ".QUALIFIER_STYLER).append(\" \").append(";
-  protected final String TEXT_166 = ".";
-  protected final String TEXT_167 = "());";
-  protected final String TEXT_168 = NL + "\t\tString label = crop(((";
-  protected final String TEXT_169 = ")object).";
-  protected final String TEXT_170 = "());";
-  protected final String TEXT_171 = NL + "\t\tString label = ((";
-  protected final String TEXT_172 = ")object).";
-  protected final String TEXT_173 = "();";
-  protected final String TEXT_174 = NL + "\t\t";
-  protected final String TEXT_175 = " labelValue = ((";
-  protected final String TEXT_176 = ")object).eGet(";
-  protected final String TEXT_177 = ");";
-  protected final String TEXT_178 = NL + "\t\t";
-  protected final String TEXT_179 = " labelValue = ((";
-  protected final String TEXT_180 = ")object).";
-  protected final String TEXT_181 = "();";
-  protected final String TEXT_182 = NL + "\t\tString label = labelValue == null ? null : labelValue.toString();";
-  protected final String TEXT_183 = NL + "    \t";
-  protected final String TEXT_184 = " styledLabel = new ";
-  protected final String TEXT_185 = "();" + NL + "\t\tif (label == null || label.length() == 0) " + NL + "\t\t{" + NL + "\t\t\tstyledLabel.append(getString(\"_UI_";
-  protected final String TEXT_186 = "_type\"), ";
-  protected final String TEXT_187 = ".QUALIFIER_STYLER); ";
-  protected final String TEXT_188 = NL + "\t\t} else {" + NL + "\t\t\tstyledLabel.append(getString(\"_UI_";
-  protected final String TEXT_189 = "_type\"), ";
-  protected final String TEXT_190 = ".QUALIFIER_STYLER).append(\" \" + label);";
-  protected final String TEXT_191 = NL + "\t\t}" + NL + "\t\treturn styledLabel;";
-  protected final String TEXT_192 = NL + "\t\treturn new ";
-  protected final String TEXT_193 = "(getString(\"_UI_";
-  protected final String TEXT_194 = "_type\"));";
-  protected final String TEXT_195 = NL + "\t}\t";
-  protected final String TEXT_196 = 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_197 = NL + "\t@Override";
-  protected final String TEXT_198 = NL + "\tpublic void notifyChanged(Notification notification)" + NL + "\t{" + NL + "\t\tupdateChildren(notification);";
-  protected final String TEXT_199 = NL + NL + "\t\tswitch (notification.getFeatureID(";
-  protected final String TEXT_200 = ".class))" + NL + "\t\t{";
-  protected final String TEXT_201 = NL + "\t\t\tcase ";
-  protected final String TEXT_202 = ":";
-  protected final String TEXT_203 = NL + "\t\t\t\tfireNotifyChanged(new ";
-  protected final String TEXT_204 = "(notification, notification.getNotifier(), false, true));" + NL + "\t\t\t\treturn;";
-  protected final String TEXT_205 = NL + "\t\t\tcase ";
-  protected final String TEXT_206 = ":";
-  protected final String TEXT_207 = NL + "\t\t\t\tfireNotifyChanged(new ";
-  protected final String TEXT_208 = "(notification, notification.getNotifier(), true, false));" + NL + "\t\t\t\treturn;";
-  protected final String TEXT_209 = NL + "\t\t\tcase ";
-  protected final String TEXT_210 = ":";
-  protected final String TEXT_211 = NL + "\t\t\t\tfireNotifyChanged(new ";
-  protected final String TEXT_212 = "(notification, notification.getNotifier(), true, true));" + NL + "\t\t\t\treturn;";
-  protected final String TEXT_213 = NL + "\t\t}";
-  protected final String TEXT_214 = NL + "\t\tsuper.notifyChanged(notification);" + NL + "\t}" + NL;
-  protected final String TEXT_215 = 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_216 = NL + "\t@Override";
-  protected final String TEXT_217 = NL + "\tprotected void collectNewChildDescriptors(";
-  protected final String TEXT_218 = " newChildDescriptors, Object object)" + NL + "\t{" + NL + "\t\tsuper.collectNewChildDescriptors(newChildDescriptors, object);";
-  protected final String TEXT_219 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
-  protected final String TEXT_220 = "," + NL + "\t\t\t\t ";
-  protected final String TEXT_221 = ".createEntry" + NL + "\t\t\t\t\t(";
-  protected final String TEXT_222 = ",";
-  protected final String TEXT_223 = NL + "\t\t\t\t\t ";
-  protected final String TEXT_224 = ".create(";
-  protected final String TEXT_225 = "))));";
-  protected final String TEXT_226 = NL + "\t\t\t\t\t ";
-  protected final String TEXT_227 = ".create";
-  protected final String TEXT_228 = "())));";
-  protected final String TEXT_229 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
-  protected final String TEXT_230 = "," + NL + "\t\t\t\t ";
-  protected final String TEXT_231 = ".createEntry" + NL + "\t\t\t\t\t(";
-  protected final String TEXT_232 = ",";
-  protected final String TEXT_233 = NL + "\t\t\t\t\t ";
-  protected final String TEXT_234 = ")));";
+  protected final String TEXT_43 = "," + NL + "\t\t\t\t ";
+  protected final String TEXT_44 = "," + NL + "\t\t\t\t ";
+  protected final String TEXT_45 = ",";
+  protected final String TEXT_46 = NL + "\t\t\t\t null,";
+  protected final String TEXT_47 = NL + "\t\t\t\t ";
+  protected final String TEXT_48 = ".";
+  protected final String TEXT_49 = ",";
+  protected final String TEXT_50 = NL + "\t\t\t\t null,";
+  protected final String TEXT_51 = NL + "\t\t\t\t getString(\"";
+  protected final String TEXT_52 = "\"),";
+  protected final String TEXT_53 = NL + "\t\t\t\t null));";
+  protected final String TEXT_54 = NL + "\t\t\t\t new String[] {";
+  protected final String TEXT_55 = NL + "\t\t\t\t\t\"";
+  protected final String TEXT_56 = "\"";
+  protected final String TEXT_57 = ",";
+  protected final String TEXT_58 = NL + "\t\t\t\t }));";
+  protected final String TEXT_59 = NL + "\t}" + NL;
+  protected final String TEXT_60 = 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_61 = NL + "\t@Override";
+  protected final String TEXT_62 = NL + "\tpublic ";
+  protected final String TEXT_63 = " getChildrenFeatures(Object object)" + NL + "\t{" + NL + "\t\tif (childrenFeatures == null)" + NL + "\t\t{" + NL + "\t\t\tsuper.getChildrenFeatures(object);";
+  protected final String TEXT_64 = NL + "\t\t\tchildrenFeatures.add(";
+  protected final String TEXT_65 = ");";
+  protected final String TEXT_66 = NL + "\t\t}" + NL + "\t\treturn childrenFeatures;" + NL + "\t}" + NL;
+  protected final String TEXT_67 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+  protected final String TEXT_68 = NL + "\t@Override";
+  protected final String TEXT_69 = NL + "\tprotected ";
+  protected final String TEXT_70 = " 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_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@Override";
+  protected final String TEXT_73 = NL + "\tpublic boolean hasChildren(Object object)" + NL + "\t{" + NL + "\t\treturn hasChildren(object, ";
+  protected final String TEXT_74 = ");" + NL + "\t}" + NL;
+  protected final String TEXT_75 = NL + "\t/**" + NL + "\t * This returns ";
+  protected final String TEXT_76 = ".gif." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+  protected final String TEXT_77 = NL + "\t@Override";
+  protected final String TEXT_78 = NL + "\tpublic Object getImage(Object object)" + NL + "\t{" + NL + "\t\treturn overlayImage(object, getResourceLocator().getImage(\"full/obj16/";
+  protected final String TEXT_79 = "\"));";
+  protected final String TEXT_80 = NL + "\t}" + NL;
+  protected final String TEXT_81 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
+  protected final String TEXT_82 = NL + "\t@Override";
+  protected final String TEXT_83 = NL + "\tprotected boolean shouldComposeCreationImage() " + NL + "\t{" + NL + "\t\treturn true;" + NL + "\t}" + NL;
+  protected final String TEXT_84 = 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_85 = NL + "\t@Override";
+  protected final String TEXT_86 = NL + "\tpublic String getText(Object object)" + NL + "\t{";
+  protected final String TEXT_87 = NL + "\t\treturn ((";
+  protected final String TEXT_88 = ")getStyledText(object)).getString();";
+  protected final String TEXT_89 = NL + "\t\t";
+  protected final String TEXT_90 = "<?, ?>";
+  protected final String TEXT_91 = " ";
+  protected final String TEXT_92 = " = (";
+  protected final String TEXT_93 = "<?, ?>";
+  protected final String TEXT_94 = ")object;";
+  protected final String TEXT_95 = NL + "\t\treturn \"\" + ";
+  protected final String TEXT_96 = ".getKey() + \" -> \" + ";
+  protected final String TEXT_97 = ".getValue();";
+  protected final String TEXT_98 = NL + "\t\tString key = crop(\"\" + ";
+  protected final String TEXT_99 = ".getKey());";
+  protected final String TEXT_100 = NL + "\t\tString key = \"\" + ";
+  protected final String TEXT_101 = ".getKey();";
+  protected final String TEXT_102 = NL + "\t\tString value = crop(\"\" + ";
+  protected final String TEXT_103 = ".getValue());";
+  protected final String TEXT_104 = NL + "\t\tString value = \"\" + ";
+  protected final String TEXT_105 = ".getValue();";
+  protected final String TEXT_106 = NL + "\t\treturn key + \" -> \" + value;";
+  protected final String TEXT_107 = NL + "\t\t";
+  protected final String TEXT_108 = " ";
+  protected final String TEXT_109 = " = (";
+  protected final String TEXT_110 = ")object;" + NL + "\t\treturn getString(\"_UI_";
+  protected final String TEXT_111 = "_type\") + \" \" + ";
+  protected final String TEXT_112 = ".";
+  protected final String TEXT_113 = "();";
+  protected final String TEXT_114 = NL + "\t\tString label = crop(((";
+  protected final String TEXT_115 = ")object).";
+  protected final String TEXT_116 = "());";
+  protected final String TEXT_117 = NL + "\t\tString label = ((";
+  protected final String TEXT_118 = ")object).";
+  protected final String TEXT_119 = "();";
+  protected final String TEXT_120 = NL + "\t\t";
+  protected final String TEXT_121 = " labelValue = ((";
+  protected final String TEXT_122 = ")object).eGet(";
+  protected final String TEXT_123 = ");";
+  protected final String TEXT_124 = NL + "\t\t";
+  protected final String TEXT_125 = " labelValue = ((";
+  protected final String TEXT_126 = ")object).";
+  protected final String TEXT_127 = "();";
+  protected final String TEXT_128 = NL + "\t\tString label = labelValue == null ? null : labelValue.toString();";
+  protected final String TEXT_129 = NL + "\t\treturn label == null || label.length() == 0 ?" + NL + "\t\t\tgetString(\"_UI_";
+  protected final String TEXT_130 = "_type\") :";
+  protected final String TEXT_131 = NL + "\t\t\tgetString(\"_UI_";
+  protected final String TEXT_132 = "_type\") + \" \" + label;";
+  protected final String TEXT_133 = NL + "\t\treturn getString(\"_UI_";
+  protected final String TEXT_134 = "_type\");";
+  protected final String TEXT_135 = NL + "\t}" + NL + "\t";
+  protected final String TEXT_136 = 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_137 = NL + "\t@Override";
+  protected final String TEXT_138 = NL + "\tpublic Object getStyledText(Object object)" + NL + "\t{";
+  protected final String TEXT_139 = NL + "\t\t";
+  protected final String TEXT_140 = "<?, ?>";
+  protected final String TEXT_141 = " ";
+  protected final String TEXT_142 = " = (";
+  protected final String TEXT_143 = "<?, ?>";
+  protected final String TEXT_144 = ")object;";
+  protected final String TEXT_145 = NL + "\t\treturn new ";
+  protected final String TEXT_146 = "(\"\" + ";
+  protected final String TEXT_147 = ".getKey()).append(\" -> \", ";
+  protected final String TEXT_148 = ".QUALIFIER_STYLER).append(\"\" + ";
+  protected final String TEXT_149 = ".getValue());";
+  protected final String TEXT_150 = NL + "\t\tString key = crop(\"\" + ";
+  protected final String TEXT_151 = ".getKey());";
+  protected final String TEXT_152 = NL + "\t\tString key = \"\" + ";
+  protected final String TEXT_153 = ".getKey();";
+  protected final String TEXT_154 = NL + "\t\tString value = crop(\"\" + ";
+  protected final String TEXT_155 = ".getValue());";
+  protected final String TEXT_156 = NL + "\t\tString value = \"\" + ";
+  protected final String TEXT_157 = ".getValue();";
+  protected final String TEXT_158 = NL + "\t\treturn new ";
+  protected final String TEXT_159 = "(key).append(\" -> \", ";
+  protected final String TEXT_160 = ".QUALIFIER_STYLER).append(value);";
+  protected final String TEXT_161 = NL + "\t\t";
+  protected final String TEXT_162 = " ";
+  protected final String TEXT_163 = " = (";
+  protected final String TEXT_164 = ")object;" + NL + "\t\treturn new ";
+  protected final String TEXT_165 = "(getString(\"_UI_";
+  protected final String TEXT_166 = "_type\", ";
+  protected final String TEXT_167 = ".QUALIFIER_STYLER).append(\" \").append(";
+  protected final String TEXT_168 = ".";
+  protected final String TEXT_169 = "());";
+  protected final String TEXT_170 = NL + "\t\tString label = crop(((";
+  protected final String TEXT_171 = ")object).";
+  protected final String TEXT_172 = "());";
+  protected final String TEXT_173 = NL + "\t\tString label = ((";
+  protected final String TEXT_174 = ")object).";
+  protected final String TEXT_175 = "();";
+  protected final String TEXT_176 = NL + "\t\t";
+  protected final String TEXT_177 = " labelValue = ((";
+  protected final String TEXT_178 = ")object).eGet(";
+  protected final String TEXT_179 = ");";
+  protected final String TEXT_180 = NL + "\t\t";
+  protected final String TEXT_181 = " labelValue = ((";
+  protected final String TEXT_182 = ")object).";
+  protected final String TEXT_183 = "();";
+  protected final String TEXT_184 = NL + "\t\tString label = labelValue == null ? null : labelValue.toString();";
+  protected final String TEXT_185 = NL + "    \t";
+  protected final String TEXT_186 = " styledLabel = new ";
+  protected final String TEXT_187 = "();" + NL + "\t\tif (label == null || label.length() == 0) " + NL + "\t\t{" + NL + "\t\t\tstyledLabel.append(getString(\"_UI_";
+  protected final String TEXT_188 = "_type\"), ";
+  protected final String TEXT_189 = ".QUALIFIER_STYLER); ";
+  protected final String TEXT_190 = NL + "\t\t} else {" + NL + "\t\t\tstyledLabel.append(getString(\"_UI_";
+  protected final String TEXT_191 = "_type\"), ";
+  protected final String TEXT_192 = ".QUALIFIER_STYLER).append(\" \" + label);";
+  protected final String TEXT_193 = NL + "\t\t}" + NL + "\t\treturn styledLabel;";
+  protected final String TEXT_194 = NL + "\t\treturn new ";
+  protected final String TEXT_195 = "(getString(\"_UI_";
+  protected final String TEXT_196 = "_type\"));";
+  protected final String TEXT_197 = NL + "\t}\t";
+  protected final String TEXT_198 = 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_199 = NL + "\t@Override";
+  protected final String TEXT_200 = NL + "\tpublic void notifyChanged(Notification notification)" + NL + "\t{" + NL + "\t\tupdateChildren(notification);";
+  protected final String TEXT_201 = NL + NL + "\t\tswitch (notification.getFeatureID(";
+  protected final String TEXT_202 = ".class))" + NL + "\t\t{";
+  protected final String TEXT_203 = NL + "\t\t\tcase ";
+  protected final String TEXT_204 = ":";
+  protected final String TEXT_205 = NL + "\t\t\t\tfireNotifyChanged(new ";
+  protected final String TEXT_206 = "(notification, notification.getNotifier(), false, true));" + NL + "\t\t\t\treturn;";
+  protected final String TEXT_207 = NL + "\t\t\tcase ";
+  protected final String TEXT_208 = ":";
+  protected final String TEXT_209 = NL + "\t\t\t\tfireNotifyChanged(new ";
+  protected final String TEXT_210 = "(notification, notification.getNotifier(), true, false));" + NL + "\t\t\t\treturn;";
+  protected final String TEXT_211 = NL + "\t\t\tcase ";
+  protected final String TEXT_212 = ":";
+  protected final String TEXT_213 = NL + "\t\t\t\tfireNotifyChanged(new ";
+  protected final String TEXT_214 = "(notification, notification.getNotifier(), true, true));" + NL + "\t\t\t\treturn;";
+  protected final String TEXT_215 = NL + "\t\t}";
+  protected final String TEXT_216 = NL + "\t\tsuper.notifyChanged(notification);" + NL + "\t}" + NL;
+  protected final String TEXT_217 = 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_218 = NL + "\t@Override";
+  protected final String TEXT_219 = NL + "\tprotected void collectNewChildDescriptors(";
+  protected final String TEXT_220 = " newChildDescriptors, Object object)" + NL + "\t{" + NL + "\t\tsuper.collectNewChildDescriptors(newChildDescriptors, object);";
+  protected final String TEXT_221 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
+  protected final String TEXT_222 = "," + NL + "\t\t\t\t ";
+  protected final String TEXT_223 = ".createEntry" + NL + "\t\t\t\t\t(";
+  protected final String TEXT_224 = ",";
+  protected final String TEXT_225 = NL + "\t\t\t\t\t ";
+  protected final String TEXT_226 = ".create(";
+  protected final String TEXT_227 = "))));";
+  protected final String TEXT_228 = NL + "\t\t\t\t\t ";
+  protected final String TEXT_229 = ".create";
+  protected final String TEXT_230 = "())));";
+  protected final String TEXT_231 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
+  protected final String TEXT_232 = "," + NL + "\t\t\t\t ";
+  protected final String TEXT_233 = ".createEntry" + NL + "\t\t\t\t\t(";
+  protected final String TEXT_234 = ",";
   protected final String TEXT_235 = NL + "\t\t\t\t\t ";
   protected final String TEXT_236 = ")));";
   protected final String TEXT_237 = NL + "\t\t\t\t\t ";
-  protected final String TEXT_238 = ".createFromString(";
-  protected final String TEXT_239 = ", ";
-  protected final String TEXT_240 = "))));";
-  protected final String TEXT_241 = " // TODO: ensure this is a valid literal value";
-  protected final String TEXT_242 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
-  protected final String TEXT_243 = ",";
-  protected final String TEXT_244 = NL + "\t\t\t\t ";
-  protected final String TEXT_245 = ".create(";
-  protected final String TEXT_246 = ")));";
-  protected final String TEXT_247 = NL + "\t\t\t\t ";
-  protected final String TEXT_248 = ".create";
-  protected final String TEXT_249 = "()));";
-  protected final String TEXT_250 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
-  protected final String TEXT_251 = ",";
-  protected final String TEXT_252 = NL + "\t\t\t\t ";
-  protected final String TEXT_253 = "));";
+  protected final String TEXT_238 = ")));";
+  protected final String TEXT_239 = NL + "\t\t\t\t\t ";
+  protected final String TEXT_240 = ".createFromString(";
+  protected final String TEXT_241 = ", ";
+  protected final String TEXT_242 = "))));";
+  protected final String TEXT_243 = " // TODO: ensure this is a valid literal value";
+  protected final String TEXT_244 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
+  protected final String TEXT_245 = ",";
+  protected final String TEXT_246 = NL + "\t\t\t\t ";
+  protected final String TEXT_247 = ".create(";
+  protected final String TEXT_248 = ")));";
+  protected final String TEXT_249 = NL + "\t\t\t\t ";
+  protected final String TEXT_250 = ".create";
+  protected final String TEXT_251 = "()));";
+  protected final String TEXT_252 = NL + NL + "\t\tnewChildDescriptors.add" + NL + "\t\t\t(createChildParameter" + NL + "\t\t\t\t(";
+  protected final String TEXT_253 = ",";
   protected final String TEXT_254 = NL + "\t\t\t\t ";
   protected final String TEXT_255 = "));";
   protected final String TEXT_256 = NL + "\t\t\t\t ";
-  protected final String TEXT_257 = ".createFromString(";
-  protected final String TEXT_258 = ", ";
-  protected final String TEXT_259 = ")));";
-  protected final String TEXT_260 = " // TODO: ensure this is a valid literal value";
-  protected final String TEXT_261 = NL + "\t}" + NL;
-  protected final String TEXT_262 = 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_263 = NL + "\t@Override";
-  protected final String TEXT_264 = NL + "\tpublic String getCreateChildText(Object owner, Object feature, Object child, ";
-  protected final String TEXT_265 = " selection)" + NL + "\t{" + NL + "\t\tObject childFeature = feature;" + NL + "\t\tObject childObject = child;" + NL;
-  protected final String TEXT_266 = NL + "\t\tif (childFeature instanceof ";
-  protected final String TEXT_267 = " && ";
-  protected final String TEXT_268 = ".isFeatureMap((EStructuralFeature)childFeature))" + NL + "\t\t{" + NL + "\t\t\t";
-  protected final String TEXT_269 = ".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_270 = NL + "\t\tboolean qualify =";
-  protected final String TEXT_271 = NL + "\t\t\tchildFeature == ";
-  protected final String TEXT_272 = 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_273 = 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_274 = 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_275 = NL + "\t@Override";
-  protected final String TEXT_276 = NL + "\tpublic ";
-  protected final String TEXT_277 = " getResourceLocator()" + NL + "\t{";
-  protected final String TEXT_278 = NL + "\t\treturn ((";
-  protected final String TEXT_279 = ")adapterFactory).getResourceLocator();";
-  protected final String TEXT_280 = NL + "\t\treturn ";
-  protected final String TEXT_281 = ".INSTANCE;";
-  protected final String TEXT_282 = NL + "\t}" + NL;
-  protected final String TEXT_283 = NL + "}";
-  protected final String TEXT_284 = NL;
+  protected final String TEXT_257 = "));";
+  protected final String TEXT_258 = NL + "\t\t\t\t ";
+  protected final String TEXT_259 = ".createFromString(";
+  protected final String TEXT_260 = ", ";
+  protected final String TEXT_261 = ")));";
+  protected final String TEXT_262 = " // TODO: ensure this is a valid literal value";
+  protected final String TEXT_263 = NL + "\t}" + NL;
+  protected final String TEXT_264 = 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_265 = NL + "\t@Override";
+  protected final String TEXT_266 = NL + "\tpublic String getCreateChildText(Object owner, Object feature, Object child, ";
+  protected final String TEXT_267 = " selection)" + NL + "\t{" + NL + "\t\tObject childFeature = feature;" + NL + "\t\tObject childObject = child;" + NL;
+  protected final String TEXT_268 = NL + "\t\tif (childFeature instanceof ";
+  protected final String TEXT_269 = " && ";
+  protected final String TEXT_270 = ".isFeatureMap((EStructuralFeature)childFeature))" + NL + "\t\t{" + NL + "\t\t\t";
+  protected final String TEXT_271 = ".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_272 = NL + "\t\tboolean qualify =";
+  protected final String TEXT_273 = NL + "\t\t\tchildFeature == ";
+  protected final String TEXT_274 = 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_275 = 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_276 = 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_277 = NL + "\t@Override";
+  protected final String TEXT_278 = NL + "\tpublic ";
+  protected final String TEXT_279 = " getResourceLocator()" + NL + "\t{";
+  protected final String TEXT_280 = NL + "\t\treturn ((";
+  protected final String TEXT_281 = ")adapterFactory).getResourceLocator();";
+  protected final String TEXT_282 = NL + "\t\treturn ";
+  protected final String TEXT_283 = ".INSTANCE;";
+  protected final String TEXT_284 = NL + "\t}" + NL;
+  protected final String TEXT_285 = NL + "}";
+  protected final String TEXT_286 = NL;
 
   public String generate(Object argument)
   {
@@ -340,665 +342,672 @@
     stringBuffer.append(TEXT_7);
     stringBuffer.append(genClass.getProviderClassName());
     stringBuffer.append(TEXT_8);
-    stringBuffer.append(genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName() : genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter"));
+    if (genClass.getProviderImplementsClassNames().isEmpty()) {
     stringBuffer.append(TEXT_9);
-    for (Iterator<String> i = genPackage.getProviderSupportedTypes().iterator(); i.hasNext(); ) {
+    stringBuffer.append(genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName() : genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter"));
+    }
+    if (!genClass.getProviderImplementsClassNames().isEmpty()) {
     stringBuffer.append(TEXT_10);
+    stringBuffer.append(genClass.getProviderBaseClassName() != null ? genClass.getProviderBaseClassName() : genModel.getImportedName("org.eclipse.emf.edit.provider.ItemProviderAdapter"));
+    stringBuffer.append(TEXT_11);
+    for (Iterator<String> i = genClass.getProviderImplementsClassNames().iterator(); i.hasNext(); ) {
+    stringBuffer.append(TEXT_12);
     stringBuffer.append(genModel.getImportedName(i.next()));
     if (i.hasNext()){
-    stringBuffer.append(TEXT_11);
-    }
-    }
-    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());
+    if (genModel.hasCopyrightField()) {
     stringBuffer.append(TEXT_15);
-    stringBuffer.append(genModel.getNonNLS());
+    stringBuffer.append(genModel.getImportedName("java.lang.String"));
     stringBuffer.append(TEXT_16);
-    }
+    stringBuffer.append(genModel.getCopyrightFieldLiteral());
     stringBuffer.append(TEXT_17);
-    stringBuffer.append(genClass.getProviderClassName());
+    stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(TEXT_18);
-    if (genModel.useClassOverrideAnnotation()) {
+    }
     stringBuffer.append(TEXT_19);
-    }
+    stringBuffer.append(genClass.getProviderClassName());
     stringBuffer.append(TEXT_20);
-    stringBuffer.append(_List);
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_21);
-    for (GenFeature genFeature : genClass.getPropertyFeatures()) { 
-    stringBuffer.append(TEXT_22);
-    stringBuffer.append(genFeature.getCapName());
-    stringBuffer.append(TEXT_23);
     }
-    stringBuffer.append(TEXT_24);
+    stringBuffer.append(TEXT_22);
+    stringBuffer.append(_List);
+    stringBuffer.append(TEXT_23);
     for (GenFeature genFeature : genClass.getPropertyFeatures()) { 
-    stringBuffer.append(TEXT_25);
-    stringBuffer.append(genFeature.getFormattedName());
-    stringBuffer.append(TEXT_26);
+    stringBuffer.append(TEXT_24);
     stringBuffer.append(genFeature.getCapName());
+    stringBuffer.append(TEXT_25);
+    }
+    stringBuffer.append(TEXT_26);
+    for (GenFeature genFeature : genClass.getPropertyFeatures()) { 
     stringBuffer.append(TEXT_27);
+    stringBuffer.append(genFeature.getFormattedName());
     stringBuffer.append(TEXT_28);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ComposeableAdapterFactory"));
+    stringBuffer.append(genFeature.getCapName());
     stringBuffer.append(TEXT_29);
-    stringBuffer.append(genFeature.getGenClass().getName());
     stringBuffer.append(TEXT_30);
-    stringBuffer.append(genFeature.getName());
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ComposeableAdapterFactory"));
     stringBuffer.append(TEXT_31);
+    stringBuffer.append(genFeature.getGenClass().getName());
+    stringBuffer.append(TEXT_32);
+    stringBuffer.append(genFeature.getName());
+    stringBuffer.append(TEXT_33);
     stringBuffer.append(genModel.getNonNLS());
     if (genFeature.getPropertyDescription() == null || genFeature.getPropertyDescription().length() == 0) {
-    stringBuffer.append(TEXT_32);
-    stringBuffer.append(genFeature.getGenClass().getName());
-    stringBuffer.append(TEXT_33);
-    stringBuffer.append(genFeature.getName());
     stringBuffer.append(TEXT_34);
     stringBuffer.append(genFeature.getGenClass().getName());
     stringBuffer.append(TEXT_35);
+    stringBuffer.append(genFeature.getName());
+    stringBuffer.append(TEXT_36);
+    stringBuffer.append(genFeature.getGenClass().getName());
+    stringBuffer.append(TEXT_37);
     stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(genModel.getNonNLS(2));
     stringBuffer.append(genModel.getNonNLS(3));
     } else {
-    stringBuffer.append(TEXT_36);
-    stringBuffer.append(genFeature.getGenClass().getName());
-    stringBuffer.append(TEXT_37);
-    stringBuffer.append(genFeature.getName());
     stringBuffer.append(TEXT_38);
+    stringBuffer.append(genFeature.getGenClass().getName());
+    stringBuffer.append(TEXT_39);
+    stringBuffer.append(genFeature.getName());
+    stringBuffer.append(TEXT_40);
     stringBuffer.append(genModel.getNonNLS());
     }
-    stringBuffer.append(TEXT_39);
-    stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
-    stringBuffer.append(TEXT_40);
-    stringBuffer.append(genFeature.getProperty() == GenPropertyKind.EDITABLE_LITERAL ? "true" : "false");
     stringBuffer.append(TEXT_41);
-    stringBuffer.append(genFeature.isPropertyMultiLine() ? "true" : "false");
+    stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_42);
-    stringBuffer.append(genFeature.isPropertySortChoices() ? "true" : "false");
+    stringBuffer.append(genFeature.getProperty() == GenPropertyKind.EDITABLE_LITERAL ? "true" : "false");
     stringBuffer.append(TEXT_43);
-    if (genFeature.isReferenceType()) {
+    stringBuffer.append(genFeature.isPropertyMultiLine() ? "true" : "false");
     stringBuffer.append(TEXT_44);
-    } else {
+    stringBuffer.append(genFeature.isPropertySortChoices() ? "true" : "false");
     stringBuffer.append(TEXT_45);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ItemPropertyDescriptor"));
+    if (genFeature.isReferenceType()) {
     stringBuffer.append(TEXT_46);
-    stringBuffer.append(genFeature.getPropertyImageName());
+    } else {
     stringBuffer.append(TEXT_47);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ItemPropertyDescriptor"));
+    stringBuffer.append(TEXT_48);
+    stringBuffer.append(genFeature.getPropertyImageName());
+    stringBuffer.append(TEXT_49);
     }
     if (genFeature.getPropertyCategory() == null || genFeature.getPropertyCategory().length() == 0) {
-    stringBuffer.append(TEXT_48);
-    } else {
-    stringBuffer.append(TEXT_49);
-    stringBuffer.append(genModel.getPropertyCategoryKey(genFeature.getPropertyCategory()));
     stringBuffer.append(TEXT_50);
+    } else {
+    stringBuffer.append(TEXT_51);
+    stringBuffer.append(genModel.getPropertyCategoryKey(genFeature.getPropertyCategory()));
+    stringBuffer.append(TEXT_52);
     stringBuffer.append(genModel.getNonNLS());
     }
     if (genFeature.getPropertyFilterFlags().isEmpty()) {
-    stringBuffer.append(TEXT_51);
+    stringBuffer.append(TEXT_53);
     } else {
-    stringBuffer.append(TEXT_52);
+    stringBuffer.append(TEXT_54);
     for (Iterator<String> j = genFeature.getPropertyFilterFlags().iterator(); j.hasNext();) { String filterFlag = j.next();
     if (filterFlag != null && filterFlag.length() > 0) {
-    stringBuffer.append(TEXT_53);
-    stringBuffer.append(filterFlag);
-    stringBuffer.append(TEXT_54);
-    if (j.hasNext()) {
     stringBuffer.append(TEXT_55);
+    stringBuffer.append(filterFlag);
+    stringBuffer.append(TEXT_56);
+    if (j.hasNext()) {
+    stringBuffer.append(TEXT_57);
     }
     stringBuffer.append(genModel.getNonNLS());
     }
     }
-    stringBuffer.append(TEXT_56);
+    stringBuffer.append(TEXT_58);
     }
     //ItemProvider/addPropertyDescriptor.override.javajetinc
-    stringBuffer.append(TEXT_57);
-    }
-    if (!genClass.getChildrenFeatures().isEmpty()) {
-    stringBuffer.append(TEXT_58);
-    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_59);
     }
-    stringBuffer.append(TEXT_60);
-    stringBuffer.append(genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<? extends org.eclipse.emf.ecore.EStructuralFeature>" : "java.util.Collection"));
-    stringBuffer.append(TEXT_61);
-    for (GenFeature genFeature : genClass.getChildrenFeatures()) { 
-    stringBuffer.append(TEXT_62);
-    stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
-    stringBuffer.append(TEXT_63);
-    }
-    stringBuffer.append(TEXT_64);
     if (!genClass.getChildrenFeatures().isEmpty()) {
-    stringBuffer.append(TEXT_65);
+    stringBuffer.append(TEXT_60);
     if (genModel.useClassOverrideAnnotation()) {
-    stringBuffer.append(TEXT_66);
+    stringBuffer.append(TEXT_61);
     }
+    stringBuffer.append(TEXT_62);
+    stringBuffer.append(genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<? extends org.eclipse.emf.ecore.EStructuralFeature>" : "java.util.Collection"));
+    stringBuffer.append(TEXT_63);
+    for (GenFeature genFeature : genClass.getChildrenFeatures()) { 
+    stringBuffer.append(TEXT_64);
+    stringBuffer.append(genFeature.getQualifiedFeatureAccessor());
+    stringBuffer.append(TEXT_65);
+    }
+    stringBuffer.append(TEXT_66);
+    if (!genClass.getChildrenFeatures().isEmpty()) {
     stringBuffer.append(TEXT_67);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_68);
     }
+    stringBuffer.append(TEXT_69);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+    stringBuffer.append(TEXT_70);
+    }
     }
     if (genClass.needsHasChildrenMethodOverride()) {
-    stringBuffer.append(TEXT_69);
-    if (genModel.useClassOverrideAnnotation()) {
-    stringBuffer.append(TEXT_70);
-    }
     stringBuffer.append(TEXT_71);
-    stringBuffer.append(genModel.isOptimizedHasChildren());
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_72);
     }
-    if (genClass.isImage()) {
     stringBuffer.append(TEXT_73);
-    stringBuffer.append(genClass.getName());
+    stringBuffer.append(genModel.isOptimizedHasChildren());
     stringBuffer.append(TEXT_74);
-    if (genModel.useClassOverrideAnnotation()) {
+    }
+    if (genClass.isImage()) {
     stringBuffer.append(TEXT_75);
-    }
-    stringBuffer.append(TEXT_76);
     stringBuffer.append(genClass.getName());
-    stringBuffer.append(TEXT_77);
-    stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(TEXT_78);
-    }
-    if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF26_VALUE && !genModel.isCreationIcons()) {
-    stringBuffer.append(TEXT_79);
+    stringBuffer.append(TEXT_76);
     if (genModel.useClassOverrideAnnotation()) {
+    stringBuffer.append(TEXT_77);
+    }
+    stringBuffer.append(TEXT_78);
+    stringBuffer.append(genClass.getName());
+    stringBuffer.append(TEXT_79);
+    stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(TEXT_80);
     }
+    if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF26_VALUE && !genModel.isCreationIcons()) {
     stringBuffer.append(TEXT_81);
-    }
-    stringBuffer.append(TEXT_82);
     if (genModel.useClassOverrideAnnotation()) {
+    stringBuffer.append(TEXT_82);
+    }
     stringBuffer.append(TEXT_83);
     }
     stringBuffer.append(TEXT_84);
-    if (genModel.isStyleProviders()) {
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_85);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    }
     stringBuffer.append(TEXT_86);
+    if (genModel.isStyleProviders()) {
+    stringBuffer.append(TEXT_87);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    stringBuffer.append(TEXT_88);
     } else {
     if (genClass.isMapEntry()) {
-    stringBuffer.append(TEXT_87);
-    stringBuffer.append(genClass.getImportedInterfaceName());
-    if (genModel.useGenerics()) {
-    stringBuffer.append(TEXT_88);
-    }
     stringBuffer.append(TEXT_89);
-    stringBuffer.append(genClass.getSafeUncapName());
-    stringBuffer.append(TEXT_90);
     stringBuffer.append(genClass.getImportedInterfaceName());
     if (genModel.useGenerics()) {
-    stringBuffer.append(TEXT_91);
+    stringBuffer.append(TEXT_90);
     }
+    stringBuffer.append(TEXT_91);
+    stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_92);
-    if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine() && !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+    stringBuffer.append(genClass.getImportedInterfaceName());
+    if (genModel.useGenerics()) {
     stringBuffer.append(TEXT_93);
-    stringBuffer.append(genClass.getSafeUncapName());
+    }
     stringBuffer.append(TEXT_94);
-    stringBuffer.append(genClass.getSafeUncapName());
+    if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine() && !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
     stringBuffer.append(TEXT_95);
-    stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(genModel.getNonNLS(2));
-    } else {
-    if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {
+    stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_96);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_97);
     stringBuffer.append(genModel.getNonNLS());
+    stringBuffer.append(genModel.getNonNLS(2));
     } else {
+    if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {
     stringBuffer.append(TEXT_98);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_99);
     stringBuffer.append(genModel.getNonNLS());
-    }
-    if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+    } else {
     stringBuffer.append(TEXT_100);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_101);
     stringBuffer.append(genModel.getNonNLS());
-    } else {
+    }
+    if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
     stringBuffer.append(TEXT_102);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_103);
     stringBuffer.append(genModel.getNonNLS());
-    }
+    } else {
     stringBuffer.append(TEXT_104);
+    stringBuffer.append(genClass.getSafeUncapName());
+    stringBuffer.append(TEXT_105);
+    stringBuffer.append(genModel.getNonNLS());
+    }
+    stringBuffer.append(TEXT_106);
     stringBuffer.append(genModel.getNonNLS());
     }
     } else if (genClass.getLabelFeature() != null) { GenFeature labelFeature = genClass.getLabelFeature();
     if (labelFeature.isPrimitiveType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {
-    stringBuffer.append(TEXT_105);
-    stringBuffer.append(genClass.getImportedInterfaceName());
-    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_106);
-    stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_107);
     stringBuffer.append(genClass.getImportedInterfaceName());
     stringBuffer.append(genClass.getInterfaceWildTypeArguments());
     stringBuffer.append(TEXT_108);
-    stringBuffer.append(genClass.getName());
-    stringBuffer.append(TEXT_109);
     stringBuffer.append(genClass.getSafeUncapName());
+    stringBuffer.append(TEXT_109);
+    stringBuffer.append(genClass.getImportedInterfaceName());
+    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
     stringBuffer.append(TEXT_110);
-    stringBuffer.append(genClass.getLabelFeature().getGetAccessor());
+    stringBuffer.append(genClass.getName());
     stringBuffer.append(TEXT_111);
+    stringBuffer.append(genClass.getSafeUncapName());
+    stringBuffer.append(TEXT_112);
+    stringBuffer.append(genClass.getLabelFeature().getGetAccessor());
+    stringBuffer.append(TEXT_113);
     stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(genModel.getNonNLS(2));
     } else {
     if (labelFeature.isStringType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {
     if (labelFeature.isPropertyMultiLine()) {
-    stringBuffer.append(TEXT_112);
-    stringBuffer.append(genClass.getImportedInterfaceName());
-    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_113);
-    stringBuffer.append(labelFeature.getGetAccessor());
     stringBuffer.append(TEXT_114);
-    } else {
-    stringBuffer.append(TEXT_115);
     stringBuffer.append(genClass.getImportedInterfaceName());
     stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_116);
+    stringBuffer.append(TEXT_115);
     stringBuffer.append(labelFeature.getGetAccessor());
+    stringBuffer.append(TEXT_116);
+    } else {
     stringBuffer.append(TEXT_117);
+    stringBuffer.append(genClass.getImportedInterfaceName());
+    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+    stringBuffer.append(TEXT_118);
+    stringBuffer.append(labelFeature.getGetAccessor());
+    stringBuffer.append(TEXT_119);
     }
     } else {
     if (labelFeature.isSuppressedGetVisibility() || labelFeature.getGenClass().isDynamic()) {
-    stringBuffer.append(TEXT_118);
-    stringBuffer.append(genModel.getImportedName("java.lang.Object"));
-    stringBuffer.append(TEXT_119);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
     stringBuffer.append(TEXT_120);
-    stringBuffer.append(labelFeature.getQualifiedFeatureAccessor());
+    stringBuffer.append(genModel.getImportedName("java.lang.Object"));
     stringBuffer.append(TEXT_121);
-    } else {
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
     stringBuffer.append(TEXT_122);
-    stringBuffer.append(labelFeature.getRawImportedType());
+    stringBuffer.append(labelFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_123);
+    } else {
+    stringBuffer.append(TEXT_124);
+    stringBuffer.append(labelFeature.getRawImportedType());
+    stringBuffer.append(TEXT_125);
     stringBuffer.append(genClass.getImportedInterfaceName());
     stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_124);
-    stringBuffer.append(labelFeature.getGetAccessor());
-    stringBuffer.append(TEXT_125);
-    }
     stringBuffer.append(TEXT_126);
-    }
+    stringBuffer.append(labelFeature.getGetAccessor());
     stringBuffer.append(TEXT_127);
-    stringBuffer.append(genClass.getName());
+    }
     stringBuffer.append(TEXT_128);
-    stringBuffer.append(genModel.getNonNLS());
+    }
     stringBuffer.append(TEXT_129);
     stringBuffer.append(genClass.getName());
     stringBuffer.append(TEXT_130);
     stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(genModel.getNonNLS(2));
-    }
-    } else {
     stringBuffer.append(TEXT_131);
     stringBuffer.append(genClass.getName());
     stringBuffer.append(TEXT_132);
     stringBuffer.append(genModel.getNonNLS());
+    stringBuffer.append(genModel.getNonNLS(2));
+    }
+    } else {
+    stringBuffer.append(TEXT_133);
+    stringBuffer.append(genClass.getName());
+    stringBuffer.append(TEXT_134);
+    stringBuffer.append(genModel.getNonNLS());
     }
     }
     //ItemProvider/getText.override.javajetinc
-    stringBuffer.append(TEXT_133);
-    if (genModel.isStyleProviders()) {
-    stringBuffer.append(TEXT_134);
-    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_135);
-    }
+    if (genModel.isStyleProviders()) {
     stringBuffer.append(TEXT_136);
-    if (genClass.isMapEntry()) {
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_137);
-    stringBuffer.append(genClass.getImportedInterfaceName());
-    if (genModel.useGenerics()) {
+    }
     stringBuffer.append(TEXT_138);
-    }
+    if (genClass.isMapEntry()) {
     stringBuffer.append(TEXT_139);
-    stringBuffer.append(genClass.getSafeUncapName());
-    stringBuffer.append(TEXT_140);
     stringBuffer.append(genClass.getImportedInterfaceName());
     if (genModel.useGenerics()) {
-    stringBuffer.append(TEXT_141);
+    stringBuffer.append(TEXT_140);
     }
-    stringBuffer.append(TEXT_142);
-    if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine() && !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
-    stringBuffer.append(TEXT_143);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
-    stringBuffer.append(TEXT_144);
+    stringBuffer.append(TEXT_141);
     stringBuffer.append(genClass.getSafeUncapName());
+    stringBuffer.append(TEXT_142);
+    stringBuffer.append(genClass.getImportedInterfaceName());
+    if (genModel.useGenerics()) {
+    stringBuffer.append(TEXT_143);
+    }
+    stringBuffer.append(TEXT_144);
+    if (!genClass.getMapEntryKeyFeature().isPropertyMultiLine() && !genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
     stringBuffer.append(TEXT_145);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
     stringBuffer.append(TEXT_146);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_147);
-    stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(genModel.getNonNLS(2));
-    } else {
-    if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
     stringBuffer.append(TEXT_148);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_149);
     stringBuffer.append(genModel.getNonNLS());
+    stringBuffer.append(genModel.getNonNLS(2));
     } else {
+    if (genClass.getMapEntryKeyFeature().isPropertyMultiLine()) {
     stringBuffer.append(TEXT_150);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_151);
     stringBuffer.append(genModel.getNonNLS());
-    }
-    if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
+    } else {
     stringBuffer.append(TEXT_152);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_153);
     stringBuffer.append(genModel.getNonNLS());
-    } else {
+    }
+    if (genClass.getMapEntryValueFeature().isPropertyMultiLine()) {
     stringBuffer.append(TEXT_154);
     stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_155);
     stringBuffer.append(genModel.getNonNLS());
-    }
+    } else {
     stringBuffer.append(TEXT_156);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_157);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+    stringBuffer.append(genModel.getNonNLS());
+    }
     stringBuffer.append(TEXT_158);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    stringBuffer.append(TEXT_159);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+    stringBuffer.append(TEXT_160);
     stringBuffer.append(genModel.getNonNLS());
     }
     } else if (genClass.getLabelFeature() != null) { GenFeature labelFeature = genClass.getLabelFeature();
     if (labelFeature.isPrimitiveType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {
-    stringBuffer.append(TEXT_159);
-    stringBuffer.append(genClass.getImportedInterfaceName());
-    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_160);
-    stringBuffer.append(genClass.getSafeUncapName());
     stringBuffer.append(TEXT_161);
     stringBuffer.append(genClass.getImportedInterfaceName());
     stringBuffer.append(genClass.getInterfaceWildTypeArguments());
     stringBuffer.append(TEXT_162);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
-    stringBuffer.append(TEXT_163);
-    stringBuffer.append(genClass.getName());
-    stringBuffer.append(TEXT_164);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
-    stringBuffer.append(TEXT_165);
     stringBuffer.append(genClass.getSafeUncapName());
+    stringBuffer.append(TEXT_163);
+    stringBuffer.append(genClass.getImportedInterfaceName());
+    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+    stringBuffer.append(TEXT_164);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    stringBuffer.append(TEXT_165);
+    stringBuffer.append(genClass.getName());
     stringBuffer.append(TEXT_166);
-    stringBuffer.append(genClass.getLabelFeature().getGetAccessor());
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
     stringBuffer.append(TEXT_167);
+    stringBuffer.append(genClass.getSafeUncapName());
+    stringBuffer.append(TEXT_168);
+    stringBuffer.append(genClass.getLabelFeature().getGetAccessor());
+    stringBuffer.append(TEXT_169);
     stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(genModel.getNonNLS(2));
     } else {
     if (labelFeature.isStringType() && !labelFeature.getGenClass().isDynamic() && !labelFeature.isSuppressedGetVisibility()) {
     if (labelFeature.isPropertyMultiLine()) {
-    stringBuffer.append(TEXT_168);
-    stringBuffer.append(genClass.getImportedInterfaceName());
-    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_169);
-    stringBuffer.append(labelFeature.getGetAccessor());
     stringBuffer.append(TEXT_170);
-    } else {
-    stringBuffer.append(TEXT_171);
     stringBuffer.append(genClass.getImportedInterfaceName());
     stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_172);
+    stringBuffer.append(TEXT_171);
     stringBuffer.append(labelFeature.getGetAccessor());
+    stringBuffer.append(TEXT_172);
+    } else {
     stringBuffer.append(TEXT_173);
+    stringBuffer.append(genClass.getImportedInterfaceName());
+    stringBuffer.append(genClass.getInterfaceWildTypeArguments());
+    stringBuffer.append(TEXT_174);
+    stringBuffer.append(labelFeature.getGetAccessor());
+    stringBuffer.append(TEXT_175);
     }
     } else {
     if (labelFeature.isSuppressedGetVisibility() || labelFeature.getGenClass().isDynamic()) {
-    stringBuffer.append(TEXT_174);
-    stringBuffer.append(genModel.getImportedName("java.lang.Object"));
-    stringBuffer.append(TEXT_175);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
     stringBuffer.append(TEXT_176);
-    stringBuffer.append(labelFeature.getQualifiedFeatureAccessor());
+    stringBuffer.append(genModel.getImportedName("java.lang.Object"));
     stringBuffer.append(TEXT_177);
-    } else {
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
     stringBuffer.append(TEXT_178);
-    stringBuffer.append(labelFeature.getRawImportedType());
+    stringBuffer.append(labelFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_179);
+    } else {
+    stringBuffer.append(TEXT_180);
+    stringBuffer.append(labelFeature.getRawImportedType());
+    stringBuffer.append(TEXT_181);
     stringBuffer.append(genClass.getImportedInterfaceName());
     stringBuffer.append(genClass.getInterfaceWildTypeArguments());
-    stringBuffer.append(TEXT_180);
-    stringBuffer.append(labelFeature.getGetAccessor());
-    stringBuffer.append(TEXT_181);
-    }
     stringBuffer.append(TEXT_182);
-    }
+    stringBuffer.append(labelFeature.getGetAccessor());
     stringBuffer.append(TEXT_183);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    }
     stringBuffer.append(TEXT_184);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    }
     stringBuffer.append(TEXT_185);
-    stringBuffer.append(genClass.getName());
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
     stringBuffer.append(TEXT_186);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
     stringBuffer.append(TEXT_187);
-    stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(TEXT_188);
     stringBuffer.append(genClass.getName());
-    stringBuffer.append(TEXT_189);
+    stringBuffer.append(TEXT_188);
     stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+    stringBuffer.append(TEXT_189);
+    stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(TEXT_190);
+    stringBuffer.append(genClass.getName());
+    stringBuffer.append(TEXT_191);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString$Style"));
+    stringBuffer.append(TEXT_192);
     stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(genModel.getNonNLS(2));
-    stringBuffer.append(TEXT_191);
+    stringBuffer.append(TEXT_193);
     }
     } else {
-    stringBuffer.append(TEXT_192);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
-    stringBuffer.append(TEXT_193);
-    stringBuffer.append(genClass.getName());
     stringBuffer.append(TEXT_194);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.StyledString"));
+    stringBuffer.append(TEXT_195);
+    stringBuffer.append(genClass.getName());
+    stringBuffer.append(TEXT_196);
     stringBuffer.append(genModel.getNonNLS());
     }
     //ItemProvider/getStyledText.override.javajetinc
-    stringBuffer.append(TEXT_195);
-    }
-    stringBuffer.append(TEXT_196);
-    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_197);
     }
     stringBuffer.append(TEXT_198);
-    if (!genClass.getLabelNotifyFeatures().isEmpty() || !genClass.getContentNotifyFeatures().isEmpty() || !genClass.getLabelAndContentNotifyFeatures().isEmpty()) {
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_199);
-    stringBuffer.append(genClass.getRawImportedInterfaceName());
+    }
     stringBuffer.append(TEXT_200);
+    if (!genClass.getLabelNotifyFeatures().isEmpty() || !genClass.getContentNotifyFeatures().isEmpty() || !genClass.getLabelAndContentNotifyFeatures().isEmpty()) {
+    stringBuffer.append(TEXT_201);
+    stringBuffer.append(genClass.getRawImportedInterfaceName());
+    stringBuffer.append(TEXT_202);
     if (!genClass.getLabelNotifyFeatures().isEmpty()) {
     for (GenFeature genFeature : genClass.getLabelNotifyFeatures()) { 
-    stringBuffer.append(TEXT_201);
-    stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
-    stringBuffer.append(TEXT_202);
-    }
     stringBuffer.append(TEXT_203);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+    stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
     stringBuffer.append(TEXT_204);
     }
+    stringBuffer.append(TEXT_205);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+    stringBuffer.append(TEXT_206);
+    }
     if (!genClass.getContentNotifyFeatures().isEmpty()) {
     for (GenFeature genFeature : genClass.getContentNotifyFeatures()) { 
-    stringBuffer.append(TEXT_205);
-    stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
-    stringBuffer.append(TEXT_206);
-    }
     stringBuffer.append(TEXT_207);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+    stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
     stringBuffer.append(TEXT_208);
     }
+    stringBuffer.append(TEXT_209);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+    stringBuffer.append(TEXT_210);
+    }
     if (!genClass.getLabelAndContentNotifyFeatures().isEmpty()) {
     for (GenFeature genFeature : genClass.getLabelAndContentNotifyFeatures()) { 
-    stringBuffer.append(TEXT_209);
-    stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
-    stringBuffer.append(TEXT_210);
-    }
     stringBuffer.append(TEXT_211);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
+    stringBuffer.append(genClass.getQualifiedFeatureID(genFeature));
     stringBuffer.append(TEXT_212);
     }
     stringBuffer.append(TEXT_213);
-    }
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ViewerNotification"));
     stringBuffer.append(TEXT_214);
-    if (genModel.isCreationCommands()) {
-    stringBuffer.append(TEXT_215);
-    if (genModel.useClassOverrideAnnotation()) {
-    stringBuffer.append(TEXT_216);
     }
+    stringBuffer.append(TEXT_215);
+    }
+    stringBuffer.append(TEXT_216);
+    if (genModel.isCreationCommands()) {
     stringBuffer.append(TEXT_217);
-    stringBuffer.append(genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<java.lang.Object>" : "java.util.Collection"));
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_218);
+    }
+    stringBuffer.append(TEXT_219);
+    stringBuffer.append(genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<java.lang.Object>" : "java.util.Collection"));
+    stringBuffer.append(TEXT_220);
     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_219);
-    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
-    stringBuffer.append(TEXT_220);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
     stringBuffer.append(TEXT_221);
-    stringBuffer.append(delegatedFeature.getQualifiedFeatureAccessor());
+    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_222);
-    if (createClass.isMapEntry()) { 
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
     stringBuffer.append(TEXT_223);
-    stringBuffer.append(createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+    stringBuffer.append(delegatedFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_224);
-    stringBuffer.append(createClass.getQualifiedClassifierAccessor());
+    if (createClass.isMapEntry()) { 
     stringBuffer.append(TEXT_225);
-    } else {
+    stringBuffer.append(createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor());
     stringBuffer.append(TEXT_226);
-    stringBuffer.append(createClass.getGenPackage().getQualifiedFactoryInstanceAccessor());
+    stringBuffer.append(createClass.getQualifiedClassifierAccessor());
     stringBuffer.append(TEXT_227);
-    stringBuffer.append(createClass.getName());
+    } else {
     stringBuffer.append(TEXT_228);
+    stringBuffer.append(createClass.getGenPackage().getQualifiedFactoryInstanceAccessor());
+    stringBuffer.append(TEXT_229);
+    stringBuffer.append(createClass.getName());
+    stringBuffer.append(TEXT_230);
     }
     //ItemProvider/newChildDescriptorsReferenceDelegatedFeature.override.javajetinc
     } else { GenDataType createDataType = (GenDataType)createClassifier;
-    stringBuffer.append(TEXT_229);
-    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
-    stringBuffer.append(TEXT_230);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
     stringBuffer.append(TEXT_231);
-    stringBuffer.append(delegatedFeature.getQualifiedFeatureAccessor());
+    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_232);
-    if (delegatedFeature.isEnumBasedType()) {
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
     stringBuffer.append(TEXT_233);
-    stringBuffer.append(delegatedFeature.getTypeGenEnum().getStaticValue(delegatedFeature.getEcoreFeature().getDefaultValueLiteral()));
+    stringBuffer.append(delegatedFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_234);
-    } else if (delegatedFeature.isStringBasedType()) {
+    if (delegatedFeature.isEnumBasedType()) {
     stringBuffer.append(TEXT_235);
-    stringBuffer.append(delegatedFeature.getCreateChildValueLiteral());
+    stringBuffer.append(delegatedFeature.getTypeGenEnum().getStaticValue(delegatedFeature.getEcoreFeature().getDefaultValueLiteral()));
     stringBuffer.append(TEXT_236);
+    } else if (delegatedFeature.isStringBasedType()) {
+    stringBuffer.append(TEXT_237);
+    stringBuffer.append(delegatedFeature.getCreateChildValueLiteral());
+    stringBuffer.append(TEXT_238);
     stringBuffer.append(genModel.getNonNLS());
     } else { String literal = delegatedFeature.getCreateChildValueLiteral();
-    stringBuffer.append(TEXT_237);
-    stringBuffer.append(createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
-    stringBuffer.append(TEXT_238);
-    stringBuffer.append(createDataType.getQualifiedClassifierAccessor());
     stringBuffer.append(TEXT_239);
-    stringBuffer.append(literal);
+    stringBuffer.append(createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
     stringBuffer.append(TEXT_240);
+    stringBuffer.append(createDataType.getQualifiedClassifierAccessor());
+    stringBuffer.append(TEXT_241);
+    stringBuffer.append(literal);
+    stringBuffer.append(TEXT_242);
     if (literal != null) {
     stringBuffer.append(genModel.getNonNLS());
     } else {
-    stringBuffer.append(TEXT_241);
+    stringBuffer.append(TEXT_243);
     }
     }
     //ItemProvider/newChildDescriptorsAttributeDelegatedFeature.override.javajetinc
     }
     } else if (createFeature.isReferenceType()) { GenClass createClass = (GenClass)createClassifier;
-    stringBuffer.append(TEXT_242);
-    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
-    stringBuffer.append(TEXT_243);
-    if (createClass.isMapEntry()) { 
     stringBuffer.append(TEXT_244);
-    stringBuffer.append(createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor());
+    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_245);
-    stringBuffer.append(createClass.getQualifiedClassifierAccessor());
+    if (createClass.isMapEntry()) { 
     stringBuffer.append(TEXT_246);
-    } else {
+    stringBuffer.append(createClass.getGenPackage().getQualifiedEFactoryInstanceAccessor());
     stringBuffer.append(TEXT_247);
-    stringBuffer.append(createClass.getGenPackage().getQualifiedFactoryInstanceAccessor());
+    stringBuffer.append(createClass.getQualifiedClassifierAccessor());
     stringBuffer.append(TEXT_248);
-    stringBuffer.append(createClass.getName());
+    } else {
     stringBuffer.append(TEXT_249);
+    stringBuffer.append(createClass.getGenPackage().getQualifiedFactoryInstanceAccessor());
+    stringBuffer.append(TEXT_250);
+    stringBuffer.append(createClass.getName());
+    stringBuffer.append(TEXT_251);
     }
     //ItemProvider/newChildDescriptorsReferenceFeature.override.javajetinc 
     } else { GenDataType createDataType = (GenDataType)createClassifier;
-    stringBuffer.append(TEXT_250);
-    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
-    stringBuffer.append(TEXT_251);
-    if (createFeature.isEnumBasedType()) {
     stringBuffer.append(TEXT_252);
-    stringBuffer.append(createFeature.getTypeGenEnum().getStaticValue(createFeature.getEcoreFeature().getDefaultValueLiteral()));
+    stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(TEXT_253);
-    } else if (createFeature.isStringBasedType()) {
+    if (createFeature.isEnumBasedType()) {
     stringBuffer.append(TEXT_254);
-    stringBuffer.append(createFeature.getCreateChildValueLiteral());
+    stringBuffer.append(createFeature.getTypeGenEnum().getStaticValue(createFeature.getEcoreFeature().getDefaultValueLiteral()));
     stringBuffer.append(TEXT_255);
+    } else if (createFeature.isStringBasedType()) {
+    stringBuffer.append(TEXT_256);
+    stringBuffer.append(createFeature.getCreateChildValueLiteral());
+    stringBuffer.append(TEXT_257);
     stringBuffer.append(genModel.getNonNLS());
     } else { String literal = createFeature.getCreateChildValueLiteral();
-    stringBuffer.append(TEXT_256);
-    stringBuffer.append(createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
-    stringBuffer.append(TEXT_257);
-    stringBuffer.append(createDataType.getQualifiedClassifierAccessor());
     stringBuffer.append(TEXT_258);
-    stringBuffer.append(literal);
+    stringBuffer.append(createDataType.getGenPackage().getQualifiedEFactoryInstanceAccessor());
     stringBuffer.append(TEXT_259);
+    stringBuffer.append(createDataType.getQualifiedClassifierAccessor());
+    stringBuffer.append(TEXT_260);
+    stringBuffer.append(literal);
+    stringBuffer.append(TEXT_261);
     if (literal != null) {
     stringBuffer.append(genModel.getNonNLS());
     } else {
-    stringBuffer.append(TEXT_260);
+    stringBuffer.append(TEXT_262);
     }
     }
     //ItemProvider/newChildDescriptorsAttributeFeature.override.javajetinc
     }
     }
-    stringBuffer.append(TEXT_261);
-    if (!genClass.getSharedClassCreateChildFeatures().isEmpty()) {
-    stringBuffer.append(TEXT_262);
-    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_263);
-    }
+    if (!genClass.getSharedClassCreateChildFeatures().isEmpty()) {
     stringBuffer.append(TEXT_264);
-    stringBuffer.append(genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<?>" : "java.util.Collection"));
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_265);
-    if (genClass.hasFeatureMapCreateChildFeatures()) {
-    stringBuffer.append(TEXT_266);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
-    stringBuffer.append(TEXT_267);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
-    stringBuffer.append(TEXT_268);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
-    stringBuffer.append(TEXT_269);
     }
+    stringBuffer.append(TEXT_266);
+    stringBuffer.append(genModel.getImportedName(genModel.useGenerics() ? "java.util.Collection<?>" : "java.util.Collection"));
+    stringBuffer.append(TEXT_267);
+    if (genClass.hasFeatureMapCreateChildFeatures()) {
+    stringBuffer.append(TEXT_268);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
+    stringBuffer.append(TEXT_269);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMapUtil"));
     stringBuffer.append(TEXT_270);
-    for (Iterator<GenFeature> i = genClass.getSharedClassCreateChildFeatures().iterator(); i.hasNext();) { GenFeature createFeature = i.next();
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap"));
     stringBuffer.append(TEXT_271);
+    }
+    stringBuffer.append(TEXT_272);
+    for (Iterator<GenFeature> i = genClass.getSharedClassCreateChildFeatures().iterator(); i.hasNext();) { GenFeature createFeature = i.next();
+    stringBuffer.append(TEXT_273);
     stringBuffer.append(createFeature.getQualifiedFeatureAccessor());
     stringBuffer.append(i.hasNext() ? " ||" : ";");
     }
-    stringBuffer.append(TEXT_272);
+    stringBuffer.append(TEXT_274);
     stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(TEXT_273);
+    stringBuffer.append(TEXT_275);
     }
     }
     if (genClass.getProviderExtendsGenClass() == null || genClass.getProviderExtendsGenClass().getGenPackage() != genPackage && (!genPackage.isExtensibleProviderFactory() || genClass.getProviderExtendsGenClass().getGenPackage().isExtensibleProviderFactory() != genPackage.isExtensibleProviderFactory())) {
-    stringBuffer.append(TEXT_274);
-    if (genModel.useClassOverrideAnnotation()) {
-    stringBuffer.append(TEXT_275);
-    }
     stringBuffer.append(TEXT_276);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_277);
-    if (genPackage.isExtensibleProviderFactory()) {
+    }
     stringBuffer.append(TEXT_278);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
     stringBuffer.append(TEXT_279);
-    } else {
+    if (genPackage.isExtensibleProviderFactory()) {
     stringBuffer.append(TEXT_280);
-    stringBuffer.append(genPackage.getImportedEditPluginClassName());
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
     stringBuffer.append(TEXT_281);
-    }
+    } else {
     stringBuffer.append(TEXT_282);
-    }
+    stringBuffer.append(genPackage.getImportedEditPluginClassName());
     stringBuffer.append(TEXT_283);
-    genModel.emitSortedImports();
+    }
     stringBuffer.append(TEXT_284);
+    }
+    stringBuffer.append(TEXT_285);
+    genModel.emitSortedImports();
+    stringBuffer.append(TEXT_286);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/PluginXML.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/PluginXML.java
index 67f9fc5..ec4ad3c 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/PluginXML.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/edit/PluginXML.java
@@ -66,26 +66,27 @@
   protected final String TEXT_49 = " -->";
   protected final String TEXT_50 = NL + "      <parser" + NL + "            type=\"";
   protected final String TEXT_51 = "\"" + NL + "            class=\"";
-  protected final String TEXT_52 = "\"/>" + NL + "   </extension>";
-  protected final String TEXT_53 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.itemProviderAdapterFactories\">";
-  protected final String TEXT_54 = NL + "      <!-- @generated ";
-  protected final String TEXT_55 = " -->";
-  protected final String TEXT_56 = NL + "      <factory" + NL + "            uri=\"";
-  protected final String TEXT_57 = "\"" + NL + "            class=\"";
-  protected final String TEXT_58 = "\"" + NL + "            supportedTypes=";
-  protected final String TEXT_59 = NL + "              ";
-  protected final String TEXT_60 = "\"/>";
-  protected final String TEXT_61 = NL + "   </extension>";
-  protected final String TEXT_62 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.childCreationExtenders\">";
-  protected final String TEXT_63 = NL + "      <!-- @generated ";
-  protected final String TEXT_64 = " -->";
-  protected final String TEXT_65 = NL + "      <extender" + NL + "            uri=\"";
-  protected final String TEXT_66 = "\"" + NL + "            class=\"";
-  protected final String TEXT_67 = "$";
-  protected final String TEXT_68 = "\"/>";
-  protected final String TEXT_69 = NL + "   </extension>";
-  protected final String TEXT_70 = NL + NL + "</plugin>";
-  protected final String TEXT_71 = NL;
+  protected final String TEXT_52 = "\"/>";
+  protected final String TEXT_53 = NL + "   </extension>";
+  protected final String TEXT_54 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.itemProviderAdapterFactories\">";
+  protected final String TEXT_55 = NL + "      <!-- @generated ";
+  protected final String TEXT_56 = " -->";
+  protected final String TEXT_57 = NL + "      <factory" + NL + "            uri=\"";
+  protected final String TEXT_58 = "\"" + NL + "            class=\"";
+  protected final String TEXT_59 = "\"" + NL + "            supportedTypes=";
+  protected final String TEXT_60 = NL + "              ";
+  protected final String TEXT_61 = "\"/>";
+  protected final String TEXT_62 = NL + "   </extension>";
+  protected final String TEXT_63 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.childCreationExtenders\">";
+  protected final String TEXT_64 = NL + "      <!-- @generated ";
+  protected final String TEXT_65 = " -->";
+  protected final String TEXT_66 = NL + "      <extender" + NL + "            uri=\"";
+  protected final String TEXT_67 = "\"" + NL + "            class=\"";
+  protected final String TEXT_68 = "$";
+  protected final String TEXT_69 = "\"/>";
+  protected final String TEXT_70 = NL + "   </extension>";
+  protected final String TEXT_71 = NL + NL + "</plugin>";
+  protected final String TEXT_72 = NL;
 
   public String generate(Object argument)
   {
@@ -204,60 +205,63 @@
     stringBuffer.append(key);
     stringBuffer.append(TEXT_49);
     }
+    for (String fileExtension : genPackage.getFileExtensionList()) {
     stringBuffer.append(TEXT_50);
-    stringBuffer.append(genPackage.getFileExtension());
+    stringBuffer.append(fileExtension);
     stringBuffer.append(TEXT_51);
     stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
     stringBuffer.append(TEXT_52);
     }
+    stringBuffer.append(TEXT_53);
+    }
     }
     }
     for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
     if (!genPackage.getGenClasses().isEmpty()) {
-    stringBuffer.append(TEXT_53);
-    if (hasKey) {
     stringBuffer.append(TEXT_54);
-    stringBuffer.append(key);
+    if (hasKey) {
     stringBuffer.append(TEXT_55);
-    }
+    stringBuffer.append(key);
     stringBuffer.append(TEXT_56);
-    stringBuffer.append(genPackage.getNSURI());
+    }
     stringBuffer.append(TEXT_57);
-    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+    stringBuffer.append(genPackage.getNSURI());
     stringBuffer.append(TEXT_58);
-    for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext(); ) {
+    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
     stringBuffer.append(TEXT_59);
+    for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext(); ) {
+    stringBuffer.append(TEXT_60);
     stringBuffer.append(j.hasPrevious() ? " " : "\"");
     stringBuffer.append(j.next());
     if (!j.hasNext()) {
-    stringBuffer.append(TEXT_60);
-    }
-    }
     stringBuffer.append(TEXT_61);
+    }
+    }
+    stringBuffer.append(TEXT_62);
     if (genPackage.isChildCreationExtenders()) { Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> extendedChildCreationData = genPackage.getExtendedChildCreationData();
     if (!extendedChildCreationData.isEmpty()) {
-    stringBuffer.append(TEXT_62);
-    if (hasKey) {
     stringBuffer.append(TEXT_63);
-    stringBuffer.append(key);
+    if (hasKey) {
     stringBuffer.append(TEXT_64);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_65);
     }
     for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> entry : extendedChildCreationData.entrySet()) {
-    stringBuffer.append(TEXT_65);
-    stringBuffer.append(entry.getKey().getNSURI());
     stringBuffer.append(TEXT_66);
-    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+    stringBuffer.append(entry.getKey().getNSURI());
     stringBuffer.append(TEXT_67);
-    stringBuffer.append(genPackage.getChildCreationExtenderName(entry.getKey()));
+    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
     stringBuffer.append(TEXT_68);
-    }
+    stringBuffer.append(genPackage.getChildCreationExtenderName(entry.getKey()));
     stringBuffer.append(TEXT_69);
     }
-    }
-    }
-    }
     stringBuffer.append(TEXT_70);
+    }
+    }
+    }
+    }
     stringBuffer.append(TEXT_71);
+    stringBuffer.append(TEXT_72);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginProperties.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginProperties.java
index 2bd3af4..441b13a 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginProperties.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginProperties.java
@@ -123,7 +123,7 @@
     stringBuffer.append(TEXT_22);
     stringBuffer.append(genPackage.getEditorClassName());
     stringBuffer.append(TEXT_23);
-    stringBuffer.append(genPackage.isMultipleFileExtensions() ? genPackage.getFileExtensions() : genPackage.getFileExtension());
+    stringBuffer.append(genPackage.getFileExtensions());
     stringBuffer.append(TEXT_24);
     }
     stringBuffer.append(TEXT_25);
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginXML.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginXML.java
index 330f702..fdaa9ba 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginXML.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/editor/PluginXML.java
@@ -66,99 +66,100 @@
   protected final String TEXT_49 = " -->";
   protected final String TEXT_50 = NL + "      <parser" + NL + "            type=\"";
   protected final String TEXT_51 = "\"" + NL + "            class=\"";
-  protected final String TEXT_52 = "\"/>" + NL + "   </extension>";
-  protected final String TEXT_53 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.itemProviderAdapterFactories\">";
-  protected final String TEXT_54 = NL + "      <!-- @generated ";
-  protected final String TEXT_55 = " -->";
-  protected final String TEXT_56 = NL + "      <factory" + NL + "            uri=\"";
-  protected final String TEXT_57 = "\"" + NL + "            class=\"";
-  protected final String TEXT_58 = "\"" + NL + "            supportedTypes=";
-  protected final String TEXT_59 = NL + "              ";
-  protected final String TEXT_60 = "\"/>";
-  protected final String TEXT_61 = NL + "   </extension>";
-  protected final String TEXT_62 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.childCreationExtenders\">";
-  protected final String TEXT_63 = NL + "      <!-- @generated ";
-  protected final String TEXT_64 = " -->";
-  protected final String TEXT_65 = NL + "      <extender" + NL + "            uri=\"";
-  protected final String TEXT_66 = "\"" + NL + "            class=\"";
-  protected final String TEXT_67 = "$";
-  protected final String TEXT_68 = "\"/>";
-  protected final String TEXT_69 = NL + "   </extension>";
-  protected final String TEXT_70 = NL + NL + "   <extension" + NL + "         point=\"org.eclipse.core.runtime.applications\"" + NL + "         id=\"";
-  protected final String TEXT_71 = "Application\">";
-  protected final String TEXT_72 = NL + "      <!-- @generated ";
-  protected final String TEXT_73 = " -->";
-  protected final String TEXT_74 = NL + "      <application>" + NL + "         <run class=\"";
-  protected final String TEXT_75 = "$Application\"/>" + NL + "      </application>" + NL + "   </extension>" + NL + "" + NL + "   <extension point=\"org.eclipse.ui.perspectives\">";
-  protected final String TEXT_76 = NL + "      <!-- @generated ";
-  protected final String TEXT_77 = " -->";
-  protected final String TEXT_78 = NL + "      <perspective" + NL + "            name=\"%_UI_Perspective_label\"" + NL + "            class=\"";
-  protected final String TEXT_79 = "$Perspective\"" + NL + "            id=\"";
-  protected final String TEXT_80 = "Perspective\">" + NL + "      </perspective>" + NL + "   </extension>" + NL + "" + NL + "   <extension point=\"org.eclipse.ui.commands\">";
-  protected final String TEXT_81 = NL + "      <!-- @generated ";
-  protected final String TEXT_82 = " -->";
-  protected final String TEXT_83 = 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_84 = "OpenURICommand\"/>";
-  protected final String TEXT_85 = 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_86 = "OpenCommand\"/>";
-  protected final String TEXT_87 = NL + "   </extension>" + NL;
-  protected final String TEXT_88 = NL + "   <extension point=\"org.eclipse.ui.bindings\">";
-  protected final String TEXT_89 = NL + "      <!-- @generated ";
-  protected final String TEXT_90 = " -->";
-  protected final String TEXT_91 = NL + "      <key" + NL + "            commandId=\"";
-  protected final String TEXT_92 = "OpenURICommand\"" + NL + "            sequence=\"M1+U\"" + NL + "            schemeId=\"org.eclipse.ui.defaultAcceleratorConfiguration\"/>" + NL + "      <key" + NL + "            commandId=\"";
-  protected final String TEXT_93 = "OpenCommand\"" + NL + "            sequence=\"M1+O\"" + NL + "            schemeId=\"org.eclipse.ui.defaultAcceleratorConfiguration\"/>" + NL + "   </extension>";
-  protected final String TEXT_94 = NL + NL + "   <extension point=\"org.eclipse.ui.actionSets\">";
-  protected final String TEXT_95 = NL + "      <!-- @generated ";
-  protected final String TEXT_96 = " -->";
-  protected final String TEXT_97 = NL + "      <actionSet" + NL + "            label=\"%_UI_";
-  protected final String TEXT_98 = "_ActionSet_label\"" + NL + "            visible=\"true\"" + NL + "            id=\"";
-  protected final String TEXT_99 = "ActionSet\">" + NL + "         <action" + NL + "               label=\"%_UI_Menu_About_label\"" + NL + "               class=\"";
-  protected final String TEXT_100 = "$AboutAction\"" + NL + "               menubarPath=\"help/additions\"" + NL + "               id=\"";
-  protected final String TEXT_101 = "AboutAction\"/>" + NL + "         <action" + NL + "               label=\"%_UI_Menu_OpenURI_label\"" + NL + "               definitionId=\"";
-  protected final String TEXT_102 = "OpenURICommand\"" + NL + "               class=\"";
-  protected final String TEXT_103 = "$OpenURIAction\"" + NL + "               menubarPath=\"file/additions\"" + NL + "               id=\"";
-  protected final String TEXT_104 = "OpenURIAction\"/>";
-  protected final String TEXT_105 = NL + "         <action" + NL + "               label=\"%_UI_Menu_Open_label\"" + NL + "               definitionId=\"";
-  protected final String TEXT_106 = "OpenCommand\"" + NL + "               class=\"";
-  protected final String TEXT_107 = "$OpenAction\"" + NL + "               menubarPath=\"file/additions\"" + NL + "               id=\"";
-  protected final String TEXT_108 = "OpenAction\"/>";
-  protected final String TEXT_109 = NL + "      </actionSet>" + NL + "   </extension>";
-  protected final String TEXT_110 = NL + NL + "   <extension point=\"org.eclipse.ui.actionSets\">";
-  protected final String TEXT_111 = NL + "      <!-- @generated ";
-  protected final String TEXT_112 = " -->";
-  protected final String TEXT_113 = NL + "      <actionSet" + NL + "            label=\"%_UI_";
-  protected final String TEXT_114 = "_ActionSet_label\"" + NL + "            visible=\"true\"" + NL + "            id=\"";
-  protected final String TEXT_115 = "ActionSet\">" + NL + "         <action" + NL + "               label=\"%_UI_";
-  protected final String TEXT_116 = "_label\"" + NL + "               class=\"";
-  protected final String TEXT_117 = "$NewAction\"" + NL + "               menubarPath=\"file/new/additions\"" + NL + "               id=\"";
-  protected final String TEXT_118 = "NewAction\"/>" + NL + "      </actionSet>" + NL + "   </extension>";
-  protected final String TEXT_119 = NL + NL + "   <extension point=\"org.eclipse.ui.newWizards\">";
-  protected final String TEXT_120 = NL + "      <!-- @generated ";
-  protected final String TEXT_121 = " -->";
-  protected final String TEXT_122 = NL + "      <category" + NL + "            id=\"org.eclipse.emf.ecore.Wizard.category.ID\"" + NL + "            name=\"%_UI_Wizard_category\"/>" + NL + "      <wizard" + NL + "            id=\"";
-  protected final String TEXT_123 = "ID\"" + NL + "            name=\"%_UI_";
-  protected final String TEXT_124 = "_label\"" + NL + "            class=\"";
-  protected final String TEXT_125 = "\"" + NL + "            category=\"org.eclipse.emf.ecore.Wizard.category.ID\"" + NL + "            icon=\"icons/full/obj16/";
-  protected final String TEXT_126 = "ModelFile.gif\">" + NL + "         <description>%_UI_";
-  protected final String TEXT_127 = "_description</description>" + NL + "         <selection class=\"org.eclipse.core.resources.IResource\"/>" + NL + "      </wizard>" + NL + "   </extension>";
-  protected final String TEXT_128 = NL + NL + "   <extension point=\"org.eclipse.ui.editors\">";
-  protected final String TEXT_129 = NL + "      <!-- @generated ";
-  protected final String TEXT_130 = " -->";
-  protected final String TEXT_131 = NL + "      <editor" + NL + "            id=\"";
-  protected final String TEXT_132 = "ID\"" + NL + "            name=\"%_UI_";
-  protected final String TEXT_133 = "_label\"" + NL + "            icon=\"icons/full/obj16/";
-  protected final String TEXT_134 = "ModelFile.gif\"";
-  protected final String TEXT_135 = NL + "            extensions=\"";
-  protected final String TEXT_136 = "\"";
-  protected final String TEXT_137 = NL + "            class=\"";
-  protected final String TEXT_138 = "\"" + NL + "            contributorClass=\"";
-  protected final String TEXT_139 = "\">";
-  protected final String TEXT_140 = NL + "         <contentTypeBinding contentTypeId=\"";
-  protected final String TEXT_141 = "\"/>";
-  protected final String TEXT_142 = NL + "      </editor>" + NL + "   </extension>";
-  protected final String TEXT_143 = NL + NL + "</plugin>";
-  protected final String TEXT_144 = NL;
+  protected final String TEXT_52 = "\"/>";
+  protected final String TEXT_53 = NL + "   </extension>";
+  protected final String TEXT_54 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.itemProviderAdapterFactories\">";
+  protected final String TEXT_55 = NL + "      <!-- @generated ";
+  protected final String TEXT_56 = " -->";
+  protected final String TEXT_57 = NL + "      <factory" + NL + "            uri=\"";
+  protected final String TEXT_58 = "\"" + NL + "            class=\"";
+  protected final String TEXT_59 = "\"" + NL + "            supportedTypes=";
+  protected final String TEXT_60 = NL + "              ";
+  protected final String TEXT_61 = "\"/>";
+  protected final String TEXT_62 = NL + "   </extension>";
+  protected final String TEXT_63 = NL + NL + "   <extension point=\"org.eclipse.emf.edit.childCreationExtenders\">";
+  protected final String TEXT_64 = NL + "      <!-- @generated ";
+  protected final String TEXT_65 = " -->";
+  protected final String TEXT_66 = NL + "      <extender" + NL + "            uri=\"";
+  protected final String TEXT_67 = "\"" + NL + "            class=\"";
+  protected final String TEXT_68 = "$";
+  protected final String TEXT_69 = "\"/>";
+  protected final String TEXT_70 = NL + "   </extension>";
+  protected final String TEXT_71 = NL + NL + "   <extension" + NL + "         point=\"org.eclipse.core.runtime.applications\"" + NL + "         id=\"";
+  protected final String TEXT_72 = "Application\">";
+  protected final String TEXT_73 = NL + "      <!-- @generated ";
+  protected final String TEXT_74 = " -->";
+  protected final String TEXT_75 = NL + "      <application>" + NL + "         <run class=\"";
+  protected final String TEXT_76 = "$Application\"/>" + NL + "      </application>" + NL + "   </extension>" + NL + "" + NL + "   <extension point=\"org.eclipse.ui.perspectives\">";
+  protected final String TEXT_77 = NL + "      <!-- @generated ";
+  protected final String TEXT_78 = " -->";
+  protected final String TEXT_79 = NL + "      <perspective" + NL + "            name=\"%_UI_Perspective_label\"" + NL + "            class=\"";
+  protected final String TEXT_80 = "$Perspective\"" + NL + "            id=\"";
+  protected final String TEXT_81 = "Perspective\">" + NL + "      </perspective>" + NL + "   </extension>" + NL + "" + NL + "   <extension point=\"org.eclipse.ui.commands\">";
+  protected final String TEXT_82 = NL + "      <!-- @generated ";
+  protected final String TEXT_83 = " -->";
+  protected final String TEXT_84 = 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_85 = "OpenURICommand\"/>";
+  protected final String TEXT_86 = 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_87 = "OpenCommand\"/>";
+  protected final String TEXT_88 = NL + "   </extension>" + NL;
+  protected final String TEXT_89 = NL + "   <extension point=\"org.eclipse.ui.bindings\">";
+  protected final String TEXT_90 = NL + "      <!-- @generated ";
+  protected final String TEXT_91 = " -->";
+  protected final String TEXT_92 = NL + "      <key" + NL + "            commandId=\"";
+  protected final String TEXT_93 = "OpenURICommand\"" + NL + "            sequence=\"M1+U\"" + NL + "            schemeId=\"org.eclipse.ui.defaultAcceleratorConfiguration\"/>" + NL + "      <key" + NL + "            commandId=\"";
+  protected final String TEXT_94 = "OpenCommand\"" + NL + "            sequence=\"M1+O\"" + NL + "            schemeId=\"org.eclipse.ui.defaultAcceleratorConfiguration\"/>" + NL + "   </extension>";
+  protected final String TEXT_95 = NL + NL + "   <extension point=\"org.eclipse.ui.actionSets\">";
+  protected final String TEXT_96 = NL + "      <!-- @generated ";
+  protected final String TEXT_97 = " -->";
+  protected final String TEXT_98 = NL + "      <actionSet" + NL + "            label=\"%_UI_";
+  protected final String TEXT_99 = "_ActionSet_label\"" + NL + "            visible=\"true\"" + NL + "            id=\"";
+  protected final String TEXT_100 = "ActionSet\">" + NL + "         <action" + NL + "               label=\"%_UI_Menu_About_label\"" + NL + "               class=\"";
+  protected final String TEXT_101 = "$AboutAction\"" + NL + "               menubarPath=\"help/additions\"" + NL + "               id=\"";
+  protected final String TEXT_102 = "AboutAction\"/>" + NL + "         <action" + NL + "               label=\"%_UI_Menu_OpenURI_label\"" + NL + "               definitionId=\"";
+  protected final String TEXT_103 = "OpenURICommand\"" + NL + "               class=\"";
+  protected final String TEXT_104 = "$OpenURIAction\"" + NL + "               menubarPath=\"file/additions\"" + NL + "               id=\"";
+  protected final String TEXT_105 = "OpenURIAction\"/>";
+  protected final String TEXT_106 = NL + "         <action" + NL + "               label=\"%_UI_Menu_Open_label\"" + NL + "               definitionId=\"";
+  protected final String TEXT_107 = "OpenCommand\"" + NL + "               class=\"";
+  protected final String TEXT_108 = "$OpenAction\"" + NL + "               menubarPath=\"file/additions\"" + NL + "               id=\"";
+  protected final String TEXT_109 = "OpenAction\"/>";
+  protected final String TEXT_110 = NL + "      </actionSet>" + NL + "   </extension>";
+  protected final String TEXT_111 = NL + NL + "   <extension point=\"org.eclipse.ui.actionSets\">";
+  protected final String TEXT_112 = NL + "      <!-- @generated ";
+  protected final String TEXT_113 = " -->";
+  protected final String TEXT_114 = NL + "      <actionSet" + NL + "            label=\"%_UI_";
+  protected final String TEXT_115 = "_ActionSet_label\"" + NL + "            visible=\"true\"" + NL + "            id=\"";
+  protected final String TEXT_116 = "ActionSet\">" + NL + "         <action" + NL + "               label=\"%_UI_";
+  protected final String TEXT_117 = "_label\"" + NL + "               class=\"";
+  protected final String TEXT_118 = "$NewAction\"" + NL + "               menubarPath=\"file/new/additions\"" + NL + "               id=\"";
+  protected final String TEXT_119 = "NewAction\"/>" + NL + "      </actionSet>" + NL + "   </extension>";
+  protected final String TEXT_120 = NL + NL + "   <extension point=\"org.eclipse.ui.newWizards\">";
+  protected final String TEXT_121 = NL + "      <!-- @generated ";
+  protected final String TEXT_122 = " -->";
+  protected final String TEXT_123 = NL + "      <category" + NL + "            id=\"org.eclipse.emf.ecore.Wizard.category.ID\"" + NL + "            name=\"%_UI_Wizard_category\"/>" + NL + "      <wizard" + NL + "            id=\"";
+  protected final String TEXT_124 = "ID\"" + NL + "            name=\"%_UI_";
+  protected final String TEXT_125 = "_label\"" + NL + "            class=\"";
+  protected final String TEXT_126 = "\"" + NL + "            category=\"org.eclipse.emf.ecore.Wizard.category.ID\"" + NL + "            icon=\"icons/full/obj16/";
+  protected final String TEXT_127 = "ModelFile.gif\">" + NL + "         <description>%_UI_";
+  protected final String TEXT_128 = "_description</description>" + NL + "         <selection class=\"org.eclipse.core.resources.IResource\"/>" + NL + "      </wizard>" + NL + "   </extension>";
+  protected final String TEXT_129 = NL + NL + "   <extension point=\"org.eclipse.ui.editors\">";
+  protected final String TEXT_130 = NL + "      <!-- @generated ";
+  protected final String TEXT_131 = " -->";
+  protected final String TEXT_132 = NL + "      <editor" + NL + "            id=\"";
+  protected final String TEXT_133 = "ID\"" + NL + "            name=\"%_UI_";
+  protected final String TEXT_134 = "_label\"" + NL + "            icon=\"icons/full/obj16/";
+  protected final String TEXT_135 = "ModelFile.gif\"";
+  protected final String TEXT_136 = NL + "            extensions=\"";
+  protected final String TEXT_137 = "\"";
+  protected final String TEXT_138 = NL + "            class=\"";
+  protected final String TEXT_139 = "\"" + NL + "            contributorClass=\"";
+  protected final String TEXT_140 = "\">";
+  protected final String TEXT_141 = NL + "         <contentTypeBinding contentTypeId=\"";
+  protected final String TEXT_142 = "\"/>";
+  protected final String TEXT_143 = NL + "      </editor>" + NL + "   </extension>";
+  protected final String TEXT_144 = NL + NL + "</plugin>";
+  protected final String TEXT_145 = NL;
 
   public String generate(Object argument)
   {
@@ -277,121 +278,122 @@
     stringBuffer.append(key);
     stringBuffer.append(TEXT_49);
     }
+    for (String fileExtension : genPackage.getFileExtensionList()) {
     stringBuffer.append(TEXT_50);
-    stringBuffer.append(genPackage.getFileExtension());
+    stringBuffer.append(fileExtension);
     stringBuffer.append(TEXT_51);
     stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
     stringBuffer.append(TEXT_52);
     }
+    stringBuffer.append(TEXT_53);
+    }
     }
     }
     if (genModel.sameEditEditorProject()) {
     for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
     if (!genPackage.getGenClasses().isEmpty()) {
-    stringBuffer.append(TEXT_53);
-    if (hasKey) {
     stringBuffer.append(TEXT_54);
-    stringBuffer.append(key);
+    if (hasKey) {
     stringBuffer.append(TEXT_55);
-    }
+    stringBuffer.append(key);
     stringBuffer.append(TEXT_56);
-    stringBuffer.append(genPackage.getNSURI());
+    }
     stringBuffer.append(TEXT_57);
-    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+    stringBuffer.append(genPackage.getNSURI());
     stringBuffer.append(TEXT_58);
-    for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext(); ) {
+    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
     stringBuffer.append(TEXT_59);
+    for (ListIterator<?> j = genPackage.getProviderSupportedTypes().listIterator(); j.hasNext(); ) {
+    stringBuffer.append(TEXT_60);
     stringBuffer.append(j.hasPrevious() ? " " : "\"");
     stringBuffer.append(j.next());
     if (!j.hasNext()) {
-    stringBuffer.append(TEXT_60);
-    }
-    }
     stringBuffer.append(TEXT_61);
+    }
+    }
+    stringBuffer.append(TEXT_62);
     if (genPackage.isChildCreationExtenders()) { Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> extendedChildCreationData = genPackage.getExtendedChildCreationData();
     if (!extendedChildCreationData.isEmpty()) {
-    stringBuffer.append(TEXT_62);
+    stringBuffer.append(TEXT_63);
     for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> entry : extendedChildCreationData.entrySet()) {
     if (hasKey) {
-    stringBuffer.append(TEXT_63);
-    stringBuffer.append(key);
     stringBuffer.append(TEXT_64);
-    }
+    stringBuffer.append(key);
     stringBuffer.append(TEXT_65);
-    stringBuffer.append(entry.getKey().getNSURI());
-    stringBuffer.append(TEXT_66);
-    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
-    stringBuffer.append(TEXT_67);
-    stringBuffer.append(genPackage.getChildCreationExtenderName(entry.getKey()));
-    stringBuffer.append(TEXT_68);
     }
+    stringBuffer.append(TEXT_66);
+    stringBuffer.append(entry.getKey().getNSURI());
+    stringBuffer.append(TEXT_67);
+    stringBuffer.append(genPackage.getQualifiedItemProviderAdapterFactoryClassName());
+    stringBuffer.append(TEXT_68);
+    stringBuffer.append(genPackage.getChildCreationExtenderName(entry.getKey()));
     stringBuffer.append(TEXT_69);
     }
+    stringBuffer.append(TEXT_70);
+    }
     }
     }
     }
     }
     if (genModel.isRichClientPlatform()) {
-    stringBuffer.append(TEXT_70);
-    stringBuffer.append(genModel.getEditorAdvisorClassName());
     stringBuffer.append(TEXT_71);
-    if (hasKey) {
+    stringBuffer.append(genModel.getEditorAdvisorClassName());
     stringBuffer.append(TEXT_72);
-    stringBuffer.append(key);
-    stringBuffer.append(TEXT_73);
-    }
-    stringBuffer.append(TEXT_74);
-    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
-    stringBuffer.append(TEXT_75);
     if (hasKey) {
-    stringBuffer.append(TEXT_76);
+    stringBuffer.append(TEXT_73);
     stringBuffer.append(key);
-    stringBuffer.append(TEXT_77);
+    stringBuffer.append(TEXT_74);
     }
-    stringBuffer.append(TEXT_78);
+    stringBuffer.append(TEXT_75);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+    stringBuffer.append(TEXT_76);
+    if (hasKey) {
+    stringBuffer.append(TEXT_77);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_78);
+    }
     stringBuffer.append(TEXT_79);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_80);
-    if (hasKey) {
+    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_81);
-    stringBuffer.append(key);
-    stringBuffer.append(TEXT_82);
-    }
-    stringBuffer.append(TEXT_83);
-    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
-    stringBuffer.append(TEXT_84);
-    if (!genModel.isRichAjaxPlatform()) {
-    stringBuffer.append(TEXT_85);
-    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
-    stringBuffer.append(TEXT_86);
-    }
-    stringBuffer.append(TEXT_87);
-    if (!genModel.isRichAjaxPlatform()) {
-    stringBuffer.append(TEXT_88);
     if (hasKey) {
-    stringBuffer.append(TEXT_89);
+    stringBuffer.append(TEXT_82);
     stringBuffer.append(key);
-    stringBuffer.append(TEXT_90);
+    stringBuffer.append(TEXT_83);
     }
-    stringBuffer.append(TEXT_91);
+    stringBuffer.append(TEXT_84);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+    stringBuffer.append(TEXT_85);
+    if (!genModel.isRichAjaxPlatform()) {
+    stringBuffer.append(TEXT_86);
+    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+    stringBuffer.append(TEXT_87);
+    }
+    stringBuffer.append(TEXT_88);
+    if (!genModel.isRichAjaxPlatform()) {
+    stringBuffer.append(TEXT_89);
+    if (hasKey) {
+    stringBuffer.append(TEXT_90);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_91);
+    }
     stringBuffer.append(TEXT_92);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_93);
-    }
+    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_94);
-    if (hasKey) {
-    stringBuffer.append(TEXT_95);
-    stringBuffer.append(key);
-    stringBuffer.append(TEXT_96);
     }
+    stringBuffer.append(TEXT_95);
+    if (hasKey) {
+    stringBuffer.append(TEXT_96);
+    stringBuffer.append(key);
     stringBuffer.append(TEXT_97);
-    stringBuffer.append(genModel.getEditorAdvisorClassName());
+    }
     stringBuffer.append(TEXT_98);
     stringBuffer.append(genModel.getEditorAdvisorClassName());
     stringBuffer.append(TEXT_99);
-    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+    stringBuffer.append(genModel.getEditorAdvisorClassName());
     stringBuffer.append(TEXT_100);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_101);
@@ -401,91 +403,93 @@
     stringBuffer.append(TEXT_103);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_104);
-    if (!genModel.isRichAjaxPlatform()) {
-    stringBuffer.append(TEXT_105);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
+    stringBuffer.append(TEXT_105);
+    if (!genModel.isRichAjaxPlatform()) {
     stringBuffer.append(TEXT_106);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_107);
     stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_108);
-    }
+    stringBuffer.append(genModel.getQualifiedEditorAdvisorClassName());
     stringBuffer.append(TEXT_109);
     }
+    stringBuffer.append(TEXT_110);
+    }
     for (GenPackage genPackage : genModel.getAllGenPackagesWithClassifiers()) {
     if (genPackage.hasConcreteClasses()){
     if (genPackage.isGenerateModelWizard()) {
     if (genModel.isRichClientPlatform()) {
-    stringBuffer.append(TEXT_110);
-    if (hasKey) {
     stringBuffer.append(TEXT_111);
-    stringBuffer.append(key);
+    if (hasKey) {
     stringBuffer.append(TEXT_112);
-    }
+    stringBuffer.append(key);
     stringBuffer.append(TEXT_113);
-    stringBuffer.append(genPackage.getModelWizardClassName());
+    }
     stringBuffer.append(TEXT_114);
-    stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
-    stringBuffer.append(TEXT_115);
     stringBuffer.append(genPackage.getModelWizardClassName());
-    stringBuffer.append(TEXT_116);
+    stringBuffer.append(TEXT_115);
     stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
+    stringBuffer.append(TEXT_116);
+    stringBuffer.append(genPackage.getModelWizardClassName());
     stringBuffer.append(TEXT_117);
     stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
     stringBuffer.append(TEXT_118);
-    } else {
-    stringBuffer.append(TEXT_119);
-    if (hasKey) {
-    stringBuffer.append(TEXT_120);
-    stringBuffer.append(key);
-    stringBuffer.append(TEXT_121);
-    }
-    stringBuffer.append(TEXT_122);
-    stringBuffer.append(genPackage.getQualifiedModelWizardClassName());
-    stringBuffer.append(TEXT_123);
-    stringBuffer.append(genPackage.getModelWizardClassName());
-    stringBuffer.append(TEXT_124);
-    stringBuffer.append(genPackage.getQualifiedModelWizardClassName());
-    stringBuffer.append(TEXT_125);
-    stringBuffer.append(genPackage.getPrefix());
-    stringBuffer.append(TEXT_126);
-    stringBuffer.append(genPackage.getModelWizardClassName());
-    stringBuffer.append(TEXT_127);
-    }
-    }
-    stringBuffer.append(TEXT_128);
-    if (hasKey) {
-    stringBuffer.append(TEXT_129);
-    stringBuffer.append(key);
-    stringBuffer.append(TEXT_130);
-    }
-    stringBuffer.append(TEXT_131);
-    stringBuffer.append(genPackage.getQualifiedEditorClassName());
-    stringBuffer.append(TEXT_132);
-    stringBuffer.append(genPackage.getEditorClassName());
-    stringBuffer.append(TEXT_133);
-    stringBuffer.append(genPackage.getPrefix());
-    stringBuffer.append(TEXT_134);
-    if (!genPackage.isContentType()) {
-    stringBuffer.append(TEXT_135);
-    stringBuffer.append(genPackage.getFileExtension());
-    stringBuffer.append(TEXT_136);
-    }
-    stringBuffer.append(TEXT_137);
-    stringBuffer.append(genPackage.getQualifiedEditorClassName());
-    stringBuffer.append(TEXT_138);
     stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
-    stringBuffer.append(TEXT_139);
-    if (genPackage.isContentType()) {
-    stringBuffer.append(TEXT_140);
-    stringBuffer.append(genPackage.getQualifiedContentTypeIdentifier());
-    stringBuffer.append(TEXT_141);
+    stringBuffer.append(TEXT_119);
+    } else {
+    stringBuffer.append(TEXT_120);
+    if (hasKey) {
+    stringBuffer.append(TEXT_121);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_122);
     }
+    stringBuffer.append(TEXT_123);
+    stringBuffer.append(genPackage.getQualifiedModelWizardClassName());
+    stringBuffer.append(TEXT_124);
+    stringBuffer.append(genPackage.getModelWizardClassName());
+    stringBuffer.append(TEXT_125);
+    stringBuffer.append(genPackage.getQualifiedModelWizardClassName());
+    stringBuffer.append(TEXT_126);
+    stringBuffer.append(genPackage.getPrefix());
+    stringBuffer.append(TEXT_127);
+    stringBuffer.append(genPackage.getModelWizardClassName());
+    stringBuffer.append(TEXT_128);
+    }
+    }
+    stringBuffer.append(TEXT_129);
+    if (hasKey) {
+    stringBuffer.append(TEXT_130);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_131);
+    }
+    stringBuffer.append(TEXT_132);
+    stringBuffer.append(genPackage.getQualifiedEditorClassName());
+    stringBuffer.append(TEXT_133);
+    stringBuffer.append(genPackage.getEditorClassName());
+    stringBuffer.append(TEXT_134);
+    stringBuffer.append(genPackage.getPrefix());
+    stringBuffer.append(TEXT_135);
+    if (!genPackage.isContentType()) {
+    stringBuffer.append(TEXT_136);
+    stringBuffer.append(genPackage.getFileExtensions());
+    stringBuffer.append(TEXT_137);
+    }
+    stringBuffer.append(TEXT_138);
+    stringBuffer.append(genPackage.getQualifiedEditorClassName());
+    stringBuffer.append(TEXT_139);
+    stringBuffer.append(genPackage.getQualifiedActionBarContributorClassName());
+    stringBuffer.append(TEXT_140);
+    if (genPackage.isContentType()) {
+    stringBuffer.append(TEXT_141);
+    stringBuffer.append(genPackage.getQualifiedContentTypeIdentifier());
     stringBuffer.append(TEXT_142);
     }
-    }
     stringBuffer.append(TEXT_143);
+    }
+    }
     stringBuffer.append(TEXT_144);
+    stringBuffer.append(TEXT_145);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PackageClass.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PackageClass.java
index 339ef4b..c8e0c5e 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PackageClass.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PackageClass.java
@@ -583,130 +583,131 @@
   protected final String TEXT_563 = ", \"";
   protected final String TEXT_564 = "\"";
   protected final String TEXT_565 = ");";
-  protected final String TEXT_566 = NL + NL + "\t\t// Create resource" + NL + "\t\tcreateResource(eNS_URI);";
-  protected final String TEXT_567 = NL + NL + "\t\t// Create annotations";
-  protected final String TEXT_568 = NL + "\t\t// ";
-  protected final String TEXT_569 = NL + "\t\tcreate";
-  protected final String TEXT_570 = "Annotations();";
-  protected final String TEXT_571 = NL + "\t}" + NL;
-  protected final String TEXT_572 = NL + "\t/**" + NL + "\t * Initializes the annotations for <b>";
-  protected final String TEXT_573 = "</b>." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void create";
-  protected final String TEXT_574 = "Annotations()" + NL + "\t{" + NL + "\t\tString source = ";
-  protected final String TEXT_575 = "null;";
-  protected final String TEXT_576 = "\"";
-  protected final String TEXT_577 = "\";";
-  protected final String TEXT_578 = "\t" + NL + "\t\taddAnnotation" + NL + "\t\t  (";
-  protected final String TEXT_579 = ", " + NL + "\t\t   source, " + NL + "\t\t   new String[] " + NL + "\t\t   {";
-  protected final String TEXT_580 = NL + "\t\t\t ";
-  protected final String TEXT_581 = ", ";
-  protected final String TEXT_582 = NL + "\t\t   }";
-  protected final String TEXT_583 = ");";
-  protected final String TEXT_584 = ",";
-  protected final String TEXT_585 = NL + "\t\t   new ";
-  protected final String TEXT_586 = "[] " + NL + "\t\t   {";
-  protected final String TEXT_587 = NL + "\t\t\t ";
-  protected final String TEXT_588 = ".createURI(";
-  protected final String TEXT_589 = ".";
-  protected final String TEXT_590 = "eNS_URI).appendFragment(\"";
-  protected final String TEXT_591 = "\")";
-  protected final String TEXT_592 = ",";
-  protected final String TEXT_593 = NL + "\t\t   });";
-  protected final String TEXT_594 = NL + "\t\taddAnnotation" + NL + "\t\t  (";
-  protected final String TEXT_595 = ", " + NL + "\t\t   ";
-  protected final String TEXT_596 = "new boolean[] { ";
-  protected final String TEXT_597 = " }";
-  protected final String TEXT_598 = "," + NL + "\t\t   ";
-  protected final String TEXT_599 = "null,";
-  protected final String TEXT_600 = "\"";
-  protected final String TEXT_601 = "\",";
-  protected final String TEXT_602 = NL + "\t\t   new String[] " + NL + "\t\t   {";
-  protected final String TEXT_603 = NL + "\t\t\t ";
-  protected final String TEXT_604 = ", ";
-  protected final String TEXT_605 = NL + "\t\t   }";
-  protected final String TEXT_606 = ");";
-  protected final String TEXT_607 = ",";
-  protected final String TEXT_608 = NL + "\t\t   new ";
-  protected final String TEXT_609 = "[] " + NL + "\t\t   {";
-  protected final String TEXT_610 = NL + "\t\t\t ";
-  protected final String TEXT_611 = ".createURI(";
-  protected final String TEXT_612 = ".";
-  protected final String TEXT_613 = "eNS_URI).appendFragment(\"";
-  protected final String TEXT_614 = "\")";
-  protected final String TEXT_615 = ",";
-  protected final String TEXT_616 = NL + "\t\t   });";
-  protected final String TEXT_617 = NL + "\t}" + NL;
-  protected final String TEXT_618 = 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_619 = " 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_620 = NL + "\t\t}" + NL + "\t\t";
-  protected final String TEXT_621 = " uri = ";
-  protected final String TEXT_622 = ".createURI(url.toString());" + NL + "\t\t";
-  protected final String TEXT_623 = " resource = new ";
-  protected final String TEXT_624 = "().createResource(uri);" + NL + "\t\ttry" + NL + "\t\t{" + NL + "\t\t\tresource.load(null);" + NL + "\t\t}" + NL + "\t\tcatch (";
-  protected final String TEXT_625 = " exception)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
-  protected final String TEXT_626 = "(exception);" + NL + "\t\t}" + NL + "\t\tinitializeFromLoadedEPackage(this, (";
-  protected final String TEXT_627 = ")resource.getContents().get(0));" + NL + "\t\tcreateResource(eNS_URI);" + NL + "\t}" + NL;
-  protected final String TEXT_628 = 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_629 = NL + "\t@Override";
-  protected final String TEXT_630 = NL + "\tprotected void fixInstanceClass(";
-  protected final String TEXT_631 = " eClassifier)" + NL + "\t{" + NL + "\t\tif (eClassifier.getInstanceClassName() == null)" + NL + "\t\t{";
-  protected final String TEXT_632 = NL + "\t\t\teClassifier.setInstanceClassName(\"";
-  protected final String TEXT_633 = ".\" + eClassifier.getName());";
-  protected final String TEXT_634 = NL + "\t\t\tsetGeneratedClassName(eClassifier);";
-  protected final String TEXT_635 = NL + "\t\t\tswitch (eClassifier.getClassifierID())" + NL + "\t\t\t{";
-  protected final String TEXT_636 = NL + "\t\t\t\tcase ";
-  protected final String TEXT_637 = ":";
-  protected final String TEXT_638 = 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_639 = ".\" + eClassifier.getName());";
-  protected final String TEXT_640 = 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_641 = NL + "\t\t}" + NL + "\t}" + NL;
-  protected final String TEXT_642 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
-  protected final String TEXT_643 = " addEOperation(";
-  protected final String TEXT_644 = " owner, ";
-  protected final String TEXT_645 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)" + NL + "\t{" + NL + "\t\t";
-  protected final String TEXT_646 = " o = addEOperation(owner, type, name, lowerBound, upperBound);" + NL + "\t\to.setUnique(isUnique);" + NL + "\t\to.setOrdered(isOrdered);" + NL + "\t\treturn o;" + NL + "\t}" + NL + "\t";
-  protected final String TEXT_647 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
-  protected final String TEXT_648 = " addEParameter(";
-  protected final String TEXT_649 = " owner, ";
-  protected final String TEXT_650 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)" + NL + "\t{" + NL + "\t\t";
-  protected final String TEXT_651 = " 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 + "\t";
-  protected final String TEXT_652 = 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_653 = NL + "\t *   <li>each operation of each class,</li>";
-  protected final String TEXT_654 = 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_655 = "public ";
-  protected final String TEXT_656 = "interface Literals" + NL + "\t{";
-  protected final String TEXT_657 = NL + "\t\t/**";
-  protected final String TEXT_658 = NL + "\t\t * The meta object literal for the '{@link ";
-  protected final String TEXT_659 = " <em>";
-  protected final String TEXT_660 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
-  protected final String TEXT_661 = NL + "\t\t * The meta object literal for the '{@link ";
-  protected final String TEXT_662 = " <em>";
-  protected final String TEXT_663 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
-  protected final String TEXT_664 = NL + "\t\t * The meta object literal for the '{@link ";
-  protected final String TEXT_665 = " <em>";
-  protected final String TEXT_666 = "</em>}' enum." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
-  protected final String TEXT_667 = NL + "\t\t * The meta object literal for the '<em>";
-  protected final String TEXT_668 = "</em>' data type." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->";
-  protected final String TEXT_669 = NL + "\t\t * @see ";
+  protected final String TEXT_566 = NL + NL + "\t\t// Create resource" + NL + "\t\tcreateResource(";
+  protected final String TEXT_567 = ");";
+  protected final String TEXT_568 = NL + NL + "\t\t// Create annotations";
+  protected final String TEXT_569 = NL + "\t\t// ";
+  protected final String TEXT_570 = NL + "\t\tcreate";
+  protected final String TEXT_571 = "Annotations();";
+  protected final String TEXT_572 = NL + "\t}" + NL;
+  protected final String TEXT_573 = NL + "\t/**" + NL + "\t * Initializes the annotations for <b>";
+  protected final String TEXT_574 = "</b>." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void create";
+  protected final String TEXT_575 = "Annotations()" + NL + "\t{" + NL + "\t\tString source = ";
+  protected final String TEXT_576 = "null;";
+  protected final String TEXT_577 = "\"";
+  protected final String TEXT_578 = "\";";
+  protected final String TEXT_579 = "\t" + NL + "\t\taddAnnotation" + NL + "\t\t  (";
+  protected final String TEXT_580 = ", " + NL + "\t\t   source, " + NL + "\t\t   new String[] " + NL + "\t\t   {";
+  protected final String TEXT_581 = NL + "\t\t\t ";
+  protected final String TEXT_582 = ", ";
+  protected final String TEXT_583 = NL + "\t\t   }";
+  protected final String TEXT_584 = ");";
+  protected final String TEXT_585 = ",";
+  protected final String TEXT_586 = NL + "\t\t   new ";
+  protected final String TEXT_587 = "[] " + NL + "\t\t   {";
+  protected final String TEXT_588 = NL + "\t\t\t ";
+  protected final String TEXT_589 = ".createURI(";
+  protected final String TEXT_590 = ".";
+  protected final String TEXT_591 = "eNS_URI).appendFragment(\"";
+  protected final String TEXT_592 = "\")";
+  protected final String TEXT_593 = ",";
+  protected final String TEXT_594 = NL + "\t\t   });";
+  protected final String TEXT_595 = NL + "\t\taddAnnotation" + NL + "\t\t  (";
+  protected final String TEXT_596 = ", " + NL + "\t\t   ";
+  protected final String TEXT_597 = "new boolean[] { ";
+  protected final String TEXT_598 = " }";
+  protected final String TEXT_599 = "," + NL + "\t\t   ";
+  protected final String TEXT_600 = "null,";
+  protected final String TEXT_601 = "\"";
+  protected final String TEXT_602 = "\",";
+  protected final String TEXT_603 = NL + "\t\t   new String[] " + NL + "\t\t   {";
+  protected final String TEXT_604 = NL + "\t\t\t ";
+  protected final String TEXT_605 = ", ";
+  protected final String TEXT_606 = NL + "\t\t   }";
+  protected final String TEXT_607 = ");";
+  protected final String TEXT_608 = ",";
+  protected final String TEXT_609 = NL + "\t\t   new ";
+  protected final String TEXT_610 = "[] " + NL + "\t\t   {";
+  protected final String TEXT_611 = NL + "\t\t\t ";
+  protected final String TEXT_612 = ".createURI(";
+  protected final String TEXT_613 = ".";
+  protected final String TEXT_614 = "eNS_URI).appendFragment(\"";
+  protected final String TEXT_615 = "\")";
+  protected final String TEXT_616 = ",";
+  protected final String TEXT_617 = NL + "\t\t   });";
+  protected final String TEXT_618 = NL + "\t}" + NL;
+  protected final String TEXT_619 = 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_620 = " 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_621 = NL + "\t\t}" + NL + "\t\t";
+  protected final String TEXT_622 = " uri = ";
+  protected final String TEXT_623 = ".createURI(url.toString());" + NL + "\t\t";
+  protected final String TEXT_624 = " resource = new ";
+  protected final String TEXT_625 = "().createResource(uri);" + NL + "\t\ttry" + NL + "\t\t{" + NL + "\t\t\tresource.load(null);" + NL + "\t\t}" + NL + "\t\tcatch (";
+  protected final String TEXT_626 = " exception)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
+  protected final String TEXT_627 = "(exception);" + NL + "\t\t}" + NL + "\t\tinitializeFromLoadedEPackage(this, (";
+  protected final String TEXT_628 = ")resource.getContents().get(0));" + NL + "\t\tcreateResource(eNS_URI);" + NL + "\t}" + NL;
+  protected final String TEXT_629 = 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_630 = NL + "\t@Override";
+  protected final String TEXT_631 = NL + "\tprotected void fixInstanceClass(";
+  protected final String TEXT_632 = " eClassifier)" + NL + "\t{" + NL + "\t\tif (eClassifier.getInstanceClassName() == null)" + NL + "\t\t{";
+  protected final String TEXT_633 = NL + "\t\t\teClassifier.setInstanceClassName(\"";
+  protected final String TEXT_634 = ".\" + eClassifier.getName());";
+  protected final String TEXT_635 = NL + "\t\t\tsetGeneratedClassName(eClassifier);";
+  protected final String TEXT_636 = NL + "\t\t\tswitch (eClassifier.getClassifierID())" + NL + "\t\t\t{";
+  protected final String TEXT_637 = NL + "\t\t\t\tcase ";
+  protected final String TEXT_638 = ":";
+  protected final String TEXT_639 = 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_640 = ".\" + eClassifier.getName());";
+  protected final String TEXT_641 = 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_642 = NL + "\t\t}" + NL + "\t}" + NL;
+  protected final String TEXT_643 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+  protected final String TEXT_644 = " addEOperation(";
+  protected final String TEXT_645 = " owner, ";
+  protected final String TEXT_646 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)" + NL + "\t{" + NL + "\t\t";
+  protected final String TEXT_647 = " o = addEOperation(owner, type, name, lowerBound, upperBound);" + NL + "\t\to.setUnique(isUnique);" + NL + "\t\to.setOrdered(isOrdered);" + NL + "\t\treturn o;" + NL + "\t}" + NL + "\t";
+  protected final String TEXT_648 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
+  protected final String TEXT_649 = " addEParameter(";
+  protected final String TEXT_650 = " owner, ";
+  protected final String TEXT_651 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)" + NL + "\t{" + NL + "\t\t";
+  protected final String TEXT_652 = " 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 + "\t";
+  protected final String TEXT_653 = 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_654 = NL + "\t *   <li>each operation of each class,</li>";
+  protected final String TEXT_655 = 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_656 = "public ";
+  protected final String TEXT_657 = "interface Literals" + NL + "\t{";
+  protected final String TEXT_658 = NL + "\t\t/**";
+  protected final String TEXT_659 = NL + "\t\t * The meta object literal for the '{@link ";
+  protected final String TEXT_660 = " <em>";
+  protected final String TEXT_661 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+  protected final String TEXT_662 = NL + "\t\t * The meta object literal for the '{@link ";
+  protected final String TEXT_663 = " <em>";
+  protected final String TEXT_664 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+  protected final String TEXT_665 = NL + "\t\t * The meta object literal for the '{@link ";
+  protected final String TEXT_666 = " <em>";
+  protected final String TEXT_667 = "</em>}' enum." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
+  protected final String TEXT_668 = NL + "\t\t * The meta object literal for the '<em>";
+  protected final String TEXT_669 = "</em>' data type." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->";
   protected final String TEXT_670 = NL + "\t\t * @see ";
-  protected final String TEXT_671 = "#get";
-  protected final String TEXT_672 = "()" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
-  protected final String TEXT_673 = " ";
-  protected final String TEXT_674 = " = eINSTANCE.get";
-  protected final String TEXT_675 = "();" + NL;
-  protected final String TEXT_676 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
-  protected final String TEXT_677 = "</b></em>' ";
-  protected final String TEXT_678 = " feature." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
-  protected final String TEXT_679 = " ";
-  protected final String TEXT_680 = " = eINSTANCE.get";
-  protected final String TEXT_681 = "();" + NL;
-  protected final String TEXT_682 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
-  protected final String TEXT_683 = "</b></em>' operation." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
-  protected final String TEXT_684 = " ";
-  protected final String TEXT_685 = " = eINSTANCE.get";
-  protected final String TEXT_686 = "();" + NL;
-  protected final String TEXT_687 = NL + "\t}" + NL;
-  protected final String TEXT_688 = NL + "} //";
-  protected final String TEXT_689 = NL;
+  protected final String TEXT_671 = NL + "\t\t * @see ";
+  protected final String TEXT_672 = "#get";
+  protected final String TEXT_673 = "()" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
+  protected final String TEXT_674 = " ";
+  protected final String TEXT_675 = " = eINSTANCE.get";
+  protected final String TEXT_676 = "();" + NL;
+  protected final String TEXT_677 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
+  protected final String TEXT_678 = "</b></em>' ";
+  protected final String TEXT_679 = " feature." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
+  protected final String TEXT_680 = " ";
+  protected final String TEXT_681 = " = eINSTANCE.get";
+  protected final String TEXT_682 = "();" + NL;
+  protected final String TEXT_683 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
+  protected final String TEXT_684 = "</b></em>' operation." + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
+  protected final String TEXT_685 = " ";
+  protected final String TEXT_686 = " = eINSTANCE.get";
+  protected final String TEXT_687 = "();" + NL;
+  protected final String TEXT_688 = NL + "\t}" + NL;
+  protected final String TEXT_689 = NL + "} //";
+  protected final String TEXT_690 = NL;
 
   public String generate(Object argument)
   {
@@ -2153,304 +2154,306 @@
     }
     if (genPackage.getSuperGenPackage() == null) {
     stringBuffer.append(TEXT_566);
+    stringBuffer.append(genPackage.getSchemaLocation());
+    stringBuffer.append(TEXT_567);
     }
     if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {
-    stringBuffer.append(TEXT_567);
-    for (String annotationSource : genPackage.getAnnotationSources()) {
     stringBuffer.append(TEXT_568);
-    stringBuffer.append(annotationSource);
-    stringBuffer.append(TEXT_569);
-    stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
-    stringBuffer.append(TEXT_570);
-    }
-    }
-    stringBuffer.append(TEXT_571);
     for (String annotationSource : genPackage.getAnnotationSources()) {
-    stringBuffer.append(TEXT_572);
+    stringBuffer.append(TEXT_569);
     stringBuffer.append(annotationSource);
-    stringBuffer.append(TEXT_573);
+    stringBuffer.append(TEXT_570);
     stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
-    stringBuffer.append(TEXT_574);
-    if (annotationSource == null) {
-    stringBuffer.append(TEXT_575);
-    } else {
-    stringBuffer.append(TEXT_576);
+    stringBuffer.append(TEXT_571);
+    }
+    }
+    stringBuffer.append(TEXT_572);
+    for (String annotationSource : genPackage.getAnnotationSources()) {
+    stringBuffer.append(TEXT_573);
     stringBuffer.append(annotationSource);
+    stringBuffer.append(TEXT_574);
+    stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
+    stringBuffer.append(TEXT_575);
+    if (annotationSource == null) {
+    stringBuffer.append(TEXT_576);
+    } else {
     stringBuffer.append(TEXT_577);
+    stringBuffer.append(annotationSource);
+    stringBuffer.append(TEXT_578);
     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_578);
-    stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
     stringBuffer.append(TEXT_579);
-    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(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
     stringBuffer.append(TEXT_580);
-    stringBuffer.append(key);
+    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_581);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_582);
     stringBuffer.append(value);
     stringBuffer.append(k.hasNext() ? "," : "");
     stringBuffer.append(genModel.getNonNLS(key + value));
     }
-    stringBuffer.append(TEXT_582);
-    if (annotationReferenceDataList.isEmpty()) {
     stringBuffer.append(TEXT_583);
-    } else {
+    if (annotationReferenceDataList.isEmpty()) {
     stringBuffer.append(TEXT_584);
+    } else {
+    stringBuffer.append(TEXT_585);
     }
     if (!annotationReferenceDataList.isEmpty()) {
-    stringBuffer.append(TEXT_585);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
     stringBuffer.append(TEXT_586);
-    for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList.iterator(); k.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = k.next();
-    stringBuffer.append(TEXT_587);
     stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+    stringBuffer.append(TEXT_587);
+    for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList.iterator(); k.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = k.next();
     stringBuffer.append(TEXT_588);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+    stringBuffer.append(TEXT_589);
     if (annotationReferenceData.containingGenPackage != genPackage) {
     stringBuffer.append(annotationReferenceData.containingGenPackage.getImportedPackageInterfaceName());
-    stringBuffer.append(TEXT_589);
-    }
     stringBuffer.append(TEXT_590);
-    stringBuffer.append(annotationReferenceData.uriFragment);
+    }
     stringBuffer.append(TEXT_591);
-    if (k.hasNext()) {
+    stringBuffer.append(annotationReferenceData.uriFragment);
     stringBuffer.append(TEXT_592);
+    if (k.hasNext()) {
+    stringBuffer.append(TEXT_593);
     }
     stringBuffer.append(genModel.getNonNLS());
     }
-    stringBuffer.append(TEXT_593);
+    stringBuffer.append(TEXT_594);
     }
     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_594);
-    stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
     stringBuffer.append(TEXT_595);
-    if (nonContentAnnotation && genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {
+    stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
     stringBuffer.append(TEXT_596);
-    stringBuffer.append(path.toString());
+    if (nonContentAnnotation && genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {
     stringBuffer.append(TEXT_597);
+    stringBuffer.append(path.toString());
+    stringBuffer.append(TEXT_598);
     } else {
     stringBuffer.append(depth);
     }
-    stringBuffer.append(TEXT_598);
-    if (nestedAnnotationSource == null) {
     stringBuffer.append(TEXT_599);
-    } else {
+    if (nestedAnnotationSource == null) {
     stringBuffer.append(TEXT_600);
-    stringBuffer.append(nestedAnnotationSource);
+    } else {
     stringBuffer.append(TEXT_601);
+    stringBuffer.append(nestedAnnotationSource);
+    stringBuffer.append(TEXT_602);
     stringBuffer.append(genModel.getNonNLS());
     }
-    stringBuffer.append(TEXT_602);
-    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_603);
-    stringBuffer.append(key);
+    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_604);
+    stringBuffer.append(key);
+    stringBuffer.append(TEXT_605);
     stringBuffer.append(value);
     stringBuffer.append(l.hasNext() ? "," : "");
     stringBuffer.append(genModel.getNonNLS(key + value));
     }
-    stringBuffer.append(TEXT_605);
-    if (nestedAnnotationReferenceDataList.isEmpty()) {
     stringBuffer.append(TEXT_606);
-    } else {
+    if (nestedAnnotationReferenceDataList.isEmpty()) {
     stringBuffer.append(TEXT_607);
+    } else {
+    stringBuffer.append(TEXT_608);
     }
     if (!nestedAnnotationReferenceDataList.isEmpty()) {
-    stringBuffer.append(TEXT_608);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
     stringBuffer.append(TEXT_609);
-    for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList.iterator(); l.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = l.next();
-    stringBuffer.append(TEXT_610);
     stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+    stringBuffer.append(TEXT_610);
+    for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList.iterator(); l.hasNext();) { GenPackage.AnnotationReferenceData annotationReferenceData = l.next();
     stringBuffer.append(TEXT_611);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+    stringBuffer.append(TEXT_612);
     if (annotationReferenceData.containingGenPackage != genPackage) {
     stringBuffer.append(annotationReferenceData.containingGenPackage.getImportedPackageInterfaceName());
-    stringBuffer.append(TEXT_612);
-    }
     stringBuffer.append(TEXT_613);
-    stringBuffer.append(annotationReferenceData.uriFragment);
+    }
     stringBuffer.append(TEXT_614);
-    if (l.hasNext()) {
+    stringBuffer.append(annotationReferenceData.uriFragment);
     stringBuffer.append(TEXT_615);
-    }
-    stringBuffer.append(genModel.getNonNLS());
-    }
+    if (l.hasNext()) {
     stringBuffer.append(TEXT_616);
     }
-    }
-    }
+    stringBuffer.append(genModel.getNonNLS());
     }
     stringBuffer.append(TEXT_617);
     }
+    }
+    }
+    }
+    stringBuffer.append(TEXT_618);
+    }
     } else {
     if (genPackage.isLoadingInitialization()) {
-    stringBuffer.append(TEXT_618);
-    stringBuffer.append(genModel.getImportedName("java.net.URL"));
     stringBuffer.append(TEXT_619);
-    stringBuffer.append(genModel.getNonNLS());
+    stringBuffer.append(genModel.getImportedName("java.net.URL"));
     stringBuffer.append(TEXT_620);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
+    stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(TEXT_621);
     stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
     stringBuffer.append(TEXT_622);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
     stringBuffer.append(TEXT_623);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
     stringBuffer.append(TEXT_624);
-    stringBuffer.append(genModel.getImportedName("java.io.IOException"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl"));
     stringBuffer.append(TEXT_625);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
+    stringBuffer.append(genModel.getImportedName("java.io.IOException"));
     stringBuffer.append(TEXT_626);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
     stringBuffer.append(TEXT_627);
-    }
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
     stringBuffer.append(TEXT_628);
-    if (genModel.useClassOverrideAnnotation()) {
-    stringBuffer.append(TEXT_629);
     }
+    stringBuffer.append(TEXT_629);
+    if (genModel.useClassOverrideAnnotation()) {
     stringBuffer.append(TEXT_630);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+    }
     stringBuffer.append(TEXT_631);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
+    stringBuffer.append(TEXT_632);
     ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>(); for (GenClass genClass : genPackage.getGenClasses()) { if (genClass.isDynamic()) { dynamicGenClasses.add(genClass); } }
     if (dynamicGenClasses.isEmpty()) {
-    stringBuffer.append(TEXT_632);
-    stringBuffer.append(genPackage.getInterfacePackageName());
     stringBuffer.append(TEXT_633);
-    stringBuffer.append(genModel.getNonNLS());
+    stringBuffer.append(genPackage.getInterfacePackageName());
     stringBuffer.append(TEXT_634);
-    } else {
+    stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(TEXT_635);
+    } else {
+    stringBuffer.append(TEXT_636);
     for (GenClass genClass : dynamicGenClasses) {
     if (genClass.isDynamic()) {
-    stringBuffer.append(TEXT_636);
-    stringBuffer.append(genPackage.getClassifierID(genClass));
     stringBuffer.append(TEXT_637);
-    }
-    }
+    stringBuffer.append(genPackage.getClassifierID(genClass));
     stringBuffer.append(TEXT_638);
-    stringBuffer.append(genPackage.getInterfacePackageName());
-    stringBuffer.append(TEXT_639);
-    stringBuffer.append(genModel.getNonNLS());
-    stringBuffer.append(TEXT_640);
     }
+    }
+    stringBuffer.append(TEXT_639);
+    stringBuffer.append(genPackage.getInterfacePackageName());
+    stringBuffer.append(TEXT_640);
+    stringBuffer.append(genModel.getNonNLS());
     stringBuffer.append(TEXT_641);
     }
-    if (needsAddEOperation) {
     stringBuffer.append(TEXT_642);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+    }
+    if (needsAddEOperation) {
     stringBuffer.append(TEXT_643);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
-    stringBuffer.append(TEXT_644);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
-    stringBuffer.append(TEXT_645);
     stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+    stringBuffer.append(TEXT_644);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
+    stringBuffer.append(TEXT_645);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
     stringBuffer.append(TEXT_646);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+    stringBuffer.append(TEXT_647);
     }
     if (needsAddEParameter) {
-    stringBuffer.append(TEXT_647);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
     stringBuffer.append(TEXT_648);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
-    stringBuffer.append(TEXT_649);
-    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
-    stringBuffer.append(TEXT_650);
     stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
+    stringBuffer.append(TEXT_649);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
+    stringBuffer.append(TEXT_650);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
     stringBuffer.append(TEXT_651);
+    stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
+    stringBuffer.append(TEXT_652);
     }
     }
     if (isInterface && genPackage.isLiteralsInterface()) {
-    stringBuffer.append(TEXT_652);
-    if (genModel.isOperationReflection()) {
     stringBuffer.append(TEXT_653);
-    }
+    if (genModel.isOperationReflection()) {
     stringBuffer.append(TEXT_654);
-    if (isImplementation) {
-    stringBuffer.append(TEXT_655);
     }
+    stringBuffer.append(TEXT_655);
+    if (isImplementation) {
     stringBuffer.append(TEXT_656);
-    for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+    }
     stringBuffer.append(TEXT_657);
+    for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
+    stringBuffer.append(TEXT_658);
     if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;
     if (!genClass.isInterface()) {
-    stringBuffer.append(TEXT_658);
-    stringBuffer.append(genClass.getQualifiedClassName());
     stringBuffer.append(TEXT_659);
-    stringBuffer.append(genClass.getFormattedName());
+    stringBuffer.append(genClass.getQualifiedClassName());
     stringBuffer.append(TEXT_660);
+    stringBuffer.append(genClass.getFormattedName());
+    stringBuffer.append(TEXT_661);
     stringBuffer.append(genClass.getQualifiedClassName());
     } else {
-    stringBuffer.append(TEXT_661);
-    stringBuffer.append(genClass.getQualifiedInterfaceName());
     stringBuffer.append(TEXT_662);
-    stringBuffer.append(genClass.getFormattedName());
+    stringBuffer.append(genClass.getQualifiedInterfaceName());
     stringBuffer.append(TEXT_663);
+    stringBuffer.append(genClass.getFormattedName());
+    stringBuffer.append(TEXT_664);
     stringBuffer.append(genClass.getQualifiedInterfaceName());
     }
     } else if (genClassifier instanceof GenEnum) { GenEnum genEnum = (GenEnum)genClassifier;
-    stringBuffer.append(TEXT_664);
-    stringBuffer.append(genEnum.getQualifiedName());
     stringBuffer.append(TEXT_665);
-    stringBuffer.append(genEnum.getFormattedName());
+    stringBuffer.append(genEnum.getQualifiedName());
     stringBuffer.append(TEXT_666);
+    stringBuffer.append(genEnum.getFormattedName());
+    stringBuffer.append(TEXT_667);
     stringBuffer.append(genEnum.getQualifiedName());
     } else if (genClassifier instanceof GenDataType) { GenDataType genDataType = (GenDataType)genClassifier;
-    stringBuffer.append(TEXT_667);
-    stringBuffer.append(genDataType.getFormattedName());
     stringBuffer.append(TEXT_668);
-    if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+    stringBuffer.append(genDataType.getFormattedName());
     stringBuffer.append(TEXT_669);
+    if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
+    stringBuffer.append(TEXT_670);
     stringBuffer.append(genDataType.getRawInstanceClassName());
     }
     }
-    stringBuffer.append(TEXT_670);
-    stringBuffer.append(genPackage.getQualifiedPackageClassName());
     stringBuffer.append(TEXT_671);
-    stringBuffer.append(genClassifier.getClassifierAccessorName());
+    stringBuffer.append(genPackage.getQualifiedPackageClassName());
     stringBuffer.append(TEXT_672);
+    stringBuffer.append(genClassifier.getClassifierAccessorName());
+    stringBuffer.append(TEXT_673);
     stringBuffer.append(publicStaticFinalFlag);
     stringBuffer.append(genClassifier.getImportedMetaType());
-    stringBuffer.append(TEXT_673);
-    stringBuffer.append(genPackage.getClassifierID(genClassifier));
     stringBuffer.append(TEXT_674);
-    stringBuffer.append(genClassifier.getClassifierAccessorName());
+    stringBuffer.append(genPackage.getClassifierID(genClassifier));
     stringBuffer.append(TEXT_675);
+    stringBuffer.append(genClassifier.getClassifierAccessorName());
+    stringBuffer.append(TEXT_676);
     if (genClassifier instanceof GenClass) { GenClass genClass = (GenClass)genClassifier;
     for (GenFeature genFeature : genClass.getGenFeatures()) {
-    stringBuffer.append(TEXT_676);
-    stringBuffer.append(genFeature.getFormattedName());
     stringBuffer.append(TEXT_677);
-    stringBuffer.append(genFeature.getFeatureKind());
+    stringBuffer.append(genFeature.getFormattedName());
     stringBuffer.append(TEXT_678);
+    stringBuffer.append(genFeature.getFeatureKind());
+    stringBuffer.append(TEXT_679);
     stringBuffer.append(publicStaticFinalFlag);
     stringBuffer.append(genFeature.getImportedMetaType());
-    stringBuffer.append(TEXT_679);
-    stringBuffer.append(genClass.getFeatureID(genFeature));
     stringBuffer.append(TEXT_680);
-    stringBuffer.append(genFeature.getFeatureAccessorName());
+    stringBuffer.append(genClass.getFeatureID(genFeature));
     stringBuffer.append(TEXT_681);
+    stringBuffer.append(genFeature.getFeatureAccessorName());
+    stringBuffer.append(TEXT_682);
     }
     if (genModel.isOperationReflection()) {
     for (GenOperation genOperation : genClass.getGenOperations()) {
-    stringBuffer.append(TEXT_682);
-    stringBuffer.append(genOperation.getFormattedName());
     stringBuffer.append(TEXT_683);
+    stringBuffer.append(genOperation.getFormattedName());
+    stringBuffer.append(TEXT_684);
     stringBuffer.append(publicStaticFinalFlag);
     stringBuffer.append(genOperation.getImportedMetaType());
-    stringBuffer.append(TEXT_684);
-    stringBuffer.append(genClass.getOperationID(genOperation, false));
     stringBuffer.append(TEXT_685);
-    stringBuffer.append(genOperation.getOperationAccessorName());
+    stringBuffer.append(genClass.getOperationID(genOperation, false));
     stringBuffer.append(TEXT_686);
-    }
-    }
-    }
-    }
+    stringBuffer.append(genOperation.getOperationAccessorName());
     stringBuffer.append(TEXT_687);
     }
+    }
+    }
+    }
     stringBuffer.append(TEXT_688);
+    }
+    stringBuffer.append(TEXT_689);
     stringBuffer.append(isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName());
     genModel.emitSortedImports();
-    stringBuffer.append(TEXT_689);
+    stringBuffer.append(TEXT_690);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PluginXML.java b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PluginXML.java
index 65c05ca..ede7449 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PluginXML.java
+++ b/plugins/org.eclipse.emf.codegen.ecore/src/org/eclipse/emf/codegen/ecore/templates/model/PluginXML.java
@@ -69,9 +69,10 @@
   protected final String TEXT_52 = " -->";
   protected final String TEXT_53 = NL + "      <parser" + NL + "            type=\"";
   protected final String TEXT_54 = "\"" + NL + "            class=\"";
-  protected final String TEXT_55 = "\"/>" + NL + "   </extension>";
-  protected final String TEXT_56 = NL + NL + "</plugin>";
-  protected final String TEXT_57 = NL;
+  protected final String TEXT_55 = "\"/>";
+  protected final String TEXT_56 = NL + "   </extension>";
+  protected final String TEXT_57 = NL + NL + "</plugin>";
+  protected final String TEXT_58 = NL;
 
   public String generate(Object argument)
   {
@@ -195,15 +196,18 @@
     stringBuffer.append(key);
     stringBuffer.append(TEXT_52);
     }
+    for (String fileExtension : genPackage.getFileExtensionList()) {
     stringBuffer.append(TEXT_53);
-    stringBuffer.append(genPackage.getFileExtension());
+    stringBuffer.append(fileExtension);
     stringBuffer.append(TEXT_54);
     stringBuffer.append(genPackage.getQualifiedResourceFactoryClassName());
     stringBuffer.append(TEXT_55);
     }
-    }
     stringBuffer.append(TEXT_56);
+    }
+    }
     stringBuffer.append(TEXT_57);
+    stringBuffer.append(TEXT_58);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/edit/ItemProvider.javajet b/plugins/org.eclipse.emf.codegen.ecore/templates/edit/ItemProvider.javajet
index 84301c3..338c6b9 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/templates/edit/ItemProvider.javajet
+++ b/plugins/org.eclipse.emf.codegen.ecore/templates/edit/ItemProvider.javajet
@@ -32,11 +32,13 @@
  * <!-- end-user-doc -->
  * @generated
  */
-public class <%=genClass.getProviderClassName()%>
+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 = genPackage.getProviderSupportedTypes().iterator(); i.hasNext(); ) {%>
+  <%for (Iterator<String> i = genClass.getProviderImplementsClassNames().iterator(); i.hasNext(); ) {%>
 		<%=genModel.getImportedName(i.next())%><%if (i.hasNext()){%>,<%}%>
+  <%}%>
 <%}%>
 {
 <%if (genModel.hasCopyrightField()) {%>
diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/edit/plugin.xmljet b/plugins/org.eclipse.emf.codegen.ecore/templates/edit/plugin.xmljet
index c697bf9..8b3311e 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/templates/edit/plugin.xmljet
+++ b/plugins/org.eclipse.emf.codegen.ecore/templates/edit/plugin.xmljet
@@ -93,12 +93,14 @@
     <%} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {%>
 
    <extension point="org.eclipse.emf.ecore.extension_parser">
-  <%if (hasKey) {%>
+      <%if (hasKey) {%>
       <!-- @generated <%=key%> -->
-  <%}%>
+      <%}%>
+      <%for (String fileExtension : genPackage.getFileExtensionList()) {%>
       <parser
-            type="<%=genPackage.getFileExtension()%>"
+            type="<%=fileExtension%>"
             class="<%=genPackage.getQualifiedResourceFactoryClassName()%>"/>
+      <%}%>
    </extension>
     <%}%>
   <%}%>
diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.propertiesjet b/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.propertiesjet
index 194ccf3..2ab9458 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.propertiesjet
+++ b/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.propertiesjet
@@ -61,7 +61,7 @@
 _UI_<%=genPackage.getEditorClassName()%>_label = <%=genPackage.getPrefix()%> Model Editor
 
 _UI_<%=genPackage.getEditorClassName()%>FilenameDefaultBase = My
-_UI_<%=genPackage.getEditorClassName()%>FilenameExtensions = <%=genPackage.isMultipleFileExtensions() ? genPackage.getFileExtensions() : genPackage.getFileExtension()%>
+_UI_<%=genPackage.getEditorClassName()%>FilenameExtensions = <%=genPackage.getFileExtensions()%>
 
 <%}%>
 _UI_Wizard_label = New
diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.xmljet b/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.xmljet
index ac0afdc..374a252 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.xmljet
+++ b/plugins/org.eclipse.emf.codegen.ecore/templates/editor/plugin.xmljet
@@ -93,12 +93,14 @@
     <%} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {%>
 
    <extension point="org.eclipse.emf.ecore.extension_parser">
-  <%if (hasKey) {%>
+      <%if (hasKey) {%>
       <!-- @generated <%=key%> -->
-  <%}%>
+      <%}%>
+      <%for (String fileExtension : genPackage.getFileExtensionList()) {%>
       <parser
-            type="<%=genPackage.getFileExtension()%>"
+            type="<%=fileExtension%>"
             class="<%=genPackage.getQualifiedResourceFactoryClassName()%>"/>
+      <%}%>
    </extension>
     <%}%>
   <%}%>
@@ -276,7 +278,7 @@
             name="%_UI_<%=genPackage.getEditorClassName()%>_label"
             icon="icons/full/obj16/<%=genPackage.getPrefix()%>ModelFile.gif"
     <%if (!genPackage.isContentType()) {%>
-            extensions="<%=genPackage.getFileExtension()%>"
+            extensions="<%=genPackage.getFileExtensions()%>"
     <%}%>
             class="<%=genPackage.getQualifiedEditorClassName()%>"
             contributorClass="<%=genPackage.getQualifiedActionBarContributorClassName()%>">
diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/model/PackageClass.javajet b/plugins/org.eclipse.emf.codegen.ecore/templates/model/PackageClass.javajet
index d5755f3..e0e346e 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/templates/model/PackageClass.javajet
+++ b/plugins/org.eclipse.emf.codegen.ecore/templates/model/PackageClass.javajet
@@ -943,7 +943,7 @@
     <%if (genPackage.getSuperGenPackage() == null) {%>
 
 		// Create resource
-		createResource(eNS_URI);
+		createResource(<%=genPackage.getSchemaLocation()%>);
     <%}%>
     <%if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {%>
 
diff --git a/plugins/org.eclipse.emf.codegen.ecore/templates/model/plugin.xmljet b/plugins/org.eclipse.emf.codegen.ecore/templates/model/plugin.xmljet
index 2e4add0..9e0098d 100644
--- a/plugins/org.eclipse.emf.codegen.ecore/templates/model/plugin.xmljet
+++ b/plugins/org.eclipse.emf.codegen.ecore/templates/model/plugin.xmljet
@@ -96,12 +96,14 @@
   <%} else if (genPackage.getResource() != GenResourceKind.NONE_LITERAL) {%>
 
    <extension point="org.eclipse.emf.ecore.extension_parser">
-  <%if (hasKey) {%>
+    <%if (hasKey) {%>
       <!-- @generated <%=key%> -->
-  <%}%>
+    <%}%>
+    <%for (String fileExtension : genPackage.getFileExtensionList()) {%>
       <parser
-            type="<%=genPackage.getFileExtension()%>"
+            type="<%=fileExtension%>"
             class="<%=genPackage.getQualifiedResourceFactoryClassName()%>"/>
+    <%}%>
    </extension>
   <%}%>
 <%}%>
diff --git a/plugins/org.eclipse.emf.converter/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.converter/META-INF/MANIFEST.MF
index a60b91b..6788a52 100644
--- a/plugins/org.eclipse.emf.converter/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.converter/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.converter; singleton:=true
-Bundle-Version: 2.6.0.qualifier
+Bundle-Version: 2.7.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.emf.converter.ConverterPlugin$Implementation
 Bundle-Vendor: %providerName
diff --git a/plugins/org.eclipse.emf.ecore.xmi/src/org/eclipse/emf/ecore/xmi/impl/XMLHandler.java b/plugins/org.eclipse.emf.ecore.xmi/src/org/eclipse/emf/ecore/xmi/impl/XMLHandler.java
index c9d9d13..7e4f877 100644
--- a/plugins/org.eclipse.emf.ecore.xmi/src/org/eclipse/emf/ecore/xmi/impl/XMLHandler.java
+++ b/plugins/org.eclipse.emf.ecore.xmi/src/org/eclipse/emf/ecore/xmi/impl/XMLHandler.java
@@ -2567,10 +2567,7 @@
         else
         {
           List<EObject> contents = resource.getContents();
-          if (!contents.isEmpty())
-          {
-            content = contents.get(0);
-          }
+          content = EcoreUtil.getObjectByType(contents, EcorePackage.Literals.EPACKAGE);
         }
 
         if (content instanceof EPackage)
diff --git a/plugins/org.eclipse.emf.ecore/src/org/eclipse/emf/ecore/util/EcoreUtil.java b/plugins/org.eclipse.emf.ecore/src/org/eclipse/emf/ecore/util/EcoreUtil.java
index 60dead2..cea1332 100644
--- a/plugins/org.eclipse.emf.ecore/src/org/eclipse/emf/ecore/util/EcoreUtil.java
+++ b/plugins/org.eclipse.emf.ecore/src/org/eclipse/emf/ecore/util/EcoreUtil.java
@@ -37,6 +37,7 @@
 import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.SegmentSequence;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EAnnotation;
@@ -380,8 +381,8 @@
    * use {@link EcoreUtil#copy EcoreUtil.copy} or {@link EcoreUtil#copyAll EcoreUtil.copyAll} to do routine copies.
    * Since this implementation extends a Map implementation, it acts as the result of the over all copy.
    * The client can call {@link #copy copy} and {@link #copyAll copyAll} repeatedly.
-   * When all the objects have been copied, 
-   * the client should call {@link #copyReferences copyReferences} 
+   * When all the objects have been copied,
+   * the client should call {@link #copyReferences copyReferences}
    * to copy the {@link #copyReference appropriate} {@link EObject#eCrossReferences cross references}.
    *<pre>
    *  Copier copier = new Copier();
@@ -414,7 +415,7 @@
     {
       super();
     }
-    
+
     /**
      * Creates an instance that resolves proxies or not as specified.
      * @param resolveProxies whether proxies should be resolved while copying.
@@ -465,30 +466,33 @@
       else
       {
         EObject copyEObject = createCopy(eObject);
-        put(eObject, copyEObject);
-        EClass eClass = eObject.eClass();
-        for (int i = 0, size = eClass.getFeatureCount(); i < size; ++i)
+        if (copyEObject != null)
         {
-          EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(i);
-          if (eStructuralFeature.isChangeable() && !eStructuralFeature.isDerived())
+          put(eObject, copyEObject);
+          EClass eClass = eObject.eClass();
+          for (int i = 0, size = eClass.getFeatureCount(); i < size; ++i)
           {
-            if (eStructuralFeature instanceof EAttribute)
+            EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(i);
+            if (eStructuralFeature.isChangeable() && !eStructuralFeature.isDerived())
             {
-              copyAttribute((EAttribute)eStructuralFeature, eObject, copyEObject);
-            }
-            else
-            {
-              EReference eReference = (EReference)eStructuralFeature;
-              if (eReference.isContainment())
+              if (eStructuralFeature instanceof EAttribute)
               {
-                copyContainment(eReference, eObject, copyEObject);
+                copyAttribute((EAttribute)eStructuralFeature, eObject, copyEObject);
+              }
+              else
+              {
+                EReference eReference = (EReference)eStructuralFeature;
+                if (eReference.isContainment())
+                {
+                  copyContainment(eReference, eObject, copyEObject);
+                }
               }
             }
           }
+
+          copyProxyURI(eObject, copyEObject);
         }
-  
-        copyProxyURI(eObject, copyEObject);
-  
+
         return copyEObject;
       }
     }
@@ -510,19 +514,31 @@
      * Returns a new instance of the object's target class.
      * @param eObject the object to copy.
      * @return a new instance of the target class.
-     * @see #getTarget(EClass)
+     * @see #getTarget(EObject)
      * @see EcoreUtil#create(EClass)
      */
     protected EObject createCopy(EObject eObject)
     {
-      return create(getTarget(eObject.eClass()));
+      EClass eClass = getTarget(eObject);
+      return eClass == null ? null : create(eClass);
+    }
+
+    /**
+     * Returns the target class used to create a copy instance for the given instance object.
+     * @param eObject the object to be copied.
+     * @return the target class used to create a copy instance.
+     * @since 2.10
+     */
+    protected EClass getTarget(EObject eObject)
+    {
+      return getTarget(eObject.eClass());
     }
 
     /**
      * Returns the target class used to create a copy instance for objects of the given source class.
      * @param eClass the source class.
      * @return the target class used to create a copy instance.
-     * @see #getTarget(EStructuralFeature)
+     * @see #getTarget(EStructuralFeature, EObject, EObject)
      */
     protected EClass getTarget(EClass eClass)
     {
@@ -530,6 +546,20 @@
     }
 
     /**
+     * Returns a setting for the feature and copy instance to be populated with the original object's source feature's value.
+     * @param eStructuralFeature the source feature.
+     * @return the target feature used to populate a copy instance.
+     * @see #getTarget(EStructuralFeature)
+     * @see #getTarget(EObject)
+     * @since 2.10
+     */
+    protected EStructuralFeature.Setting getTarget(EStructuralFeature eStructuralFeature, EObject eObject, EObject copyEObject)
+    {
+      EStructuralFeature targetEStructuralFeature = getTarget(eStructuralFeature);
+      return targetEStructuralFeature == null ? null : ((InternalEObject)copyEObject).eSetting(targetEStructuralFeature);
+    }
+
+    /**
      * Returns the target feature used to populate a copy instance from the given source feature.
      * @param eStructuralFeature the source feature.
      * @return the target feature used to populate a copy instance.
@@ -551,24 +581,21 @@
     {
       if (eObject.eIsSet(eReference))
       {
-        if (eReference.isMany())
+        EStructuralFeature.Setting setting = getTarget(eReference, eObject, copyEObject);
+        if (setting != null)
         {
-          @SuppressWarnings("unchecked") List<EObject> source = (List<EObject>)eObject.eGet(eReference);
-          @SuppressWarnings("unchecked") List<EObject> target = (List<EObject>)copyEObject.eGet(getTarget(eReference));
-          if (source.isEmpty())
+          Object value = eObject.eGet(eReference);
+          if (eReference.isMany())
           {
-            target.clear();
+            @SuppressWarnings("unchecked")
+            List<EObject> target = (List<EObject>)value;
+            setting.set(copyAll(target));
           }
           else
           {
-            target.addAll(copyAll(source));
+            setting.set(copy((EObject)value));
           }
         }
-        else
-        {
-          EObject childEObject = (EObject)eObject.eGet(eReference);
-          copyEObject.eSet(getTarget(eReference), childEObject == null ? null : copy(childEObject));
-        }
       }
     }
 
@@ -586,40 +613,56 @@
         if (FeatureMapUtil.isFeatureMap(eAttribute))
         {
           FeatureMap featureMap = (FeatureMap)eObject.eGet(eAttribute);
-          for (int i = 0, size = featureMap.size(); i < size; ++i)
-          {
-            EStructuralFeature feature = featureMap.getEStructuralFeature(i);
-            if (feature instanceof EReference && ((EReference)feature).isContainment())
-            {
-              Object value = featureMap.getValue(i);
-              if (value != null)
-              {
-                copy((EObject)value);
-              }
-            }
-          }
-        }
-        else if (eAttribute.isMany())
-        {
-          List<?> source = (List<?>)eObject.eGet(eAttribute);
-          @SuppressWarnings("unchecked") List<Object> target = (List<Object>)copyEObject.eGet(getTarget(eAttribute));
-          if (source.isEmpty())
-          {
-            target.clear();
-          }
-          else
-          {
-            target.addAll(source);
-          }
+          copyFeatureMap(featureMap);
         }
         else
         {
-          copyEObject.eSet(getTarget(eAttribute), eObject.eGet(eAttribute));
+          EStructuralFeature.Setting setting = getTarget(eAttribute, eObject, copyEObject);
+          if (setting != null)
+          {
+            copyAttributeValue(eAttribute, eObject, eObject.eGet(eAttribute), setting);
+          }
         }
       }
     }
 
     /**
+     * Call to handle copying the contained objects within a feature map.
+     * @param featureMap the feature map the copy.
+     * @since 2.10
+     */
+    protected void copyFeatureMap(FeatureMap featureMap)
+    {
+      for (int i = 0, size = featureMap.size(); i < size; ++i)
+      {
+        EStructuralFeature feature = featureMap.getEStructuralFeature(i);
+        if (feature instanceof EReference && ((EReference)feature).isContainment())
+        {
+          Object value = featureMap.getValue(i);
+          if (value != null)
+          {
+            // The containment references are hooked up later during copyReferences.
+            //
+            copy((EObject)value);
+          }
+        }
+      }
+    }
+
+    /**
+     * Called to handle copying of an attribute's value to the target setting.
+     * @param eAttribute the attribute of the source object corresponding to the value.
+     * @param eObject the object being copied.
+     * @param value the value to be copied.
+     * @param setting the feature-value pair that is the target of of the copy.
+     * @since 2.10
+     */
+    protected void copyAttributeValue(EAttribute eAttribute, EObject eObject, Object value, EStructuralFeature.Setting setting)
+    {
+      setting.set(value);
+    }
+
+    /**
      * Hooks up cross references; it delegates to {@link #copyReference copyReference}.
      */
     public void copyReferences()
@@ -644,43 +687,47 @@
             }
             else if (FeatureMapUtil.isFeatureMap(eStructuralFeature))
             {
-              FeatureMap featureMap = (FeatureMap)eObject.eGet(eStructuralFeature);
-              FeatureMap copyFeatureMap = (FeatureMap)copyEObject.eGet(getTarget(eStructuralFeature));
-              int copyFeatureMapSize = copyFeatureMap.size();
-              for (int k = 0, featureMapSize = featureMap.size(); k < featureMapSize; ++k)
+              FeatureMap copyFeatureMap = (FeatureMap)getTarget(eStructuralFeature, eObject, copyEObject);
+              if (copyFeatureMap != null)
               {
-                EStructuralFeature feature = featureMap.getEStructuralFeature(k);
-                if (feature instanceof EReference)
+                FeatureMap featureMap = (FeatureMap)eObject.eGet(eStructuralFeature);
+                int copyFeatureMapSize = copyFeatureMap.size();
+                for (int k = 0, featureMapSize = featureMap.size(); k < featureMapSize; ++k)
                 {
-                  Object referencedEObject = featureMap.getValue(k);
-                  Object copyReferencedEObject = get(referencedEObject);
-                  if (copyReferencedEObject == null && referencedEObject != null)
+                  EStructuralFeature feature = featureMap.getEStructuralFeature(k);
+                  if (feature instanceof EReference)
                   {
-                    EReference reference = (EReference)feature;
-                    if (!useOriginalReferences || reference.isContainment() || reference.getEOpposite() != null)
+                    Object referencedEObject = featureMap.getValue(k);
+                    Object copyReferencedEObject = get(referencedEObject);
+                    if (copyReferencedEObject == null && referencedEObject != null)
                     {
-                      continue;
-                    }
-                    copyReferencedEObject = referencedEObject;
-                  }
-                  // If we can't add it, it must already be in the list so find it and move it to the end.
-                  //
-                  if (!copyFeatureMap.add(feature, copyReferencedEObject))
-                  {
-                    for (int l = 0; l < copyFeatureMapSize; ++l) 
-                    {
-                      if (copyFeatureMap.getEStructuralFeature(l) == feature && copyFeatureMap.getValue(l) == copyReferencedEObject)
+                      EReference reference = (EReference)feature;
+                      if (!useOriginalReferences || reference.isContainment() || reference.getEOpposite() != null)
                       {
-                        copyFeatureMap.move(copyFeatureMap.size() - 1, l);
-                        --copyFeatureMapSize;
-                        break;
+                        continue;
+                      }
+                      copyReferencedEObject = referencedEObject;
+                    }
+  
+                    // If we can't add it, it must already be in the list so find it and move it to the end.
+                    //
+                    if (!copyFeatureMap.add(feature, copyReferencedEObject))
+                    {
+                      for (int l = 0; l < copyFeatureMapSize; ++l)
+                      {
+                        if (copyFeatureMap.getEStructuralFeature(l) == feature && copyFeatureMap.getValue(l) == copyReferencedEObject)
+                        {
+                          copyFeatureMap.move(copyFeatureMap.size() - 1, l);
+                          --copyFeatureMapSize;
+                          break;
+                        }
                       }
                     }
                   }
-                }
-                else
-                {
-                  copyFeatureMap.add(featureMap.get(k));
+                  else
+                  {
+                    copyFeatureMap.add(getTarget(featureMap.getEStructuralFeature(k)), featureMap.getValue(k));
+                  }
                 }
               }
             }
@@ -701,73 +748,77 @@
     {
       if (eObject.eIsSet(eReference))
       {
-        if (eReference.isMany())
+        EStructuralFeature.Setting setting = getTarget(eReference, eObject, copyEObject);
+        if (setting != null)
         {
-          @SuppressWarnings("unchecked") InternalEList<EObject> source = (InternalEList<EObject>)eObject.eGet(eReference);
-          @SuppressWarnings("unchecked") InternalEList<EObject> target = (InternalEList<EObject>)copyEObject.eGet(getTarget(eReference));
-          if (source.isEmpty())
+          Object value = eObject.eGet(eReference);
+          if (eReference.isMany())
           {
-            target.clear();
-          }
-          else
-          {
-            boolean isBidirectional = eReference.getEOpposite() != null;
-            int index = 0;
-            for (Iterator<EObject> k = resolveProxies ? source.iterator() : source.basicIterator(); k.hasNext();)
+            @SuppressWarnings("unchecked") InternalEList<EObject> source = (InternalEList<EObject>)value;
+            @SuppressWarnings("unchecked") InternalEList<EObject> target = (InternalEList<EObject>)setting;
+            if (source.isEmpty())
             {
-              EObject referencedEObject = k.next();
-              EObject copyReferencedEObject = get(referencedEObject);
-              if (copyReferencedEObject == null)
+              target.clear();
+            }
+            else
+            {
+              boolean isBidirectional = eReference.getEOpposite() != null;
+              int index = 0;
+              for (Iterator<EObject> k = resolveProxies ? source.iterator() : source.basicIterator(); k.hasNext();)
               {
-                if (useOriginalReferences && !isBidirectional)
+                EObject referencedEObject = k.next();
+                EObject copyReferencedEObject = get(referencedEObject);
+                if (copyReferencedEObject == null)
                 {
-                  target.addUnique(index, referencedEObject);
-                  ++index;
-                }
-              }
-              else
-              {
-                if (isBidirectional)
-                {
-                  int position = target.indexOf(copyReferencedEObject);
-                  if (position == -1)
+                  if (useOriginalReferences && !isBidirectional)
                   {
-                    target.addUnique(index, copyReferencedEObject);
-                  }
-                  else if (index != position)
-                  {
-                    target.move(index, copyReferencedEObject);
+                    target.addUnique(index, referencedEObject);
+                    ++index;
                   }
                 }
                 else
                 {
-                  target.addUnique(index, copyReferencedEObject);
+                  if (isBidirectional)
+                  {
+                    int position = target.indexOf(copyReferencedEObject);
+                    if (position == -1)
+                    {
+                      target.addUnique(index, copyReferencedEObject);
+                    }
+                    else if (index != position)
+                    {
+                      target.move(index, copyReferencedEObject);
+                    }
+                  }
+                  else
+                  {
+                    target.addUnique(index, copyReferencedEObject);
+                  }
+                  ++index;
                 }
-                ++index;
               }
             }
           }
-        }
-        else
-        {
-          Object referencedEObject = eObject.eGet(eReference, resolveProxies);
-          if (referencedEObject == null)
-          {
-            copyEObject.eSet(getTarget(eReference), null);
-          }
           else
           {
-            Object copyReferencedEObject = get(referencedEObject);
-            if (copyReferencedEObject == null)
+            if (value == null)
             {
-              if (useOriginalReferences && eReference.getEOpposite() == null)
-              {
-                copyEObject.eSet(getTarget(eReference), referencedEObject);
-              }
+              setting.set(null);
             }
             else
             {
-              copyEObject.eSet(getTarget(eReference), copyReferencedEObject);
+              Object copyReferencedEObject = get(value);
+              if (copyReferencedEObject == null)
+              {
+                if (useOriginalReferences && eReference.getEOpposite() == null)
+                {
+                  setting.set(value);
+                }
+              }
+              else
+              {
+                setting.set(copyReferencedEObject);
+              }
             }
           }
         }
@@ -2967,9 +3018,9 @@
   /**
    * Returns a URI for the eObject, 
    * i.e., either 
-   * the eProxyURI,
-   * the URI of the eResource with the fragment produced by the eResource,
-   * or the URI consisting of just the fragment that would be produced by a default Resource 
+   * the {@link InternalEObject#eProxyURI() proxy URI},
+   * the URI of the {@link EObject#eResource() resource} with the {@link Resource#getURIFragment(EObject) fragment} produced by the resource,
+   * or the URI consisting of just the {@link #getRelativeURIFragmentPath(EObject, EObject) fragment path} that would be produced by a default Resource 
    * with the eObject as its only contents.
    * @param eObject the object for which to get the URI.
    * @return the URI for the object.
@@ -3003,29 +3054,93 @@
         }
         else
         {
-          InternalEObject internalEObject = (InternalEObject)eObject;
-          List<String> uriFragmentPath = new ArrayList<String>();
-          HashSet<InternalEObject> visited = new HashSet<InternalEObject>();
-          for (InternalEObject container = internalEObject.eInternalContainer(); container != null && visited.add(container); container = internalEObject.eInternalContainer())
-          {
-            uriFragmentPath.add(container.eURIFragmentSegment(internalEObject.eContainingFeature(), internalEObject));
-            internalEObject = container;
-          }
-      
-          StringBuffer result = new StringBuffer("#//");
-      
-          for (int i = uriFragmentPath.size() - 1; i >= 0; --i)
-          {
-            result.append('/');
-            result.append(uriFragmentPath.get(i));
-          }
-          return URI.createURI(result.toString());
+          return URI.createURI("#//" + getRelativeURIFragmentPath(null, eObject, false));
         }
       }
     }
   }
 
   /**
+   * Returns the fragment path of the descendant object relative to its {@link #isAncestor(EObject, EObject) ancestor}.
+   * The ancestor may be <code>null</code>, it which case the path is relative to the {@link #getRootContainer(EObject) root}.
+   * Otherwise, the resulting fragment path can be passed to {@link #getEObject(EObject, String)} along with the ancestor to the yield the descendant.
+   * @param ancestorEObject the ancestor of the descendant object (can be null)
+   * @param descendantEObject  descendant of the ancestor object
+   * @return the relativefragment path.
+   * @see InternalEObject#eURIFragmentSegment(EStructuralFeature, EObject)
+   * @see #getEObject(EObject, String)
+   * @throws IllegalArgumentException if the ancestor is non-null and is not an ancestor of the descendant.
+   * @since 2.10
+   */
+  public static String getRelativeURIFragmentPath(EObject ancestorEObject, EObject descendantEObject)
+  {
+    return getRelativeURIFragmentPath(ancestorEObject, descendantEObject, true);
+  }
+
+  private  static String getRelativeURIFragmentPath(EObject ancestorEObject, EObject descendantEObject, boolean resolve)
+  {
+    if (ancestorEObject == descendantEObject)
+    {
+      return "";
+    }
+
+    List<String> uriFragmentPath = new ArrayList<String>();
+    HashSet<InternalEObject> visited = new HashSet<InternalEObject>();
+    InternalEObject internalEObject = (InternalEObject)descendantEObject;
+    for (InternalEObject container = resolve ? (InternalEObject)internalEObject.eContainer() : internalEObject.eInternalContainer(); 
+         container != null && visited.add(container);
+         container = resolve ? (InternalEObject)internalEObject.eContainer() : internalEObject.eInternalContainer())
+    {
+      uriFragmentPath.add(container.eURIFragmentSegment(internalEObject.eContainingFeature(), internalEObject));
+      internalEObject = container;
+      if (container == ancestorEObject)
+      {
+        break;
+      }
+    }
+    
+    if (internalEObject != ancestorEObject && ancestorEObject != null)
+    {
+      throw new IllegalArgumentException("The ancestor '" + ancestorEObject + "' is not an ancestor of '" + descendantEObject + "'");
+    }
+
+    StringBuilder result = new StringBuilder();
+    int size = uriFragmentPath.size();
+    if (size > 0)
+    {
+      for (int i = uriFragmentPath.size() - 1; i > 0; --i)
+      {
+        result.append(uriFragmentPath.get(i));
+        result.append('/');
+      }
+      result.append(uriFragmentPath.get(0));
+    }
+
+    return result.toString();
+  }
+
+  /**
+   * Returns the object reached via by navigating the relative URI fragment path.
+   * @param rootEObject
+   * @param relativeFragmentPath
+   * @return the object at the path.
+   * @see #getRelativeURIFragmentPath(EObject, EObject)
+   * @see InternalEObject#eObjectForURIFragmentSegment(String)
+   * @since 2.10
+   */
+  public static EObject getEObject(EObject rootEObject, String relativeFragmentPath)
+  {
+    String[] segments = SegmentSequence.create("/", relativeFragmentPath).segments();
+    int size = segments.length;
+    EObject eObject = rootEObject;
+    for (int i = 0; i < size && eObject != null; ++i)
+    {
+      eObject = ((InternalEObject)eObject).eObjectForURIFragmentSegment(segments[i]);
+    }
+    return eObject;
+  }
+
+  /**
    * Searches for the first occurrence of the given argument in list starting from
    * a specified index.  The equality is tested using the operator <tt>==<tt> and
    * the <tt>equals</tt> method. 
diff --git a/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/action/ValidateAction.java b/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/action/ValidateAction.java
index 9f5902b..d368496 100644
--- a/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/action/ValidateAction.java
+++ b/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/action/ValidateAction.java
@@ -262,6 +262,7 @@
     {
       progressMonitor.setTaskName(EMFEditUIPlugin.INSTANCE.getString("_UI_Validating_message", new Object [] { diagnostician.getObjectLabel(eObject) }));
       diagnostician.validate(eObject, diagnostic, context);
+      context.remove(EObjectValidator.ROOT_OBJECT);
     }
     return diagnostic;
   }
diff --git a/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/provider/DiagnosticDecorator.java b/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/provider/DiagnosticDecorator.java
index b2d45da..f94d062 100644
--- a/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/provider/DiagnosticDecorator.java
+++ b/plugins/org.eclipse.emf.edit.ui/src/org/eclipse/emf/edit/ui/provider/DiagnosticDecorator.java
@@ -543,6 +543,7 @@
                     for (EObject eObject : resource.getContents())
                     {
                       diagnostician.validate(eObject, resourceDiagnostic, context);
+                      context.remove(EObjectValidator.ROOT_OBJECT);
                     }
                   }
                 }
diff --git a/plugins/org.eclipse.emf.importer.ecore/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.importer.ecore/META-INF/MANIFEST.MF
index 9633e81..988abcb 100644
--- a/plugins/org.eclipse.emf.importer.ecore/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.importer.ecore/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.importer.ecore; singleton:=true
-Bundle-Version: 2.7.0.qualifier
+Bundle-Version: 2.8.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.emf.importer.ecore.EcoreImporterPlugin$Implementation
 Bundle-Vendor: %providerName
diff --git a/tests/org.eclipse.emf.test.core/src/org/eclipse/emf/test/core/common/util/EqualityTest.java b/tests/org.eclipse.emf.test.core/src/org/eclipse/emf/test/core/common/util/EqualityTest.java
index e7e4858..f670b6b 100644
--- a/tests/org.eclipse.emf.test.core/src/org/eclipse/emf/test/core/common/util/EqualityTest.java
+++ b/tests/org.eclipse.emf.test.core/src/org/eclipse/emf/test/core/common/util/EqualityTest.java
@@ -225,6 +225,8 @@
     supplier2.getStandardOrders().add(EcoreUtil.copy(po2));
     assertTrue(EcoreUtil.equals(supplier1, supplier2));
 
+    assertTrue(EcoreUtil.equals(supplier2, EcoreUtil.copy(supplier2)));
+
     EObject employee1 = createEmployee("Mr. M. D.");
     EObject employee2 = EcoreUtil.copy(employee1);