diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/.classpath b/plugins/org.eclipse.uml2.uml.profile.l2/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/.project b/plugins/org.eclipse.uml2.uml.profile.l2/.project
new file mode 100644
index 0000000..39c29a1
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uml2.uml.profile.l2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/META-INF/MANIFEST.MF b/plugins/org.eclipse.uml2.uml.profile.l2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0ca1a50
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.uml2.uml.profile.l2;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.uml2.uml.profile.l2.L2Plugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.uml2.uml.profile.l2,
+ org.eclipse.uml2.uml.profile.l2.internal.impl,
+ org.eclipse.uml2.uml.profile.l2.internal.operations,
+ org.eclipse.uml2.uml.profile.l2.util
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.uml2.uml;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/about.html b/plugins/org.eclipse.uml2.uml.profile.l2/about.html
new file mode 100755
index 0000000..598b368
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>May 12, 2008</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/build.properties b/plugins/org.eclipse.uml2.uml.profile.l2/build.properties
new file mode 100644
index 0000000..7147a64
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/build.properties
@@ -0,0 +1,22 @@
+# Copyright (c) 2011 CEA and others.
+# All rights reserved.   This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   CEA - initial API and implementation
+#
+source.. = src/
+output.. = bin/
+bin.includes = about.html,\
+               plugin.*,\
+               .,\
+               model/*.ecore,\
+               model/*.genmodel,\
+               META-INF/
+src.includes = about.html,\
+               model/*.uml
+exclude.. = **/doc-files/**
+javacSource = 1.5
+javacTarget = 1.5
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.ecore b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.ecore
new file mode 100644
index 0000000..6eb303a
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.ecore
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="l2"
+    nsURI="http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2" nsPrefix="l2">
+  <eClassifiers xsi:type="ecore:EClass" name="Auxiliary">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A class that supports another more central or fundamental class, typically by implementing secondary logic or control flow. The class that the auxiliary supports may be defined explicitly using a Focus class or implicitly as the supplier of dependency relationship whose client is an auxiliary class. Auxiliary classes are typically used together with Focus classes, and are particularly useful for specifying the secondary business logic or control flow of components during design. See also: «Focus»."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Class" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Class"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Call">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A usage dependency whose source is an operation and whose target is an operation. The relationship may also be subsumed to the class containing an operation, with the meaning that there exists an operation in the class to which the dependency applies. A call dependency specifies that the source operation or an operation in the source class invokes the target operation or an operation in the target class. A call dependency may connect a source operation to any target operation that is within scope including, but not limited to, operations of the enclosing classifier and operations of other visible classifiers."/>
+    </eAnnotations>
+    <eOperations name="client_and_supplier_are_operations" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Operation))"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Usage" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Usage"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Create">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="When applied to a usage dependency, it specifies that the client classifier creates instances of the supplier classifier. When applied to a BehavioralFeature, it specifies that the designated feature creates an instance of the classifier to which the feature is attached."/>
+    </eAnnotations>
+    <eOperations name="client_and_supplier_are_classifiers" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Usage->notEmpty() implies (self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier)))"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_BehavioralFeature"
+        ordered="false" lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//BehavioralFeature"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Usage" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Usage"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Derive">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="Specifies a derivation relationship among model elements that are usually, but not necessarily, of the same type. A derived dependency specifies that the client may be computed from the supplier. The mapping specifies the computation. The client may be implemented for design reasons, such as efficiency, even though it is logically redundant."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Abstraction" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Abstraction"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="computation" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//ValueSpecification"
+        containment="true">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="The specification for computing the derived client element from the derivation supplier element."/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Destroy">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="Specifies that the designated feature destroys an instance of the classifier to which the feature is attached."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_BehavioralFeature"
+        ordered="false" lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//BehavioralFeature"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Document" eSuperTypes="#//File">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A specific kind of file that is not an «Executable», «Library», «Script» or «Source». Subclass of «File»."/>
+    </eAnnotations>
+    <eAnnotations source="duplicates">
+      <contents xsi:type="ecore:EReference" name="base_Artifact" ordered="false" lowerBound="1"
+          eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Artifact">
+        <eAnnotations source="redefines" references="#//File/base_Artifact"/>
+      </contents>
+    </eAnnotations>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="File" abstract="true">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A physical file in the context of the system developed."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Artifact" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Artifact"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Entity">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A persistent information component representing a business concept."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Component" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Component"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Executable" eSuperTypes="#//File">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A program file that can be executed on a computer system. Subclass of «File»."/>
+    </eAnnotations>
+    <eAnnotations source="duplicates">
+      <contents xsi:type="ecore:EReference" name="base_Artifact" ordered="false" lowerBound="1"
+          eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Artifact">
+        <eAnnotations source="redefines" references="#//File/base_Artifact"/>
+      </contents>
+    </eAnnotations>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Focus">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A class that defines the core logic or control flow for one or more auxiliary classes that support it. Support classes may be defined explicitly using Auxiliary classes or implicitly as clients of dependency relationships whose supplier is a focus class. Focus classes are typically used together with one or more Auxiliary classes, and are particularly useful for specifying the core business logic or control flow of components during design. See also: «Auxiliary»."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Class" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Class"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Framework">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A package that contains model elements that specify a reusable architecture for all or part of a system. Frameworks typically include classes, patterns, or templates. When frameworks are specialized for an application domain they are sometimes referred to as application frameworks."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Package" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Package"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Implement">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A component definition that is not intended to have a specification itself. Rather, it is an implementation for a separate «Specification» to which it has a Dependency."/>
+    </eAnnotations>
+    <eOperations name="implements_specification" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Component.clientDependency.supplier->select(oclIsKindOf(Classifier)).oclAsType(Classifier).extension_Specificaiton->notEmpty()"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Component" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Component"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ImplementationClass">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="The implementation of a class in some programming language (e.g., C++, Smalltalk, Java) in which an instance may not have more than one class. This is in contrast to Class, for which an instance may have multiple classes at one time and may gain or lose classes over time, and an object (a child of instance) may dynamically have multiple classes. An Implementation class is said to realize a Classifier if it provides all of the operations defined for the Classifier with the same behavior as specified for the Classifier's operations. An Implementation Class may realize a number of different Types. Note that the physical attributes and associations of the Implementation class do not have to be the same as those of any Classifier it realizes and that the Implementation Class may provide methods for its operations in terms of its physical attributes and associations. See also: «Type»."/>
+    </eAnnotations>
+    <eOperations name="cannot_be_realization" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Class.extension_Realization->isEmpty()"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Class" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Class"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Instantiate">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A usage dependency among classifiers indicating that operations on the client create instances of the supplier."/>
+    </eAnnotations>
+    <eOperations name="client_and_supplier_are_classifiers" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier))"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Usage" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Usage"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Library" eSuperTypes="#//File">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A static or dynamic library file. Subclass of «File»."/>
+    </eAnnotations>
+    <eAnnotations source="duplicates">
+      <contents xsi:type="ecore:EReference" name="base_Artifact" ordered="false" lowerBound="1"
+          eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Artifact">
+        <eAnnotations source="redefines" references="#//File/base_Artifact"/>
+      </contents>
+    </eAnnotations>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Metaclass">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A class whose instances are also classes."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Class" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Class"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ModelLibrary">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A package that contains model elements that are intended to be reused by other packages. Model libraries are frequently used in conjunction with applied profiles. This is expressed by defining a dependency between a profile and a model library package, or by defining a model library as contained in a profile package. The classes in a model library are not stereotypes and tagged definitions extending the metamodel. A model library is analogous to a class library in some programming languages. When a model library is defined as a part of a profile, it is imported or deleted with the application or removal of the profile. The profile is implicitly applied to its model library. In the other case, when the model library is defined as an external package imported by a profile, the profile requires that the model library be there in the model at the stage of the profile application. The application or the removal of the profile does not affect the presence of the model library elements."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Package" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Package"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Process">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A transaction based component."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Component" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Component"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Realization">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A classifier that specifies a domain of objects and that also defines the physical implementation of those objects. For example, a Component stereotyped by «realization» will only have realizing Classifiers that implement behavior specified by a separate «Specification» Component. See «specification». This differs from «ImplementationClass» because an «ImplementationClass» is a realization of a Class that can have features such as attributes and methods that are useful to system designers."/>
+    </eAnnotations>
+    <eOperations name="cannot_be_implementationClass" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Classifier.extension_ImplementationClass->isEmpty()"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Classifier" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Classifier"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Refine">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="Specifies a refinement relationship between model elements at different semantic levels, such as analysis and design. The mapping specifies the relationship between the two elements or sets of elements. The mapping may or may not be computable, and it may be unidirectional or bidirectional. Refinement can be used to model transformations from analysis to design and other such changes."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Abstraction" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Abstraction"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Responsibility">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A contract or an obligation of an element in its relationship to other elements."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Usage" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Usage"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Script" eSuperTypes="#//File">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A script file that can be interpreted by a computer system. Subclass of «File»."/>
+    </eAnnotations>
+    <eAnnotations source="duplicates">
+      <contents xsi:type="ecore:EReference" name="base_Artifact" ordered="false" lowerBound="1"
+          eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Artifact">
+        <eAnnotations source="redefines" references="#//File/base_Artifact"/>
+      </contents>
+    </eAnnotations>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Send">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A usage dependency whose client is an operation and whose supplier is a signal, specifying that the client sends the supplier signal."/>
+    </eAnnotations>
+    <eOperations name="client_operation_sends_supplier_signal" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Signal))"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Usage" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Usage"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Service">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A stateless, functional component (computes a value)."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Component" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Component"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Source" eSuperTypes="#//File">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A source file that can be compiled into an executable file. Subclass of «File»."/>
+    </eAnnotations>
+    <eAnnotations source="duplicates">
+      <contents xsi:type="ecore:EReference" name="base_Artifact" ordered="false" lowerBound="1"
+          eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Artifact">
+        <eAnnotations source="redefines" references="#//File/base_Artifact"/>
+      </contents>
+    </eAnnotations>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Specification">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A class that specifies a domain of objects together with the operations applicable to the objects, without defining the physical implementation of those objects. However, it may have attributes and associations. Behavioral specifications for type operations may be expressed using, for example, activity diagrams. An object may have at most one implementation class, however it may conform to multiple different types. See also: «ImplementationClass»."/>
+    </eAnnotations>
+    <eOperations name="cannot_be_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Classifier.extension_Type->isEmpty()"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Classifier" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Classifier"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Subsystem">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A unit of hierarchical decomposition for large systems. A subsystem is commonly instantiated indirectly. Definitions of subsystems vary widely among domains and methods, and it is expected that domain and method profiles will specialize this construct. A subsystem may be defined to have specification and realization elements. See also: «Specification» and «Realization»."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Component" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Component"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Trace">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="Specifies a trace relationship between model elements or sets of model elements that represent the same concept in different models. Traces are mainly used for tracking requirements and changes across models. Since model changes can occur in both directions, the directionality of the dependency can often be ignored. The mapping specifies the relationship between the two, but it is rarely computable and is usually informal."/>
+    </eAnnotations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Abstraction" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Abstraction"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Type">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A class that specifies a domain of objects together with the operations applicable to the objects, without defining the physical implementation of those objects. However, it may have attributes and associations. Behavioral specifications for type operations may be expressed using, for example, activity diagrams. An object may have at most one implementation class, however it may conform to multiple different types. See also: «ImplementationClass»."/>
+    </eAnnotations>
+    <eOperations name="cannot_be_specification" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Class.extension_Specification->isEmpty()"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Class" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Class"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Utility">
+    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+      <details key="documentation" value="A class that has no instances, but rather denotes a named collection of static attributes and static operations, all of which are class-scoped."/>
+    </eAnnotations>
+    <eOperations name="is_utility" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="documentation" value="self.base_Class.feature->forAll(isStatic)"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The chain of diagnostics to which problems are to be appended."/>
+        </eAnnotations>
+      </eParameters>
+      <eParameters name="context">
+        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+          <details key="documentation" value="The cache of context-specific information."/>
+        </eAnnotations>
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Class" ordered="false"
+        lowerBound="1" eType="ecore:EClass platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore#//Class"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.genmodel b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.genmodel
new file mode 100644
index 0000000..507f26b
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.genmodel
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/uml2/2.2.0/GenModel" modelDirectory="/org.eclipse.uml2.uml.profile.l2/src"
+    editDirectory="" editorDirectory="" modelPluginID="org.eclipse.uml2.uml.profile.l2"
+    templateDirectory="/org.eclipse.uml2/templates" runtimeJar="true" dynamicTemplates="true"
+    modelName="L2" modelPluginClass="org.eclipse.uml2.uml.profile.l2.L2Plugin" nonNLSMarkers="true"
+    codeFormatting="true" testsDirectory="" importerID="org.eclipse.uml2.uml.ecore.importer"
+    containmentProxies="true" complianceLevel="5.0" copyrightFields="false" usedGenPackages="platform:/plugin/org.eclipse.uml2.types/model/Types.genmodel#//types platform:/plugin/org.eclipse.uml2.uml/model/UML.genmodel#//uml platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"
+    operationReflection="true" invariantPrefix="validate">
+  <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/importer/org.eclipse.uml2.uml.ecore.importer">
+    <details key="ECORE_TAGGED_VALUES" value="PROCESS"/>
+    <details key="UNION_PROPERTIES" value="PROCESS"/>
+    <details key="DUPLICATE_FEATURES" value="PROCESS"/>
+    <details key="SUBSETTING_PROPERTIES" value="PROCESS"/>
+    <details key="COMMENTS" value="PROCESS"/>
+    <details key="DUPLICATE_FEATURE_INHERITANCE" value="PROCESS"/>
+    <details key="DUPLICATE_OPERATIONS" value="PROCESS"/>
+    <details key="INVARIANT_CONSTRAINTS" value="PROCESS"/>
+    <details key="REDEFINING_PROPERTIES" value="PROCESS"/>
+    <details key="ANNOTATION_DETAILS" value="PROCESS"/>
+    <details key="DUPLICATE_OPERATION_INHERITANCE" value="PROCESS"/>
+    <details key="REDEFINING_OPERATIONS" value="PROCESS"/>
+    <details key="DERIVED_FEATURES" value="PROCESS"/>
+    <details key="OPERATION_BODIES" value="IGNORE"/>
+    <details key="CAMEL_CASE_NAMES" value="IGNORE"/>
+    <details key="SUPER_CLASS_ORDER" value="PROCESS"/>
+  </genAnnotations>
+  <foreignModel>L2.merged.uml</foreignModel>
+  <genPackages xsi:type="genmodel:GenPackage" prefix="L2" basePackage="org.eclipse.uml2.uml.profile"
+      classPackageSuffix="internal.impl" generateExampleClass="false" ecorePackage="L2.ecore#/"
+      operationsPackage="org.eclipse.uml2.uml.profile.l2.internal.operations">
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Auxiliary">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Auxiliary/base_Class"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Call">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Call/base_Usage"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Call/client_and_supplier_are_operations">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Call/client_and_supplier_are_operations/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Call/client_and_supplier_are_operations/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Create">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Create/base_BehavioralFeature"/>
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Create/base_Usage"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Create/client_and_supplier_are_classifiers">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Create/client_and_supplier_are_classifiers/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Create/client_and_supplier_are_classifiers/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Derive">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Derive/base_Abstraction"/>
+      <genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
+          createChild="true" ecoreFeature="ecore:EReference L2.ecore#//Derive/computation"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Destroy">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Destroy/base_BehavioralFeature"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Document"/>
+    <genClasses xsi:type="genmodel:GenClass" image="false" ecoreClass="L2.ecore#//File">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//File/base_Artifact"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Entity">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Entity/base_Component"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Executable"/>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Focus">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Focus/base_Class"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Framework">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Framework/base_Package"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Implement">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Implement/base_Component"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Implement/implements_specification">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Implement/implements_specification/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Implement/implements_specification/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//ImplementationClass">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//ImplementationClass/base_Class"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//ImplementationClass/cannot_be_realization">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//ImplementationClass/cannot_be_realization/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//ImplementationClass/cannot_be_realization/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Instantiate">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Instantiate/base_Usage"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Instantiate/client_and_supplier_are_classifiers">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Instantiate/client_and_supplier_are_classifiers/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Instantiate/client_and_supplier_are_classifiers/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Library"/>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Metaclass">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Metaclass/base_Class"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//ModelLibrary">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//ModelLibrary/base_Package"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Process">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Process/base_Component"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Realization">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Realization/base_Classifier"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Realization/cannot_be_implementationClass">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Realization/cannot_be_implementationClass/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Realization/cannot_be_implementationClass/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Refine">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Refine/base_Abstraction"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Responsibility">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Responsibility/base_Usage"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Script"/>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Send">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Send/base_Usage"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Send/client_operation_sends_supplier_signal">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Send/client_operation_sends_supplier_signal/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Send/client_operation_sends_supplier_signal/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Service">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Service/base_Component"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Source"/>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Specification">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Specification/base_Classifier"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Specification/cannot_be_type">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Specification/cannot_be_type/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Specification/cannot_be_type/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Subsystem">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Subsystem/base_Component"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Trace">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Trace/base_Abstraction"/>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Type">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Type/base_Class"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Type/cannot_be_specification">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Type/cannot_be_specification/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Type/cannot_be_specification/context"/>
+      </genOperations>
+    </genClasses>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="L2.ecore#//Utility">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference L2.ecore#//Utility/base_Class"/>
+      <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="L2.ecore#//Utility/is_utility">
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Utility/is_utility/diagnostics"/>
+        <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="L2.ecore#//Utility/is_utility/context"/>
+      </genOperations>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.merged.uml b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.merged.uml
new file mode 100644
index 0000000..02f5db9
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.merged.uml
@@ -0,0 +1,486 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+  <uml:Profile xmi:id="_ihtF8L5MEeCUg9_01zj7Og" name="L2" metamodelReference="_qhsNEMlJEeCA2KY6CawwCg">
+    <packageImport xmi:id="_qhsNEMlJEeCA2KY6CawwCg">
+      <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+    </packageImport>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhs0IMlJEeCA2KY6CawwCg" name="Abstraction_Derive" memberEnd="_qhs0IclJEeCA2KY6CawwCg _qh0v8slJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhs0IclJEeCA2KY6CawwCg" name="extension_Derive" visibility="public" type="_qh0v8MlJEeCA2KY6CawwCg" aggregation="composite" association="_qhs0IMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhs0IslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhs0I8lJEeCA2KY6CawwCg" name="Abstraction_Refine" memberEnd="_qhs0JMlJEeCA2KY6CawwCg _qh5BZ8lJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhs0JMlJEeCA2KY6CawwCg" name="extension_Refine" visibility="public" type="_qh5BZclJEeCA2KY6CawwCg" aggregation="composite" association="_qhs0I8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhs0JclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhuCQMlJEeCA2KY6CawwCg" name="Abstraction_Trace" memberEnd="_qhuCQclJEeCA2KY6CawwCg _qh6Pi8lJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhuCQclJEeCA2KY6CawwCg" name="extension_Trace" visibility="public" type="_qh6PiclJEeCA2KY6CawwCg" aggregation="composite" association="_qhuCQMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhuCQslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhupUMlJEeCA2KY6CawwCg" name="Artifact_Document" memberEnd="_qhupUclJEeCA2KY6CawwCg _qh1XA8lJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhupUclJEeCA2KY6CawwCg" name="extension_Document" visibility="public" type="_qh1XAMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhupUMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhupUslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhupU8lJEeCA2KY6CawwCg" name="Artifact_Executable" memberEnd="_qhupVMlJEeCA2KY6CawwCg _qh1XCslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhupVMlJEeCA2KY6CawwCg" name="extension_Executable" visibility="public" type="_qh1XB8lJEeCA2KY6CawwCg" aggregation="composite" association="_qhupU8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhupVclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhupVslJEeCA2KY6CawwCg" name="Artifact_File" memberEnd="_qhupV8lJEeCA2KY6CawwCg _qh1XDclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhupV8lJEeCA2KY6CawwCg" name="extension_File" visibility="public" type="_qh1XC8lJEeCA2KY6CawwCg" aggregation="composite" association="_qhupVslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhupWMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhvQYMlJEeCA2KY6CawwCg" name="Artifact_Library" memberEnd="_qhvQYclJEeCA2KY6CawwCg _qh2lLclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhvQYclJEeCA2KY6CawwCg" name="extension_Library" visibility="public" type="_qh2lKslJEeCA2KY6CawwCg" aggregation="composite" association="_qhvQYMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhvQYslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhvQY8lJEeCA2KY6CawwCg" name="Artifact_Script" memberEnd="_qhvQZMlJEeCA2KY6CawwCg _qh5BbslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhvQZMlJEeCA2KY6CawwCg" name="extension_Script" visibility="public" type="_qh5Ba8lJEeCA2KY6CawwCg" aggregation="composite" association="_qhvQY8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhvQZclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhvQZslJEeCA2KY6CawwCg" name="Artifact_Source" memberEnd="_qhvQZ8lJEeCA2KY6CawwCg _qh6PgMlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhvQZ8lJEeCA2KY6CawwCg" name="extension_Source" visibility="public" type="_qh5oeMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhvQZslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhvQaMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhv3cMlJEeCA2KY6CawwCg" name="BehavioralFeature_Create" memberEnd="_qhv3cclJEeCA2KY6CawwCg _qh0I6clJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhv3cclJEeCA2KY6CawwCg" name="extension_Create" visibility="public" type="_qh0I5clJEeCA2KY6CawwCg" aggregation="composite" association="_qhv3cMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhv3cslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhv3c8lJEeCA2KY6CawwCg" name="BehavioralFeature_Destroy" memberEnd="_qhv3dMlJEeCA2KY6CawwCg _qh0v-clJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhv3dMlJEeCA2KY6CawwCg" name="extension_Destroy" visibility="public" type="_qh0v98lJEeCA2KY6CawwCg" aggregation="composite" association="_qhv3c8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhv3dclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhv3dslJEeCA2KY6CawwCg" name="Class_Auxiliary" memberEnd="_qhv3d8lJEeCA2KY6CawwCg _qhzh1clJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhv3d8lJEeCA2KY6CawwCg" name="extension_Auxiliary" visibility="public" type="_qhzh08lJEeCA2KY6CawwCg" aggregation="composite" association="_qhv3dslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhv3eMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhv3eclJEeCA2KY6CawwCg" name="Class_Focus" memberEnd="_qhv3eslJEeCA2KY6CawwCg _qh1-EslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhv3eslJEeCA2KY6CawwCg" name="extension_Focus" visibility="public" type="_qh1-EMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhv3eclJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhv3e8lJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhwegMlJEeCA2KY6CawwCg" name="Class_ImplementationClass" memberEnd="_qhwegclJEeCA2KY6CawwCg _qh2lJMlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhwegclJEeCA2KY6CawwCg" name="extension_ImplementationClass" visibility="public" type="_qh2lIMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhwegMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhwegslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhweg8lJEeCA2KY6CawwCg" name="Class_Metaclass" memberEnd="_qhwehMlJEeCA2KY6CawwCg _qh3MMslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhwehMlJEeCA2KY6CawwCg" name="extension_Metaclass" visibility="public" type="_qh3MMMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhweg8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhwehclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhwehslJEeCA2KY6CawwCg" name="Class_Type" memberEnd="_qhweh8lJEeCA2KY6CawwCg _qh62lMlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhweh8lJEeCA2KY6CawwCg" name="extension_Type" visibility="public" type="_qh62kMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhwehslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhweiMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhxFkMlJEeCA2KY6CawwCg" name="Class_Utility" memberEnd="_qhxFkclJEeCA2KY6CawwCg _qh62mclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhxFkclJEeCA2KY6CawwCg" name="extension_Utility" visibility="public" type="_qh62lclJEeCA2KY6CawwCg" aggregation="composite" association="_qhxFkMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhxFkslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhxFk8lJEeCA2KY6CawwCg" name="Classifier_Realization" memberEnd="_qhxFlMlJEeCA2KY6CawwCg _qh5BZMlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhxFlMlJEeCA2KY6CawwCg" name="extension_Realization" visibility="public" type="_qh5BYMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhxFk8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhxFlclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhxFlslJEeCA2KY6CawwCg" name="Classifier_Specification" memberEnd="_qhxFl8lJEeCA2KY6CawwCg _qh6PhclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhxFl8lJEeCA2KY6CawwCg" name="extension_Specification" visibility="public" type="_qh6PgclJEeCA2KY6CawwCg" aggregation="composite" association="_qhxFlslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhxFmMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhxsoMlJEeCA2KY6CawwCg" name="Component_Entity" memberEnd="_qhxsoclJEeCA2KY6CawwCg _qh1XBslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhxsoclJEeCA2KY6CawwCg" name="extension_Entity" visibility="public" type="_qh1XBMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhxsoMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhxsoslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhxso8lJEeCA2KY6CawwCg" name="Component_Implement" memberEnd="_qhxspMlJEeCA2KY6CawwCg _qh1-GslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhxspMlJEeCA2KY6CawwCg" name="extension_Implement" visibility="public" type="_qh1-FslJEeCA2KY6CawwCg" aggregation="composite" association="_qhxso8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhxspclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhxspslJEeCA2KY6CawwCg" name="Component_Process" memberEnd="_qhxsp8lJEeCA2KY6CawwCg _qh4aVclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhxsp8lJEeCA2KY6CawwCg" name="extension_Process" visibility="public" type="_qh4aU8lJEeCA2KY6CawwCg" aggregation="composite" association="_qhxspslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhxsqMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhyTsMlJEeCA2KY6CawwCg" name="Component_Service" memberEnd="_qhyTsclJEeCA2KY6CawwCg _qh5od8lJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhyTsclJEeCA2KY6CawwCg" name="extension_Service" visibility="public" type="_qh5odclJEeCA2KY6CawwCg" aggregation="composite" association="_qhyTsMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhyTsslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhyTs8lJEeCA2KY6CawwCg" name="Component_Subsystem" memberEnd="_qhyTtMlJEeCA2KY6CawwCg _qh6PiMlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhyTtMlJEeCA2KY6CawwCg" name="extension_Subsystem" visibility="public" type="_qh6PhslJEeCA2KY6CawwCg" aggregation="composite" association="_qhyTs8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhyTtclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhyTtslJEeCA2KY6CawwCg" name="Package_Framework" memberEnd="_qhyTt8lJEeCA2KY6CawwCg _qh1-FclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhyTt8lJEeCA2KY6CawwCg" name="extension_Framework" visibility="public" type="_qh1-E8lJEeCA2KY6CawwCg" aggregation="composite" association="_qhyTtslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhyTuMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhyTuclJEeCA2KY6CawwCg" name="Package_ModelLibrary" memberEnd="_qhyTuslJEeCA2KY6CawwCg _qh4aUslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhyTuslJEeCA2KY6CawwCg" name="extension_ModelLibrary" visibility="public" type="_qh4aUMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhyTuclJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhyTu8lJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhy6wMlJEeCA2KY6CawwCg" name="Usage_Call" memberEnd="_qhy6wclJEeCA2KY6CawwCg _qh0I5MlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhy6wclJEeCA2KY6CawwCg" name="extension_Call" visibility="public" type="_qh0I4MlJEeCA2KY6CawwCg" aggregation="composite" association="_qhy6wMlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhy6wslJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhy6w8lJEeCA2KY6CawwCg" name="Usage_Create" memberEnd="_qhy6xMlJEeCA2KY6CawwCg _qh0I6slJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhy6xMlJEeCA2KY6CawwCg" name="extension_Create" visibility="public" type="_qh0I5clJEeCA2KY6CawwCg" aggregation="composite" association="_qhy6w8lJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhy6xclJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhy6xslJEeCA2KY6CawwCg" name="Usage_Instantiate" memberEnd="_qhy6x8lJEeCA2KY6CawwCg _qh2lKclJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhy6x8lJEeCA2KY6CawwCg" name="extension_Instantiate" visibility="public" type="_qh2lJclJEeCA2KY6CawwCg" aggregation="composite" association="_qhy6xslJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhy6yMlJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhy6yclJEeCA2KY6CawwCg" name="Usage_Responsibility" memberEnd="_qhy6yslJEeCA2KY6CawwCg _qh5BaslJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhy6yslJEeCA2KY6CawwCg" name="extension_Responsibility" visibility="public" type="_qh5BaMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhy6yclJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhy6y8lJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_qhzh0MlJEeCA2KY6CawwCg" name="Usage_Send" memberEnd="_qhzh0clJEeCA2KY6CawwCg _qh5odMlJEeCA2KY6CawwCg">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_qhzh0clJEeCA2KY6CawwCg" name="extension_Send" visibility="public" type="_qh5ocMlJEeCA2KY6CawwCg" aggregation="composite" association="_qhzh0MlJEeCA2KY6CawwCg">
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qhzh0slJEeCA2KY6CawwCg"/>
+      </ownedEnd>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qhzh08lJEeCA2KY6CawwCg" name="Auxiliary">
+      <ownedComment xmi:id="_qhzh1MlJEeCA2KY6CawwCg" annotatedElement="_qhzh08lJEeCA2KY6CawwCg">
+        <body>A class that supports another more central or fundamental class, typically by implementing secondary logic or control flow. The class that the auxiliary supports may be defined explicitly using a Focus class or implicitly as the supplier of dependency relationship whose client is an auxiliary class. Auxiliary classes are typically used together with Focus classes, and are particularly useful for specifying the secondary business logic or control flow of components during design. See also: «Focus».</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qhzh1clJEeCA2KY6CawwCg" name="base_Class" visibility="public" association="_qhv3dslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh0I4MlJEeCA2KY6CawwCg" name="Call">
+      <ownedComment xmi:id="_qh0I4clJEeCA2KY6CawwCg" annotatedElement="_qh0I4MlJEeCA2KY6CawwCg">
+        <body>A usage dependency whose source is an operation and whose target is an operation. The relationship may also be subsumed to the class containing an operation, with the meaning that there exists an operation in the class to which the dependency applies. A call dependency specifies that the source operation or an operation in the source class invokes the target operation or an operation in the target class. A call dependency may connect a source operation to any target operation that is within scope including, but not limited to, operations of the enclosing classifier and operations of other visible classifiers.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh0I4slJEeCA2KY6CawwCg" name="client_and_supplier_are_operations" constrainedElement="_qh0I4MlJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh0I48lJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Operation))</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh0I5MlJEeCA2KY6CawwCg" name="base_Usage" visibility="public" association="_qhy6wMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Usage"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh0I5clJEeCA2KY6CawwCg" name="Create">
+      <ownedComment xmi:id="_qh0I5slJEeCA2KY6CawwCg" annotatedElement="_qh0I5clJEeCA2KY6CawwCg">
+        <body>When applied to a usage dependency, it specifies that the client classifier creates instances of the supplier classifier. When applied to a BehavioralFeature, it specifies that the designated feature creates an instance of the classifier to which the feature is attached.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh0I58lJEeCA2KY6CawwCg" name="client_and_supplier_are_classifiers" constrainedElement="_qh0I5clJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh0I6MlJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Usage->notEmpty() implies (self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier)))</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh0I6clJEeCA2KY6CawwCg" name="base_BehavioralFeature" visibility="public" association="_qhv3cMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#BehavioralFeature"/>
+      </ownedAttribute>
+      <ownedAttribute xmi:id="_qh0I6slJEeCA2KY6CawwCg" name="base_Usage" visibility="public" association="_qhy6w8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Usage"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh0v8MlJEeCA2KY6CawwCg" name="Derive">
+      <ownedComment xmi:id="_qh0v8clJEeCA2KY6CawwCg" annotatedElement="_qh0v8MlJEeCA2KY6CawwCg">
+        <body>Specifies a derivation relationship among model elements that are usually, but not necessarily, of the same type. A derived dependency specifies that the client may be computed from the supplier. The mapping specifies the computation. The client may be implemented for design reasons, such as efficiency, even though it is logically redundant.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh0v8slJEeCA2KY6CawwCg" name="base_Abstraction" visibility="public" association="_qhs0IMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Abstraction"/>
+      </ownedAttribute>
+      <ownedAttribute xmi:id="_qh0v88lJEeCA2KY6CawwCg" name="computation" visibility="public" aggregation="composite">
+        <ownedComment xmi:id="_qh0v9MlJEeCA2KY6CawwCg" annotatedElement="_qh0v88lJEeCA2KY6CawwCg">
+          <body>The specification for computing the derived client element from the derivation supplier element.</body>
+        </ownedComment>
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#ValueSpecification"/>
+        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qh0v9clJEeCA2KY6CawwCg" value="1"/>
+        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_qh0v9slJEeCA2KY6CawwCg" value="1"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh0v98lJEeCA2KY6CawwCg" name="Destroy">
+      <ownedComment xmi:id="_qh0v-MlJEeCA2KY6CawwCg" annotatedElement="_qh0v98lJEeCA2KY6CawwCg">
+        <body>Specifies that the designated feature destroys an instance of the classifier to which the feature is attached.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh0v-clJEeCA2KY6CawwCg" name="base_BehavioralFeature" visibility="public" association="_qhv3c8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#BehavioralFeature"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1XAMlJEeCA2KY6CawwCg" name="Document">
+      <ownedComment xmi:id="_qh1XAclJEeCA2KY6CawwCg" annotatedElement="_qh1XAMlJEeCA2KY6CawwCg">
+        <body>A specific kind of file that is not an «Executable», «Library», «Script» or «Source». Subclass of «File».</body>
+      </ownedComment>
+      <generalization xmi:id="_qh1XAslJEeCA2KY6CawwCg" general="_qh1XC8lJEeCA2KY6CawwCg"/>
+      <ownedAttribute xmi:id="_qh1XA8lJEeCA2KY6CawwCg" name="base_Artifact" visibility="public" redefinedProperty="_qh1XDclJEeCA2KY6CawwCg" association="_qhupUMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1XBMlJEeCA2KY6CawwCg" name="Entity">
+      <ownedComment xmi:id="_qh1XBclJEeCA2KY6CawwCg" annotatedElement="_qh1XBMlJEeCA2KY6CawwCg">
+        <body>A persistent information component representing a business concept.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh1XBslJEeCA2KY6CawwCg" name="base_Component" visibility="public" association="_qhxsoMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Component"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1XB8lJEeCA2KY6CawwCg" name="Executable">
+      <ownedComment xmi:id="_qh1XCMlJEeCA2KY6CawwCg" annotatedElement="_qh1XB8lJEeCA2KY6CawwCg">
+        <body>A program file that can be executed on a computer system. Subclass of «File».</body>
+      </ownedComment>
+      <generalization xmi:id="_qh1XCclJEeCA2KY6CawwCg" general="_qh1XC8lJEeCA2KY6CawwCg"/>
+      <ownedAttribute xmi:id="_qh1XCslJEeCA2KY6CawwCg" name="base_Artifact" visibility="public" redefinedProperty="_qh1XDclJEeCA2KY6CawwCg" association="_qhupU8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1XC8lJEeCA2KY6CawwCg" name="File" isAbstract="true">
+      <ownedComment xmi:id="_qh1XDMlJEeCA2KY6CawwCg" annotatedElement="_qh1XC8lJEeCA2KY6CawwCg">
+        <body>A physical file in the context of the system developed.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh1XDclJEeCA2KY6CawwCg" name="base_Artifact" visibility="public" association="_qhupVslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1-EMlJEeCA2KY6CawwCg" name="Focus">
+      <ownedComment xmi:id="_qh1-EclJEeCA2KY6CawwCg" annotatedElement="_qh1-EMlJEeCA2KY6CawwCg">
+        <body>A class that defines the core logic or control flow for one or more auxiliary classes that support it. Support classes may be defined explicitly using Auxiliary classes or implicitly as clients of dependency relationships whose supplier is a focus class. Focus classes are typically used together with one or more Auxiliary classes, and are particularly useful for specifying the core business logic or control flow of components during design. See also: «Auxiliary».</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh1-EslJEeCA2KY6CawwCg" name="base_Class" visibility="public" association="_qhv3eclJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1-E8lJEeCA2KY6CawwCg" name="Framework">
+      <ownedComment xmi:id="_qh1-FMlJEeCA2KY6CawwCg" annotatedElement="_qh1-E8lJEeCA2KY6CawwCg">
+        <body>A package that contains model elements that specify a reusable architecture for all or part of a system. Frameworks typically include classes, patterns, or templates. When frameworks are specialized for an application domain they are sometimes referred to as application frameworks.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh1-FclJEeCA2KY6CawwCg" name="base_Package" visibility="public" association="_qhyTtslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh1-FslJEeCA2KY6CawwCg" name="Implement">
+      <ownedComment xmi:id="_qh1-F8lJEeCA2KY6CawwCg" annotatedElement="_qh1-FslJEeCA2KY6CawwCg">
+        <body>A component definition that is not intended to have a specification itself. Rather, it is an implementation for a separate «Specification» to which it has a Dependency.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh1-GMlJEeCA2KY6CawwCg" name="implements_specification" constrainedElement="_qh1-FslJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh1-GclJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Component.clientDependency.supplier->select(oclIsKindOf(Classifier)).oclAsType(Classifier).extension_Specificaiton->notEmpty()</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh1-GslJEeCA2KY6CawwCg" name="base_Component" visibility="public" association="_qhxso8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Component"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh2lIMlJEeCA2KY6CawwCg" name="ImplementationClass">
+      <ownedComment xmi:id="_qh2lIclJEeCA2KY6CawwCg" annotatedElement="_qh2lIMlJEeCA2KY6CawwCg">
+        <body>The implementation of a class in some programming language (e.g., C++, Smalltalk, Java) in which an instance may not have more than one class. This is in contrast to Class, for which an instance may have multiple classes at one time and may gain or lose classes over time, and an object (a child of instance) may dynamically have multiple classes. An Implementation class is said to realize a Classifier if it provides all of the operations defined for the Classifier with the same behavior as specified for the Classifier's operations. An Implementation Class may realize a number of different Types. Note that the physical attributes and associations of the Implementation class do not have to be the same as those of any Classifier it realizes and that the Implementation Class may provide methods for its operations in terms of its physical attributes and associations. See also: «Type».</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh2lIslJEeCA2KY6CawwCg" name="cannot_be_realization" constrainedElement="_qh2lIMlJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh2lI8lJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Class.extension_Realization->isEmpty()</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh2lJMlJEeCA2KY6CawwCg" name="base_Class" visibility="public" association="_qhwegMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh2lJclJEeCA2KY6CawwCg" name="Instantiate">
+      <ownedComment xmi:id="_qh2lJslJEeCA2KY6CawwCg" annotatedElement="_qh2lJclJEeCA2KY6CawwCg">
+        <body>A usage dependency among classifiers indicating that operations on the client create instances of the supplier.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh2lJ8lJEeCA2KY6CawwCg" name="client_and_supplier_are_classifiers" constrainedElement="_qh2lJclJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh2lKMlJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier))</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh2lKclJEeCA2KY6CawwCg" name="base_Usage" visibility="public" association="_qhy6xslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Usage"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh2lKslJEeCA2KY6CawwCg" name="Library">
+      <ownedComment xmi:id="_qh2lK8lJEeCA2KY6CawwCg" annotatedElement="_qh2lKslJEeCA2KY6CawwCg">
+        <body>A static or dynamic library file. Subclass of «File».</body>
+      </ownedComment>
+      <generalization xmi:id="_qh2lLMlJEeCA2KY6CawwCg" general="_qh1XC8lJEeCA2KY6CawwCg"/>
+      <ownedAttribute xmi:id="_qh2lLclJEeCA2KY6CawwCg" name="base_Artifact" visibility="public" redefinedProperty="_qh1XDclJEeCA2KY6CawwCg" association="_qhvQYMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh3MMMlJEeCA2KY6CawwCg" name="Metaclass">
+      <ownedComment xmi:id="_qh3MMclJEeCA2KY6CawwCg" annotatedElement="_qh3MMMlJEeCA2KY6CawwCg">
+        <body>A class whose instances are also classes.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh3MMslJEeCA2KY6CawwCg" name="base_Class" visibility="public" association="_qhweg8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh4aUMlJEeCA2KY6CawwCg" name="ModelLibrary">
+      <ownedComment xmi:id="_qh4aUclJEeCA2KY6CawwCg" annotatedElement="_qh4aUMlJEeCA2KY6CawwCg">
+        <body>A package that contains model elements that are intended to be reused by other packages. Model libraries are frequently used in conjunction with applied profiles. This is expressed by defining a dependency between a profile and a model library package, or by defining a model library as contained in a profile package. The classes in a model library are not stereotypes and tagged definitions extending the metamodel. A model library is analogous to a class library in some programming languages. When a model library is defined as a part of a profile, it is imported or deleted with the application or removal of the profile. The profile is implicitly applied to its model library. In the other case, when the model library is defined as an external package imported by a profile, the profile requires that the model library be there in the model at the stage of the profile application. The application or the removal of the profile does not affect the presence of the model library elements.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh4aUslJEeCA2KY6CawwCg" name="base_Package" visibility="public" association="_qhyTuclJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh4aU8lJEeCA2KY6CawwCg" name="Process">
+      <ownedComment xmi:id="_qh4aVMlJEeCA2KY6CawwCg" annotatedElement="_qh4aU8lJEeCA2KY6CawwCg">
+        <body>A transaction based component.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh4aVclJEeCA2KY6CawwCg" name="base_Component" visibility="public" association="_qhxspslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Component"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5BYMlJEeCA2KY6CawwCg" name="Realization">
+      <ownedComment xmi:id="_qh5BYclJEeCA2KY6CawwCg" annotatedElement="_qh5BYMlJEeCA2KY6CawwCg">
+        <body>A classifier that specifies a domain of objects and that also defines the physical implementation of those objects. For example, a Component stereotyped by «realization» will only have realizing Classifiers that implement behavior specified by a separate «Specification» Component. See «specification». This differs from «ImplementationClass» because an «ImplementationClass» is a realization of a Class that can have features such as attributes and methods that are useful to system designers.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh5BYslJEeCA2KY6CawwCg" name="cannot_be_implementationClass" constrainedElement="_qh5BYMlJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh5BY8lJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Classifier.extension_ImplementationClass->isEmpty()</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh5BZMlJEeCA2KY6CawwCg" name="base_Classifier" visibility="public" association="_qhxFk8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Classifier"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5BZclJEeCA2KY6CawwCg" name="Refine">
+      <ownedComment xmi:id="_qh5BZslJEeCA2KY6CawwCg" annotatedElement="_qh5BZclJEeCA2KY6CawwCg">
+        <body>Specifies a refinement relationship between model elements at different semantic levels, such as analysis and design. The mapping specifies the relationship between the two elements or sets of elements. The mapping may or may not be computable, and it may be unidirectional or bidirectional. Refinement can be used to model transformations from analysis to design and other such changes.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh5BZ8lJEeCA2KY6CawwCg" name="base_Abstraction" visibility="public" association="_qhs0I8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Abstraction"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5BaMlJEeCA2KY6CawwCg" name="Responsibility">
+      <ownedComment xmi:id="_qh5BaclJEeCA2KY6CawwCg" annotatedElement="_qh5BaMlJEeCA2KY6CawwCg">
+        <body>A contract or an obligation of an element in its relationship to other elements.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh5BaslJEeCA2KY6CawwCg" name="base_Usage" visibility="public" association="_qhy6yclJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Usage"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5Ba8lJEeCA2KY6CawwCg" name="Script">
+      <ownedComment xmi:id="_qh5BbMlJEeCA2KY6CawwCg" annotatedElement="_qh5Ba8lJEeCA2KY6CawwCg">
+        <body>A script file that can be interpreted by a computer system. Subclass of «File».</body>
+      </ownedComment>
+      <generalization xmi:id="_qh5BbclJEeCA2KY6CawwCg" general="_qh1XC8lJEeCA2KY6CawwCg"/>
+      <ownedAttribute xmi:id="_qh5BbslJEeCA2KY6CawwCg" name="base_Artifact" visibility="public" redefinedProperty="_qh1XDclJEeCA2KY6CawwCg" association="_qhvQY8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5ocMlJEeCA2KY6CawwCg" name="Send">
+      <ownedComment xmi:id="_qh5occlJEeCA2KY6CawwCg" annotatedElement="_qh5ocMlJEeCA2KY6CawwCg">
+        <body>A usage dependency whose client is an operation and whose supplier is a signal, specifying that the client sends the supplier signal.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh5ocslJEeCA2KY6CawwCg" name="client_operation_sends_supplier_signal" constrainedElement="_qh5ocMlJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh5oc8lJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Signal))</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh5odMlJEeCA2KY6CawwCg" name="base_Usage" visibility="public" association="_qhzh0MlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Usage"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5odclJEeCA2KY6CawwCg" name="Service">
+      <ownedComment xmi:id="_qh5odslJEeCA2KY6CawwCg" annotatedElement="_qh5odclJEeCA2KY6CawwCg">
+        <body>A stateless, functional component (computes a value).</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh5od8lJEeCA2KY6CawwCg" name="base_Component" visibility="public" association="_qhyTsMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Component"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh5oeMlJEeCA2KY6CawwCg" name="Source">
+      <ownedComment xmi:id="_qh5oeclJEeCA2KY6CawwCg" annotatedElement="_qh5oeMlJEeCA2KY6CawwCg">
+        <body>A source file that can be compiled into an executable file. Subclass of «File».</body>
+      </ownedComment>
+      <generalization xmi:id="_qh5oeslJEeCA2KY6CawwCg" general="_qh1XC8lJEeCA2KY6CawwCg"/>
+      <ownedAttribute xmi:id="_qh6PgMlJEeCA2KY6CawwCg" name="base_Artifact" visibility="public" redefinedProperty="_qh1XDclJEeCA2KY6CawwCg" association="_qhvQZslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh6PgclJEeCA2KY6CawwCg" name="Specification">
+      <ownedComment xmi:id="_qh6PgslJEeCA2KY6CawwCg" annotatedElement="_qh6PgclJEeCA2KY6CawwCg">
+        <body>A class that specifies a domain of objects together with the operations applicable to the objects, without defining the physical implementation of those objects. However, it may have attributes and associations. Behavioral specifications for type operations may be expressed using, for example, activity diagrams. An object may have at most one implementation class, however it may conform to multiple different types. See also: «ImplementationClass».</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh6Pg8lJEeCA2KY6CawwCg" name="cannot_be_type" constrainedElement="_qh6PgclJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh6PhMlJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Classifier.extension_Type->isEmpty()</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh6PhclJEeCA2KY6CawwCg" name="base_Classifier" visibility="public" association="_qhxFlslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Classifier"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh6PhslJEeCA2KY6CawwCg" name="Subsystem">
+      <ownedComment xmi:id="_qh6Ph8lJEeCA2KY6CawwCg" annotatedElement="_qh6PhslJEeCA2KY6CawwCg">
+        <body>A unit of hierarchical decomposition for large systems. A subsystem is commonly instantiated indirectly. Definitions of subsystems vary widely among domains and methods, and it is expected that domain and method profiles will specialize this construct. A subsystem may be defined to have specification and realization elements. See also: «Specification» and «Realization».</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh6PiMlJEeCA2KY6CawwCg" name="base_Component" visibility="public" association="_qhyTs8lJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Component"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh6PiclJEeCA2KY6CawwCg" name="Trace">
+      <ownedComment xmi:id="_qh6PislJEeCA2KY6CawwCg" annotatedElement="_qh6PiclJEeCA2KY6CawwCg">
+        <body>Specifies a trace relationship between model elements or sets of model elements that represent the same concept in different models. Traces are mainly used for tracking requirements and changes across models. Since model changes can occur in both directions, the directionality of the dependency can often be ignored. The mapping specifies the relationship between the two, but it is rarely computable and is usually informal.</body>
+      </ownedComment>
+      <ownedAttribute xmi:id="_qh6Pi8lJEeCA2KY6CawwCg" name="base_Abstraction" visibility="public" association="_qhuCQMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Abstraction"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh62kMlJEeCA2KY6CawwCg" name="Type">
+      <ownedComment xmi:id="_qh62kclJEeCA2KY6CawwCg" annotatedElement="_qh62kMlJEeCA2KY6CawwCg">
+        <body>A class that specifies a domain of objects together with the operations applicable to the objects, without defining the physical implementation of those objects. However, it may have attributes and associations. Behavioral specifications for type operations may be expressed using, for example, activity diagrams. An object may have at most one implementation class, however it may conform to multiple different types. See also: «ImplementationClass».</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh62kslJEeCA2KY6CawwCg" name="cannot_be_specification" constrainedElement="_qh62kMlJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh62k8lJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Class.extension_Specification->isEmpty()</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh62lMlJEeCA2KY6CawwCg" name="base_Class" visibility="public" association="_qhwehslJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_qh62lclJEeCA2KY6CawwCg" name="Utility">
+      <ownedComment xmi:id="_qh62lslJEeCA2KY6CawwCg" annotatedElement="_qh62lclJEeCA2KY6CawwCg">
+        <body>A class that has no instances, but rather denotes a named collection of static attributes and static operations, all of which are class-scoped.</body>
+      </ownedComment>
+      <ownedRule xmi:id="_qh62l8lJEeCA2KY6CawwCg" name="is_utility" constrainedElement="_qh62lclJEeCA2KY6CawwCg">
+        <specification xmi:type="uml:OpaqueExpression" xmi:id="_qh62mMlJEeCA2KY6CawwCg">
+          <language>OCL</language>
+          <body>self.base_Class.feature->forAll(isStatic)</body>
+        </specification>
+      </ownedRule>
+      <ownedAttribute xmi:id="_qh62mclJEeCA2KY6CawwCg" name="base_Class" visibility="public" association="_qhxFkMlJEeCA2KY6CawwCg">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+      </ownedAttribute>
+    </packagedElement>
+    <profileApplication xmi:id="_6ryEUL5MEeCUg9_01zj7Og">
+      <eAnnotations xmi:id="_6ryrYL5MEeCUg9_01zj7Og" source="http://www.eclipse.org/uml2/2.0.0/UML">
+        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+      </eAnnotations>
+      <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+    </profileApplication>
+  </uml:Profile>
+  <Ecore:EPackage xmi:id="_7-6gIL5MEeCUg9_01zj7Og" base_Package="_ihtF8L5MEeCUg9_01zj7Og" packageName="l2" nsPrefix="l2" nsURI="http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2" basePackage="org.eclipse.uml2.uml.profile" prefix="L2"/>
+</xmi:XMI>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.uml b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.uml
new file mode 100644
index 0000000..ca43239
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/model/L2.uml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+  <uml:Profile xmi:id="_ihtF8L5MEeCUg9_01zj7Og" name="L2">
+    <packageMerge xmi:id="_pUgPcL5MEeCUg9_01zj7Og">
+      <mergedPackage xmi:type="uml:Profile" href="../../org.eclipse.uml2/model/StandardProfileL2.xmi#_0"/>
+    </packageMerge>
+    <profileApplication xmi:id="_6ryEUL5MEeCUg9_01zj7Og">
+      <eAnnotations xmi:id="_6ryrYL5MEeCUg9_01zj7Og" source="http://www.eclipse.org/uml2/2.0.0/UML">
+        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+      </eAnnotations>
+      <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+    </profileApplication>
+  </uml:Profile>
+  <Ecore:EPackage xmi:id="_7-6gIL5MEeCUg9_01zj7Og" base_Package="_ihtF8L5MEeCUg9_01zj7Og" packageName="l2" nsPrefix="l2" nsURI="http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2" basePackage="org.eclipse.uml2.uml.profile" prefix="L2"/>
+</xmi:XMI>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/plugin.properties b/plugins/org.eclipse.uml2.uml.profile.l2/plugin.properties
new file mode 100644
index 0000000..f82852b
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/plugin.properties
@@ -0,0 +1,14 @@
+# Copyright (c) 2011 CEA and others.
+# All rights reserved.   This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   CEA - initial API and implementation
+#
+
+# NLS_MESSAGEFORMAT_VAR
+
+pluginName = UML2 Standard L2 Profile
+providerName = Eclipse Modeling Project
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/plugin.xml b/plugins/org.eclipse.uml2.uml.profile.l2/plugin.xml
new file mode 100644
index 0000000..47abfcd
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2011 CEA and others.
+ All rights reserved.   This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+   CEA - initial API and implementation
+
+-->
+
+<plugin>
+
+  <extension point="org.eclipse.emf.ecore.generated_package">
+    <package
+       uri="http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2"
+       class="org.eclipse.uml2.uml.profile.l2.L2Package"
+       genModel="model/L2.genmodel"/>
+  </extension>
+
+  <extension point="org.eclipse.uml2.uml.generated_package">
+    <profile
+       uri="http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2"
+       location="pathmap://UML_PROFILES/StandardL2.profile.uml#_0"/> 
+  </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Auxiliary.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Auxiliary.java
new file mode 100644
index 0000000..e486679
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Auxiliary.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Auxiliary</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A class that supports another more central or fundamental class, typically by implementing secondary logic or control flow. The class that the auxiliary supports may be defined explicitly using a Focus class or implicitly as the supplier of dependency relationship whose client is an auxiliary class. Auxiliary classes are typically used together with Focus classes, and are particularly useful for specifying the secondary business logic or control flow of components during design. See also: «Focus».
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Auxiliary#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getAuxiliary()
+ * @model
+ * @generated
+ */
+public interface Auxiliary
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Class</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Class</em>' reference.
+	 * @see #setBase_Class(org.eclipse.uml2.uml.Class)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getAuxiliary_Base_Class()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Class getBase_Class();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Auxiliary#getBase_Class <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Class</em>' reference.
+	 * @see #getBase_Class()
+	 * @generated
+	 */
+	void setBase_Class(org.eclipse.uml2.uml.Class value);
+
+} // Auxiliary
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Call.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Call.java
new file mode 100644
index 0000000..342a7c7
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Call.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Usage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Call</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A usage dependency whose source is an operation and whose target is an operation. The relationship may also be subsumed to the class containing an operation, with the meaning that there exists an operation in the class to which the dependency applies. A call dependency specifies that the source operation or an operation in the source class invokes the target operation or an operation in the target class. A call dependency may connect a source operation to any target operation that is within scope including, but not limited to, operations of the enclosing classifier and operations of other visible classifiers.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Call#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getCall()
+ * @model
+ * @generated
+ */
+public interface Call
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Usage</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Usage</em>' reference.
+	 * @see #setBase_Usage(Usage)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getCall_Base_Usage()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Usage getBase_Usage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Call#getBase_Usage <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Usage</em>' reference.
+	 * @see #getBase_Usage()
+	 * @generated
+	 */
+	void setBase_Usage(Usage value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Operation))
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateClientAndSupplierAreOperations(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // Call
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Create.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Create.java
new file mode 100644
index 0000000..ec06ce2
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Create.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Usage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Create</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * When applied to a usage dependency, it specifies that the client classifier creates instances of the supplier classifier. When applied to a BehavioralFeature, it specifies that the designated feature creates an instance of the classifier to which the feature is attached.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Create#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}</li>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Create#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getCreate()
+ * @model
+ * @generated
+ */
+public interface Create
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Behavioral Feature</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Behavioral Feature</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Behavioral Feature</em>' reference.
+	 * @see #setBase_BehavioralFeature(BehavioralFeature)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getCreate_Base_BehavioralFeature()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	BehavioralFeature getBase_BehavioralFeature();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Create#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Behavioral Feature</em>' reference.
+	 * @see #getBase_BehavioralFeature()
+	 * @generated
+	 */
+	void setBase_BehavioralFeature(BehavioralFeature value);
+
+	/**
+	 * Returns the value of the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Usage</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Usage</em>' reference.
+	 * @see #setBase_Usage(Usage)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getCreate_Base_Usage()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Usage getBase_Usage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Create#getBase_Usage <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Usage</em>' reference.
+	 * @see #getBase_Usage()
+	 * @generated
+	 */
+	void setBase_Usage(Usage value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage->notEmpty() implies (self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier)))
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateClientAndSupplierAreClassifiers(
+			DiagnosticChain diagnostics, Map<Object, Object> context);
+
+} // Create
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Derive.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Derive.java
new file mode 100644
index 0000000..5b15ecf
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Derive.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Abstraction;
+import org.eclipse.uml2.uml.ValueSpecification;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Derive</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * Specifies a derivation relationship among model elements that are usually, but not necessarily, of the same type. A derived dependency specifies that the client may be computed from the supplier. The mapping specifies the computation. The client may be implemented for design reasons, such as efficiency, even though it is logically redundant.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Derive#getBase_Abstraction <em>Base Abstraction</em>}</li>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Derive#getComputation <em>Computation</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getDerive()
+ * @model
+ * @generated
+ */
+public interface Derive
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Abstraction</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Abstraction</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Abstraction</em>' reference.
+	 * @see #setBase_Abstraction(Abstraction)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getDerive_Base_Abstraction()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Abstraction getBase_Abstraction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Derive#getBase_Abstraction <em>Base Abstraction</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Abstraction</em>' reference.
+	 * @see #getBase_Abstraction()
+	 * @generated
+	 */
+	void setBase_Abstraction(Abstraction value);
+
+	/**
+	 * Returns the value of the '<em><b>Computation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * The specification for computing the derived client element from the derivation supplier element.
+	 * <!-- end-model-doc -->
+	 * @return the value of the '<em>Computation</em>' containment reference.
+	 * @see #setComputation(ValueSpecification)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getDerive_Computation()
+	 * @model containment="true" resolveProxies="true" required="true" ordered="false"
+	 * @generated
+	 */
+	ValueSpecification getComputation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Derive#getComputation <em>Computation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Computation</em>' containment reference.
+	 * @see #getComputation()
+	 * @generated
+	 */
+	void setComputation(ValueSpecification value);
+
+} // Derive
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Destroy.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Destroy.java
new file mode 100644
index 0000000..6a73255
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Destroy.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.BehavioralFeature;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Destroy</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * Specifies that the designated feature destroys an instance of the classifier to which the feature is attached.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Destroy#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getDestroy()
+ * @model
+ * @generated
+ */
+public interface Destroy
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Behavioral Feature</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Behavioral Feature</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Behavioral Feature</em>' reference.
+	 * @see #setBase_BehavioralFeature(BehavioralFeature)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getDestroy_Base_BehavioralFeature()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	BehavioralFeature getBase_BehavioralFeature();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Destroy#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Behavioral Feature</em>' reference.
+	 * @see #getBase_BehavioralFeature()
+	 * @generated
+	 */
+	void setBase_BehavioralFeature(BehavioralFeature value);
+
+} // Destroy
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Document.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Document.java
new file mode 100644
index 0000000..10758e9
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Document.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Document</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A specific kind of file that is not an «Executable», «Library», «Script» or «Source». Subclass of «File».
+ * <!-- end-model-doc -->
+ *
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getDocument()
+ * @model
+ * @generated
+ */
+public interface Document
+		extends File {
+} // Document
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Entity.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Entity.java
new file mode 100644
index 0000000..95f464a
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Entity.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Component;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Entity</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A persistent information component representing a business concept.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Entity#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getEntity()
+ * @model
+ * @generated
+ */
+public interface Entity
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Component</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Component</em>' reference.
+	 * @see #setBase_Component(Component)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getEntity_Base_Component()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Component getBase_Component();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Entity#getBase_Component <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Component</em>' reference.
+	 * @see #getBase_Component()
+	 * @generated
+	 */
+	void setBase_Component(Component value);
+
+} // Entity
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Executable.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Executable.java
new file mode 100644
index 0000000..3f0b7ce
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Executable.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Executable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A program file that can be executed on a computer system. Subclass of «File».
+ * <!-- end-model-doc -->
+ *
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getExecutable()
+ * @model
+ * @generated
+ */
+public interface Executable
+		extends File {
+} // Executable
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/File.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/File.java
new file mode 100644
index 0000000..b42e457
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/File.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Artifact;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>File</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A physical file in the context of the system developed.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.File#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getFile()
+ * @model abstract="true"
+ * @generated
+ */
+public interface File
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Artifact</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Artifact</em>' reference.
+	 * @see #setBase_Artifact(Artifact)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getFile_Base_Artifact()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Artifact getBase_Artifact();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.File#getBase_Artifact <em>Base Artifact</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Artifact</em>' reference.
+	 * @see #getBase_Artifact()
+	 * @generated
+	 */
+	void setBase_Artifact(Artifact value);
+
+} // File
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Focus.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Focus.java
new file mode 100644
index 0000000..e440f12
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Focus.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Focus</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A class that defines the core logic or control flow for one or more auxiliary classes that support it. Support classes may be defined explicitly using Auxiliary classes or implicitly as clients of dependency relationships whose supplier is a focus class. Focus classes are typically used together with one or more Auxiliary classes, and are particularly useful for specifying the core business logic or control flow of components during design. See also: «Auxiliary».
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Focus#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getFocus()
+ * @model
+ * @generated
+ */
+public interface Focus
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Class</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Class</em>' reference.
+	 * @see #setBase_Class(org.eclipse.uml2.uml.Class)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getFocus_Base_Class()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Class getBase_Class();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Focus#getBase_Class <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Class</em>' reference.
+	 * @see #getBase_Class()
+	 * @generated
+	 */
+	void setBase_Class(org.eclipse.uml2.uml.Class value);
+
+} // Focus
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Framework.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Framework.java
new file mode 100644
index 0000000..e2e5903
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Framework.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Framework</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A package that contains model elements that specify a reusable architecture for all or part of a system. Frameworks typically include classes, patterns, or templates. When frameworks are specialized for an application domain they are sometimes referred to as application frameworks.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Framework#getBase_Package <em>Base Package</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getFramework()
+ * @model
+ * @generated
+ */
+public interface Framework
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Package</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Package</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Package</em>' reference.
+	 * @see #setBase_Package(org.eclipse.uml2.uml.Package)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getFramework_Base_Package()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Package getBase_Package();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Framework#getBase_Package <em>Base Package</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Package</em>' reference.
+	 * @see #getBase_Package()
+	 * @generated
+	 */
+	void setBase_Package(org.eclipse.uml2.uml.Package value);
+
+} // Framework
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Implement.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Implement.java
new file mode 100644
index 0000000..9e0be4f
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Implement.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Component;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Implement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A component definition that is not intended to have a specification itself. Rather, it is an implementation for a separate «Specification» to which it has a Dependency.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Implement#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getImplement()
+ * @model
+ * @generated
+ */
+public interface Implement
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Component</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Component</em>' reference.
+	 * @see #setBase_Component(Component)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getImplement_Base_Component()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Component getBase_Component();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Implement#getBase_Component <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Component</em>' reference.
+	 * @see #getBase_Component()
+	 * @generated
+	 */
+	void setBase_Component(Component value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Component.clientDependency.supplier->select(oclIsKindOf(Classifier)).oclAsType(Classifier).extension_Specificaiton->notEmpty()
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateImplementsSpecification(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // Implement
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/ImplementationClass.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/ImplementationClass.java
new file mode 100644
index 0000000..ad5b1e5
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/ImplementationClass.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Implementation Class</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * The implementation of a class in some programming language (e.g., C++, Smalltalk, Java) in which an instance may not have more than one class. This is in contrast to Class, for which an instance may have multiple classes at one time and may gain or lose classes over time, and an object (a child of instance) may dynamically have multiple classes. An Implementation class is said to realize a Classifier if it provides all of the operations defined for the Classifier with the same behavior as specified for the Classifier's operations. An Implementation Class may realize a number of different Types. Note that the physical attributes and associations of the Implementation class do not have to be the same as those of any Classifier it realizes and that the Implementation Class may provide methods for its operations in terms of its physical attributes and associations. See also: «Type».
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getImplementationClass()
+ * @model
+ * @generated
+ */
+public interface ImplementationClass
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Class</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Class</em>' reference.
+	 * @see #setBase_Class(org.eclipse.uml2.uml.Class)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getImplementationClass_Base_Class()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Class getBase_Class();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass#getBase_Class <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Class</em>' reference.
+	 * @see #getBase_Class()
+	 * @generated
+	 */
+	void setBase_Class(org.eclipse.uml2.uml.Class value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Class.extension_Realization->isEmpty()
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateCannotBeRealization(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // ImplementationClass
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Instantiate.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Instantiate.java
new file mode 100644
index 0000000..d728610
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Instantiate.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Usage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Instantiate</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A usage dependency among classifiers indicating that operations on the client create instances of the supplier.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Instantiate#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getInstantiate()
+ * @model
+ * @generated
+ */
+public interface Instantiate
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Usage</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Usage</em>' reference.
+	 * @see #setBase_Usage(Usage)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getInstantiate_Base_Usage()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Usage getBase_Usage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Instantiate#getBase_Usage <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Usage</em>' reference.
+	 * @see #getBase_Usage()
+	 * @generated
+	 */
+	void setBase_Usage(Usage value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier))
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateClientAndSupplierAreClassifiers(
+			DiagnosticChain diagnostics, Map<Object, Object> context);
+
+} // Instantiate
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Factory.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Factory.java
new file mode 100644
index 0000000..03dd7d3
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Factory.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package
+ * @generated
+ */
+public interface L2Factory
+		extends EFactory {
+
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	L2Factory eINSTANCE = org.eclipse.uml2.uml.profile.l2.internal.impl.L2FactoryImpl
+		.init();
+
+	/**
+	 * Returns a new object of class '<em>Auxiliary</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Auxiliary</em>'.
+	 * @generated
+	 */
+	Auxiliary createAuxiliary();
+
+	/**
+	 * Returns a new object of class '<em>Call</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Call</em>'.
+	 * @generated
+	 */
+	Call createCall();
+
+	/**
+	 * Returns a new object of class '<em>Create</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Create</em>'.
+	 * @generated
+	 */
+	Create createCreate();
+
+	/**
+	 * Returns a new object of class '<em>Derive</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Derive</em>'.
+	 * @generated
+	 */
+	Derive createDerive();
+
+	/**
+	 * Returns a new object of class '<em>Destroy</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Destroy</em>'.
+	 * @generated
+	 */
+	Destroy createDestroy();
+
+	/**
+	 * Returns a new object of class '<em>Document</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Document</em>'.
+	 * @generated
+	 */
+	Document createDocument();
+
+	/**
+	 * Returns a new object of class '<em>Entity</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Entity</em>'.
+	 * @generated
+	 */
+	Entity createEntity();
+
+	/**
+	 * Returns a new object of class '<em>Executable</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Executable</em>'.
+	 * @generated
+	 */
+	Executable createExecutable();
+
+	/**
+	 * Returns a new object of class '<em>Focus</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Focus</em>'.
+	 * @generated
+	 */
+	Focus createFocus();
+
+	/**
+	 * Returns a new object of class '<em>Framework</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Framework</em>'.
+	 * @generated
+	 */
+	Framework createFramework();
+
+	/**
+	 * Returns a new object of class '<em>Implement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Implement</em>'.
+	 * @generated
+	 */
+	Implement createImplement();
+
+	/**
+	 * Returns a new object of class '<em>Implementation Class</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Implementation Class</em>'.
+	 * @generated
+	 */
+	ImplementationClass createImplementationClass();
+
+	/**
+	 * Returns a new object of class '<em>Instantiate</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Instantiate</em>'.
+	 * @generated
+	 */
+	Instantiate createInstantiate();
+
+	/**
+	 * Returns a new object of class '<em>Library</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Library</em>'.
+	 * @generated
+	 */
+	Library createLibrary();
+
+	/**
+	 * Returns a new object of class '<em>Metaclass</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Metaclass</em>'.
+	 * @generated
+	 */
+	Metaclass createMetaclass();
+
+	/**
+	 * Returns a new object of class '<em>Model Library</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Model Library</em>'.
+	 * @generated
+	 */
+	ModelLibrary createModelLibrary();
+
+	/**
+	 * Returns a new object of class '<em>Process</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Process</em>'.
+	 * @generated
+	 */
+	Process createProcess();
+
+	/**
+	 * Returns a new object of class '<em>Realization</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Realization</em>'.
+	 * @generated
+	 */
+	Realization createRealization();
+
+	/**
+	 * Returns a new object of class '<em>Refine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Refine</em>'.
+	 * @generated
+	 */
+	Refine createRefine();
+
+	/**
+	 * Returns a new object of class '<em>Responsibility</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Responsibility</em>'.
+	 * @generated
+	 */
+	Responsibility createResponsibility();
+
+	/**
+	 * Returns a new object of class '<em>Script</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Script</em>'.
+	 * @generated
+	 */
+	Script createScript();
+
+	/**
+	 * Returns a new object of class '<em>Send</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Send</em>'.
+	 * @generated
+	 */
+	Send createSend();
+
+	/**
+	 * Returns a new object of class '<em>Service</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Service</em>'.
+	 * @generated
+	 */
+	Service createService();
+
+	/**
+	 * Returns a new object of class '<em>Source</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Source</em>'.
+	 * @generated
+	 */
+	Source createSource();
+
+	/**
+	 * Returns a new object of class '<em>Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Specification</em>'.
+	 * @generated
+	 */
+	Specification createSpecification();
+
+	/**
+	 * Returns a new object of class '<em>Subsystem</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Subsystem</em>'.
+	 * @generated
+	 */
+	Subsystem createSubsystem();
+
+	/**
+	 * Returns a new object of class '<em>Trace</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Trace</em>'.
+	 * @generated
+	 */
+	Trace createTrace();
+
+	/**
+	 * Returns a new object of class '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Type</em>'.
+	 * @generated
+	 */
+	Type createType();
+
+	/**
+	 * Returns a new object of class '<em>Utility</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Utility</em>'.
+	 * @generated
+	 */
+	Utility createUtility();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	L2Package getL2Package();
+
+} //L2Factory
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Package.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Package.java
new file mode 100644
index 0000000..619127a
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Package.java
@@ -0,0 +1,2635 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.uml2.uml.profile.l2.L2Factory
+ * @model kind="package"
+ * @generated
+ */
+public interface L2Package
+		extends EPackage {
+
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "l2"; //$NON-NLS-1$
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2"; //$NON-NLS-1$
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "l2"; //$NON-NLS-1$
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	L2Package eINSTANCE = org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl
+		.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.AuxiliaryImpl <em>Auxiliary</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.AuxiliaryImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getAuxiliary()
+	 * @generated
+	 */
+	int AUXILIARY = 0;
+
+	/**
+	 * The feature id for the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUXILIARY__BASE_CLASS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Auxiliary</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUXILIARY_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Auxiliary</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AUXILIARY_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CallImpl <em>Call</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.CallImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getCall()
+	 * @generated
+	 */
+	int CALL = 1;
+
+	/**
+	 * The feature id for the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CALL__BASE_USAGE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Call</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CALL_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Client And Supplier Are Operations</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CALL___VALIDATE_CLIENT_AND_SUPPLIER_ARE_OPERATIONS__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Call</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CALL_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CreateImpl <em>Create</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.CreateImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getCreate()
+	 * @generated
+	 */
+	int CREATE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Base Behavioral Feature</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CREATE__BASE_BEHAVIORAL_FEATURE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CREATE__BASE_USAGE = 1;
+
+	/**
+	 * The number of structural features of the '<em>Create</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CREATE_FEATURE_COUNT = 2;
+
+	/**
+	 * The operation id for the '<em>Validate Client And Supplier Are Classifiers</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CREATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Create</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CREATE_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DeriveImpl <em>Derive</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.DeriveImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getDerive()
+	 * @generated
+	 */
+	int DERIVE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Base Abstraction</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DERIVE__BASE_ABSTRACTION = 0;
+
+	/**
+	 * The feature id for the '<em><b>Computation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DERIVE__COMPUTATION = 1;
+
+	/**
+	 * The number of structural features of the '<em>Derive</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DERIVE_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Derive</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DERIVE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DestroyImpl <em>Destroy</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.DestroyImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getDestroy()
+	 * @generated
+	 */
+	int DESTROY = 4;
+
+	/**
+	 * The feature id for the '<em><b>Base Behavioral Feature</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DESTROY__BASE_BEHAVIORAL_FEATURE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Destroy</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DESTROY_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Destroy</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DESTROY_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FileImpl <em>File</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.FileImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getFile()
+	 * @generated
+	 */
+	int FILE = 6;
+
+	/**
+	 * The feature id for the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FILE__BASE_ARTIFACT = 0;
+
+	/**
+	 * The number of structural features of the '<em>File</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FILE_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>File</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FILE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DocumentImpl <em>Document</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.DocumentImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getDocument()
+	 * @generated
+	 */
+	int DOCUMENT = 5;
+
+	/**
+	 * The feature id for the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DOCUMENT__BASE_ARTIFACT = FILE__BASE_ARTIFACT;
+
+	/**
+	 * The number of structural features of the '<em>Document</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DOCUMENT_FEATURE_COUNT = FILE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Document</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DOCUMENT_OPERATION_COUNT = FILE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.EntityImpl <em>Entity</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.EntityImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getEntity()
+	 * @generated
+	 */
+	int ENTITY = 7;
+
+	/**
+	 * The feature id for the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY__BASE_COMPONENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Entity</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Entity</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ExecutableImpl <em>Executable</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ExecutableImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getExecutable()
+	 * @generated
+	 */
+	int EXECUTABLE = 8;
+
+	/**
+	 * The feature id for the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTABLE__BASE_ARTIFACT = FILE__BASE_ARTIFACT;
+
+	/**
+	 * The number of structural features of the '<em>Executable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTABLE_FEATURE_COUNT = FILE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Executable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTABLE_OPERATION_COUNT = FILE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FocusImpl <em>Focus</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.FocusImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getFocus()
+	 * @generated
+	 */
+	int FOCUS = 9;
+
+	/**
+	 * The feature id for the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOCUS__BASE_CLASS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Focus</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOCUS_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Focus</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOCUS_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FrameworkImpl <em>Framework</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.FrameworkImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getFramework()
+	 * @generated
+	 */
+	int FRAMEWORK = 10;
+
+	/**
+	 * The feature id for the '<em><b>Base Package</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FRAMEWORK__BASE_PACKAGE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Framework</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FRAMEWORK_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Framework</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FRAMEWORK_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementImpl <em>Implement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getImplement()
+	 * @generated
+	 */
+	int IMPLEMENT = 11;
+
+	/**
+	 * The feature id for the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENT__BASE_COMPONENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Implement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENT_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Implements Specification</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENT___VALIDATE_IMPLEMENTS_SPECIFICATION__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Implement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENT_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementationClassImpl <em>Implementation Class</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementationClassImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getImplementationClass()
+	 * @generated
+	 */
+	int IMPLEMENTATION_CLASS = 12;
+
+	/**
+	 * The feature id for the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENTATION_CLASS__BASE_CLASS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Implementation Class</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENTATION_CLASS_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Cannot Be Realization</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENTATION_CLASS___VALIDATE_CANNOT_BE_REALIZATION__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Implementation Class</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMPLEMENTATION_CLASS_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.InstantiateImpl <em>Instantiate</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.InstantiateImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getInstantiate()
+	 * @generated
+	 */
+	int INSTANTIATE = 13;
+
+	/**
+	 * The feature id for the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATE__BASE_USAGE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Instantiate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATE_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Client And Supplier Are Classifiers</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Instantiate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATE_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.LibraryImpl <em>Library</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.LibraryImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getLibrary()
+	 * @generated
+	 */
+	int LIBRARY = 14;
+
+	/**
+	 * The feature id for the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LIBRARY__BASE_ARTIFACT = FILE__BASE_ARTIFACT;
+
+	/**
+	 * The number of structural features of the '<em>Library</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LIBRARY_FEATURE_COUNT = FILE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Library</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LIBRARY_OPERATION_COUNT = FILE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.MetaclassImpl <em>Metaclass</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.MetaclassImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getMetaclass()
+	 * @generated
+	 */
+	int METACLASS = 15;
+
+	/**
+	 * The feature id for the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int METACLASS__BASE_CLASS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Metaclass</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int METACLASS_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Metaclass</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int METACLASS_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ModelLibraryImpl <em>Model Library</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ModelLibraryImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getModelLibrary()
+	 * @generated
+	 */
+	int MODEL_LIBRARY = 16;
+
+	/**
+	 * The feature id for the '<em><b>Base Package</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_LIBRARY__BASE_PACKAGE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Model Library</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_LIBRARY_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Model Library</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_LIBRARY_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ProcessImpl <em>Process</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ProcessImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getProcess()
+	 * @generated
+	 */
+	int PROCESS = 17;
+
+	/**
+	 * The feature id for the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCESS__BASE_COMPONENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Process</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCESS_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Process</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCESS_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.RealizationImpl <em>Realization</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.RealizationImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getRealization()
+	 * @generated
+	 */
+	int REALIZATION = 18;
+
+	/**
+	 * The feature id for the '<em><b>Base Classifier</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REALIZATION__BASE_CLASSIFIER = 0;
+
+	/**
+	 * The number of structural features of the '<em>Realization</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REALIZATION_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Cannot Be Implementation Class</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REALIZATION___VALIDATE_CANNOT_BE_IMPLEMENTATION_CLASS__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Realization</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REALIZATION_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.RefineImpl <em>Refine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.RefineImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getRefine()
+	 * @generated
+	 */
+	int REFINE = 19;
+
+	/**
+	 * The feature id for the '<em><b>Base Abstraction</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REFINE__BASE_ABSTRACTION = 0;
+
+	/**
+	 * The number of structural features of the '<em>Refine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REFINE_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Refine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REFINE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ResponsibilityImpl <em>Responsibility</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ResponsibilityImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getResponsibility()
+	 * @generated
+	 */
+	int RESPONSIBILITY = 20;
+
+	/**
+	 * The feature id for the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSIBILITY__BASE_USAGE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Responsibility</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSIBILITY_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Responsibility</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSIBILITY_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ScriptImpl <em>Script</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ScriptImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getScript()
+	 * @generated
+	 */
+	int SCRIPT = 21;
+
+	/**
+	 * The feature id for the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SCRIPT__BASE_ARTIFACT = FILE__BASE_ARTIFACT;
+
+	/**
+	 * The number of structural features of the '<em>Script</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SCRIPT_FEATURE_COUNT = FILE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Script</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SCRIPT_OPERATION_COUNT = FILE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SendImpl <em>Send</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SendImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSend()
+	 * @generated
+	 */
+	int SEND = 22;
+
+	/**
+	 * The feature id for the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SEND__BASE_USAGE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Send</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SEND_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Client Operation Sends Supplier Signal</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SEND___VALIDATE_CLIENT_OPERATION_SENDS_SUPPLIER_SIGNAL__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Send</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SEND_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ServiceImpl <em>Service</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ServiceImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getService()
+	 * @generated
+	 */
+	int SERVICE = 23;
+
+	/**
+	 * The feature id for the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SERVICE__BASE_COMPONENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Service</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SERVICE_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Service</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SERVICE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SourceImpl <em>Source</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SourceImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSource()
+	 * @generated
+	 */
+	int SOURCE = 24;
+
+	/**
+	 * The feature id for the '<em><b>Base Artifact</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SOURCE__BASE_ARTIFACT = FILE__BASE_ARTIFACT;
+
+	/**
+	 * The number of structural features of the '<em>Source</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SOURCE_FEATURE_COUNT = FILE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Source</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SOURCE_OPERATION_COUNT = FILE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SpecificationImpl <em>Specification</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SpecificationImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSpecification()
+	 * @generated
+	 */
+	int SPECIFICATION = 25;
+
+	/**
+	 * The feature id for the '<em><b>Base Classifier</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SPECIFICATION__BASE_CLASSIFIER = 0;
+
+	/**
+	 * The number of structural features of the '<em>Specification</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SPECIFICATION_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Cannot Be Type</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SPECIFICATION___VALIDATE_CANNOT_BE_TYPE__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Specification</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SPECIFICATION_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SubsystemImpl <em>Subsystem</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SubsystemImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSubsystem()
+	 * @generated
+	 */
+	int SUBSYSTEM = 26;
+
+	/**
+	 * The feature id for the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SUBSYSTEM__BASE_COMPONENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Subsystem</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SUBSYSTEM_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Subsystem</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SUBSYSTEM_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.TraceImpl <em>Trace</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.TraceImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getTrace()
+	 * @generated
+	 */
+	int TRACE = 27;
+
+	/**
+	 * The feature id for the '<em><b>Base Abstraction</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRACE__BASE_ABSTRACTION = 0;
+
+	/**
+	 * The number of structural features of the '<em>Trace</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRACE_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Trace</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRACE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.TypeImpl <em>Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.TypeImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getType()
+	 * @generated
+	 */
+	int TYPE = 28;
+
+	/**
+	 * The feature id for the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE__BASE_CLASS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Cannot Be Specification</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE___VALIDATE_CANNOT_BE_SPECIFICATION__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE_OPERATION_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.UtilityImpl <em>Utility</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.UtilityImpl
+	 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getUtility()
+	 * @generated
+	 */
+	int UTILITY = 29;
+
+	/**
+	 * The feature id for the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UTILITY__BASE_CLASS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Utility</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UTILITY_FEATURE_COUNT = 1;
+
+	/**
+	 * The operation id for the '<em>Validate Is Utility</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UTILITY___VALIDATE_IS_UTILITY__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
+	 * The number of operations of the '<em>Utility</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UTILITY_OPERATION_COUNT = 1;
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Auxiliary <em>Auxiliary</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Auxiliary</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Auxiliary
+	 * @generated
+	 */
+	EClass getAuxiliary();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Auxiliary#getBase_Class <em>Base Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Auxiliary#getBase_Class()
+	 * @see #getAuxiliary()
+	 * @generated
+	 */
+	EReference getAuxiliary_Base_Class();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Call <em>Call</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Call</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Call
+	 * @generated
+	 */
+	EClass getCall();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Call#getBase_Usage <em>Base Usage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Usage</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Call#getBase_Usage()
+	 * @see #getCall()
+	 * @generated
+	 */
+	EReference getCall_Base_Usage();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Call#validateClientAndSupplierAreOperations(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client And Supplier Are Operations</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Client And Supplier Are Operations</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Call#validateClientAndSupplierAreOperations(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getCall__ValidateClientAndSupplierAreOperations__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Create <em>Create</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Create</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Create
+	 * @generated
+	 */
+	EClass getCreate();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Create#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Behavioral Feature</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Create#getBase_BehavioralFeature()
+	 * @see #getCreate()
+	 * @generated
+	 */
+	EReference getCreate_Base_BehavioralFeature();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Create#getBase_Usage <em>Base Usage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Usage</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Create#getBase_Usage()
+	 * @see #getCreate()
+	 * @generated
+	 */
+	EReference getCreate_Base_Usage();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Create#validateClientAndSupplierAreClassifiers(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client And Supplier Are Classifiers</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Client And Supplier Are Classifiers</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Create#validateClientAndSupplierAreClassifiers(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getCreate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Derive <em>Derive</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Derive</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Derive
+	 * @generated
+	 */
+	EClass getDerive();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Derive#getBase_Abstraction <em>Base Abstraction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Abstraction</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Derive#getBase_Abstraction()
+	 * @see #getDerive()
+	 * @generated
+	 */
+	EReference getDerive_Base_Abstraction();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.uml2.uml.profile.l2.Derive#getComputation <em>Computation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Computation</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Derive#getComputation()
+	 * @see #getDerive()
+	 * @generated
+	 */
+	EReference getDerive_Computation();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Destroy <em>Destroy</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Destroy</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Destroy
+	 * @generated
+	 */
+	EClass getDestroy();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Destroy#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Behavioral Feature</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Destroy#getBase_BehavioralFeature()
+	 * @see #getDestroy()
+	 * @generated
+	 */
+	EReference getDestroy_Base_BehavioralFeature();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Document <em>Document</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Document</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Document
+	 * @generated
+	 */
+	EClass getDocument();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.File <em>File</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>File</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.File
+	 * @generated
+	 */
+	EClass getFile();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.File#getBase_Artifact <em>Base Artifact</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Artifact</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.File#getBase_Artifact()
+	 * @see #getFile()
+	 * @generated
+	 */
+	EReference getFile_Base_Artifact();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Entity <em>Entity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Entity</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Entity
+	 * @generated
+	 */
+	EClass getEntity();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Entity#getBase_Component <em>Base Component</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Component</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Entity#getBase_Component()
+	 * @see #getEntity()
+	 * @generated
+	 */
+	EReference getEntity_Base_Component();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Executable <em>Executable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Executable</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Executable
+	 * @generated
+	 */
+	EClass getExecutable();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Focus <em>Focus</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Focus</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Focus
+	 * @generated
+	 */
+	EClass getFocus();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Focus#getBase_Class <em>Base Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Focus#getBase_Class()
+	 * @see #getFocus()
+	 * @generated
+	 */
+	EReference getFocus_Base_Class();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Framework <em>Framework</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Framework</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Framework
+	 * @generated
+	 */
+	EClass getFramework();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Framework#getBase_Package <em>Base Package</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Package</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Framework#getBase_Package()
+	 * @see #getFramework()
+	 * @generated
+	 */
+	EReference getFramework_Base_Package();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Implement <em>Implement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Implement</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Implement
+	 * @generated
+	 */
+	EClass getImplement();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Implement#getBase_Component <em>Base Component</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Component</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Implement#getBase_Component()
+	 * @see #getImplement()
+	 * @generated
+	 */
+	EReference getImplement_Base_Component();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Implement#validateImplementsSpecification(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Implements Specification</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Implements Specification</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Implement#validateImplementsSpecification(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getImplement__ValidateImplementsSpecification__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass <em>Implementation Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Implementation Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.ImplementationClass
+	 * @generated
+	 */
+	EClass getImplementationClass();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass#getBase_Class <em>Base Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.ImplementationClass#getBase_Class()
+	 * @see #getImplementationClass()
+	 * @generated
+	 */
+	EReference getImplementationClass_Base_Class();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass#validateCannotBeRealization(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Realization</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Cannot Be Realization</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.ImplementationClass#validateCannotBeRealization(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getImplementationClass__ValidateCannotBeRealization__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Instantiate <em>Instantiate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Instantiate</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Instantiate
+	 * @generated
+	 */
+	EClass getInstantiate();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Instantiate#getBase_Usage <em>Base Usage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Usage</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Instantiate#getBase_Usage()
+	 * @see #getInstantiate()
+	 * @generated
+	 */
+	EReference getInstantiate_Base_Usage();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Instantiate#validateClientAndSupplierAreClassifiers(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client And Supplier Are Classifiers</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Client And Supplier Are Classifiers</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Instantiate#validateClientAndSupplierAreClassifiers(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getInstantiate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Library <em>Library</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Library</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Library
+	 * @generated
+	 */
+	EClass getLibrary();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Metaclass <em>Metaclass</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Metaclass</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Metaclass
+	 * @generated
+	 */
+	EClass getMetaclass();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Metaclass#getBase_Class <em>Base Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Metaclass#getBase_Class()
+	 * @see #getMetaclass()
+	 * @generated
+	 */
+	EReference getMetaclass_Base_Class();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.ModelLibrary <em>Model Library</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Model Library</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.ModelLibrary
+	 * @generated
+	 */
+	EClass getModelLibrary();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.ModelLibrary#getBase_Package <em>Base Package</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Package</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.ModelLibrary#getBase_Package()
+	 * @see #getModelLibrary()
+	 * @generated
+	 */
+	EReference getModelLibrary_Base_Package();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Process <em>Process</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Process</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Process
+	 * @generated
+	 */
+	EClass getProcess();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Process#getBase_Component <em>Base Component</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Component</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Process#getBase_Component()
+	 * @see #getProcess()
+	 * @generated
+	 */
+	EReference getProcess_Base_Component();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Realization <em>Realization</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Realization</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Realization
+	 * @generated
+	 */
+	EClass getRealization();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Realization#getBase_Classifier <em>Base Classifier</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Classifier</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Realization#getBase_Classifier()
+	 * @see #getRealization()
+	 * @generated
+	 */
+	EReference getRealization_Base_Classifier();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Realization#validateCannotBeImplementationClass(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Implementation Class</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Cannot Be Implementation Class</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Realization#validateCannotBeImplementationClass(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getRealization__ValidateCannotBeImplementationClass__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Refine <em>Refine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Refine</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Refine
+	 * @generated
+	 */
+	EClass getRefine();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Refine#getBase_Abstraction <em>Base Abstraction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Abstraction</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Refine#getBase_Abstraction()
+	 * @see #getRefine()
+	 * @generated
+	 */
+	EReference getRefine_Base_Abstraction();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Responsibility <em>Responsibility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Responsibility</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Responsibility
+	 * @generated
+	 */
+	EClass getResponsibility();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Responsibility#getBase_Usage <em>Base Usage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Usage</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Responsibility#getBase_Usage()
+	 * @see #getResponsibility()
+	 * @generated
+	 */
+	EReference getResponsibility_Base_Usage();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Script <em>Script</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Script</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Script
+	 * @generated
+	 */
+	EClass getScript();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Send <em>Send</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Send</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Send
+	 * @generated
+	 */
+	EClass getSend();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Send#getBase_Usage <em>Base Usage</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Usage</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Send#getBase_Usage()
+	 * @see #getSend()
+	 * @generated
+	 */
+	EReference getSend_Base_Usage();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Send#validateClientOperationSendsSupplierSignal(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client Operation Sends Supplier Signal</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Client Operation Sends Supplier Signal</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Send#validateClientOperationSendsSupplierSignal(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getSend__ValidateClientOperationSendsSupplierSignal__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Service <em>Service</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Service</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Service
+	 * @generated
+	 */
+	EClass getService();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Service#getBase_Component <em>Base Component</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Component</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Service#getBase_Component()
+	 * @see #getService()
+	 * @generated
+	 */
+	EReference getService_Base_Component();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Source <em>Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Source</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Source
+	 * @generated
+	 */
+	EClass getSource();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Specification <em>Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Specification</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Specification
+	 * @generated
+	 */
+	EClass getSpecification();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Specification#getBase_Classifier <em>Base Classifier</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Classifier</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Specification#getBase_Classifier()
+	 * @see #getSpecification()
+	 * @generated
+	 */
+	EReference getSpecification_Base_Classifier();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Specification#validateCannotBeType(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Type</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Cannot Be Type</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Specification#validateCannotBeType(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getSpecification__ValidateCannotBeType__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Subsystem <em>Subsystem</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Subsystem</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Subsystem
+	 * @generated
+	 */
+	EClass getSubsystem();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Subsystem#getBase_Component <em>Base Component</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Component</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Subsystem#getBase_Component()
+	 * @see #getSubsystem()
+	 * @generated
+	 */
+	EReference getSubsystem_Base_Component();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Trace <em>Trace</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Trace</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Trace
+	 * @generated
+	 */
+	EClass getTrace();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Trace#getBase_Abstraction <em>Base Abstraction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Abstraction</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Trace#getBase_Abstraction()
+	 * @see #getTrace()
+	 * @generated
+	 */
+	EReference getTrace_Base_Abstraction();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Type</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Type
+	 * @generated
+	 */
+	EClass getType();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Type#getBase_Class <em>Base Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Type#getBase_Class()
+	 * @see #getType()
+	 * @generated
+	 */
+	EReference getType_Base_Class();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Type#validateCannotBeSpecification(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Specification</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Cannot Be Specification</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Type#validateCannotBeSpecification(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getType__ValidateCannotBeSpecification__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.uml2.uml.profile.l2.Utility <em>Utility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Utility</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Utility
+	 * @generated
+	 */
+	EClass getUtility();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.uml2.uml.profile.l2.Utility#getBase_Class <em>Base Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Class</em>'.
+	 * @see org.eclipse.uml2.uml.profile.l2.Utility#getBase_Class()
+	 * @see #getUtility()
+	 * @generated
+	 */
+	EReference getUtility_Base_Class();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.uml2.uml.profile.l2.Utility#validateIsUtility(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Is Utility</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Is Utility</em>' operation.
+	 * @see org.eclipse.uml2.uml.profile.l2.Utility#validateIsUtility(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getUtility__ValidateIsUtility__DiagnosticChain_Map();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	L2Factory getL2Factory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.AuxiliaryImpl <em>Auxiliary</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.AuxiliaryImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getAuxiliary()
+		 * @generated
+		 */
+		EClass AUXILIARY = eINSTANCE.getAuxiliary();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Class</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference AUXILIARY__BASE_CLASS = eINSTANCE.getAuxiliary_Base_Class();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CallImpl <em>Call</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.CallImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getCall()
+		 * @generated
+		 */
+		EClass CALL = eINSTANCE.getCall();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Usage</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CALL__BASE_USAGE = eINSTANCE.getCall_Base_Usage();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Client And Supplier Are Operations</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation CALL___VALIDATE_CLIENT_AND_SUPPLIER_ARE_OPERATIONS__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getCall__ValidateClientAndSupplierAreOperations__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CreateImpl <em>Create</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.CreateImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getCreate()
+		 * @generated
+		 */
+		EClass CREATE = eINSTANCE.getCreate();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Behavioral Feature</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CREATE__BASE_BEHAVIORAL_FEATURE = eINSTANCE
+			.getCreate_Base_BehavioralFeature();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Usage</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CREATE__BASE_USAGE = eINSTANCE.getCreate_Base_Usage();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Client And Supplier Are Classifiers</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation CREATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getCreate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DeriveImpl <em>Derive</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.DeriveImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getDerive()
+		 * @generated
+		 */
+		EClass DERIVE = eINSTANCE.getDerive();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Abstraction</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DERIVE__BASE_ABSTRACTION = eINSTANCE
+			.getDerive_Base_Abstraction();
+
+		/**
+		 * The meta object literal for the '<em><b>Computation</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DERIVE__COMPUTATION = eINSTANCE.getDerive_Computation();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DestroyImpl <em>Destroy</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.DestroyImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getDestroy()
+		 * @generated
+		 */
+		EClass DESTROY = eINSTANCE.getDestroy();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Behavioral Feature</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DESTROY__BASE_BEHAVIORAL_FEATURE = eINSTANCE
+			.getDestroy_Base_BehavioralFeature();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DocumentImpl <em>Document</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.DocumentImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getDocument()
+		 * @generated
+		 */
+		EClass DOCUMENT = eINSTANCE.getDocument();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FileImpl <em>File</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.FileImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getFile()
+		 * @generated
+		 */
+		EClass FILE = eINSTANCE.getFile();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Artifact</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FILE__BASE_ARTIFACT = eINSTANCE.getFile_Base_Artifact();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.EntityImpl <em>Entity</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.EntityImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getEntity()
+		 * @generated
+		 */
+		EClass ENTITY = eINSTANCE.getEntity();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Component</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENTITY__BASE_COMPONENT = eINSTANCE
+			.getEntity_Base_Component();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ExecutableImpl <em>Executable</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ExecutableImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getExecutable()
+		 * @generated
+		 */
+		EClass EXECUTABLE = eINSTANCE.getExecutable();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FocusImpl <em>Focus</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.FocusImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getFocus()
+		 * @generated
+		 */
+		EClass FOCUS = eINSTANCE.getFocus();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Class</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FOCUS__BASE_CLASS = eINSTANCE.getFocus_Base_Class();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FrameworkImpl <em>Framework</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.FrameworkImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getFramework()
+		 * @generated
+		 */
+		EClass FRAMEWORK = eINSTANCE.getFramework();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Package</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FRAMEWORK__BASE_PACKAGE = eINSTANCE
+			.getFramework_Base_Package();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementImpl <em>Implement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getImplement()
+		 * @generated
+		 */
+		EClass IMPLEMENT = eINSTANCE.getImplement();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Component</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IMPLEMENT__BASE_COMPONENT = eINSTANCE
+			.getImplement_Base_Component();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Implements Specification</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation IMPLEMENT___VALIDATE_IMPLEMENTS_SPECIFICATION__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getImplement__ValidateImplementsSpecification__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementationClassImpl <em>Implementation Class</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementationClassImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getImplementationClass()
+		 * @generated
+		 */
+		EClass IMPLEMENTATION_CLASS = eINSTANCE.getImplementationClass();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Class</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IMPLEMENTATION_CLASS__BASE_CLASS = eINSTANCE
+			.getImplementationClass_Base_Class();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Cannot Be Realization</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation IMPLEMENTATION_CLASS___VALIDATE_CANNOT_BE_REALIZATION__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getImplementationClass__ValidateCannotBeRealization__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.InstantiateImpl <em>Instantiate</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.InstantiateImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getInstantiate()
+		 * @generated
+		 */
+		EClass INSTANTIATE = eINSTANCE.getInstantiate();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Usage</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INSTANTIATE__BASE_USAGE = eINSTANCE
+			.getInstantiate_Base_Usage();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Client And Supplier Are Classifiers</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation INSTANTIATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getInstantiate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.LibraryImpl <em>Library</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.LibraryImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getLibrary()
+		 * @generated
+		 */
+		EClass LIBRARY = eINSTANCE.getLibrary();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.MetaclassImpl <em>Metaclass</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.MetaclassImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getMetaclass()
+		 * @generated
+		 */
+		EClass METACLASS = eINSTANCE.getMetaclass();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Class</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference METACLASS__BASE_CLASS = eINSTANCE.getMetaclass_Base_Class();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ModelLibraryImpl <em>Model Library</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ModelLibraryImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getModelLibrary()
+		 * @generated
+		 */
+		EClass MODEL_LIBRARY = eINSTANCE.getModelLibrary();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Package</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_LIBRARY__BASE_PACKAGE = eINSTANCE
+			.getModelLibrary_Base_Package();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ProcessImpl <em>Process</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ProcessImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getProcess()
+		 * @generated
+		 */
+		EClass PROCESS = eINSTANCE.getProcess();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Component</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROCESS__BASE_COMPONENT = eINSTANCE
+			.getProcess_Base_Component();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.RealizationImpl <em>Realization</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.RealizationImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getRealization()
+		 * @generated
+		 */
+		EClass REALIZATION = eINSTANCE.getRealization();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Classifier</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference REALIZATION__BASE_CLASSIFIER = eINSTANCE
+			.getRealization_Base_Classifier();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Cannot Be Implementation Class</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation REALIZATION___VALIDATE_CANNOT_BE_IMPLEMENTATION_CLASS__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getRealization__ValidateCannotBeImplementationClass__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.RefineImpl <em>Refine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.RefineImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getRefine()
+		 * @generated
+		 */
+		EClass REFINE = eINSTANCE.getRefine();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Abstraction</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference REFINE__BASE_ABSTRACTION = eINSTANCE
+			.getRefine_Base_Abstraction();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ResponsibilityImpl <em>Responsibility</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ResponsibilityImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getResponsibility()
+		 * @generated
+		 */
+		EClass RESPONSIBILITY = eINSTANCE.getResponsibility();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Usage</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESPONSIBILITY__BASE_USAGE = eINSTANCE
+			.getResponsibility_Base_Usage();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ScriptImpl <em>Script</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ScriptImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getScript()
+		 * @generated
+		 */
+		EClass SCRIPT = eINSTANCE.getScript();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SendImpl <em>Send</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SendImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSend()
+		 * @generated
+		 */
+		EClass SEND = eINSTANCE.getSend();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Usage</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SEND__BASE_USAGE = eINSTANCE.getSend_Base_Usage();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Client Operation Sends Supplier Signal</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation SEND___VALIDATE_CLIENT_OPERATION_SENDS_SUPPLIER_SIGNAL__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getSend__ValidateClientOperationSendsSupplierSignal__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ServiceImpl <em>Service</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.ServiceImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getService()
+		 * @generated
+		 */
+		EClass SERVICE = eINSTANCE.getService();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Component</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SERVICE__BASE_COMPONENT = eINSTANCE
+			.getService_Base_Component();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SourceImpl <em>Source</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SourceImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSource()
+		 * @generated
+		 */
+		EClass SOURCE = eINSTANCE.getSource();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SpecificationImpl <em>Specification</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SpecificationImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSpecification()
+		 * @generated
+		 */
+		EClass SPECIFICATION = eINSTANCE.getSpecification();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Classifier</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SPECIFICATION__BASE_CLASSIFIER = eINSTANCE
+			.getSpecification_Base_Classifier();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Cannot Be Type</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation SPECIFICATION___VALIDATE_CANNOT_BE_TYPE__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getSpecification__ValidateCannotBeType__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SubsystemImpl <em>Subsystem</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.SubsystemImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getSubsystem()
+		 * @generated
+		 */
+		EClass SUBSYSTEM = eINSTANCE.getSubsystem();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Component</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SUBSYSTEM__BASE_COMPONENT = eINSTANCE
+			.getSubsystem_Base_Component();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.TraceImpl <em>Trace</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.TraceImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getTrace()
+		 * @generated
+		 */
+		EClass TRACE = eINSTANCE.getTrace();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Abstraction</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRACE__BASE_ABSTRACTION = eINSTANCE
+			.getTrace_Base_Abstraction();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.TypeImpl <em>Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.TypeImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getType()
+		 * @generated
+		 */
+		EClass TYPE = eINSTANCE.getType();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Class</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TYPE__BASE_CLASS = eINSTANCE.getType_Base_Class();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Cannot Be Specification</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation TYPE___VALIDATE_CANNOT_BE_SPECIFICATION__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getType__ValidateCannotBeSpecification__DiagnosticChain_Map();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.uml2.uml.profile.l2.internal.impl.UtilityImpl <em>Utility</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.UtilityImpl
+		 * @see org.eclipse.uml2.uml.profile.l2.internal.impl.L2PackageImpl#getUtility()
+		 * @generated
+		 */
+		EClass UTILITY = eINSTANCE.getUtility();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Class</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference UTILITY__BASE_CLASS = eINSTANCE.getUtility_Base_Class();
+
+		/**
+		 * The meta object literal for the '<em><b>Validate Is Utility</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation UTILITY___VALIDATE_IS_UTILITY__DIAGNOSTICCHAIN_MAP = eINSTANCE
+			.getUtility__ValidateIsUtility__DiagnosticChain_Map();
+
+	}
+
+} //L2Package
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Plugin.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Plugin.java
new file mode 100644
index 0000000..86e5595
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/L2Plugin.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.common.EMFPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * This is the central singleton for the L2 model plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class L2Plugin
+		extends EMFPlugin {
+
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final L2Plugin INSTANCE = new L2Plugin();
+
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static Implementation plugin;
+
+	/**
+	 * Create the instance.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2Plugin() {
+		super(new ResourceLocator[]{});
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getPluginResourceLocator() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+	public static Implementation getPlugin() {
+		return plugin;
+	}
+
+	/**
+	 * The actual implementation of the Eclipse <b>Plugin</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class Implementation
+			extends EclipsePlugin {
+
+		/**
+		 * Creates an instance.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public Implementation() {
+			super();
+
+			// Remember the static instance.
+			//
+			plugin = this;
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Library.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Library.java
new file mode 100644
index 0000000..45cba2d
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Library.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Library</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A static or dynamic library file. Subclass of «File».
+ * <!-- end-model-doc -->
+ *
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getLibrary()
+ * @model
+ * @generated
+ */
+public interface Library
+		extends File {
+} // Library
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Metaclass.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Metaclass.java
new file mode 100644
index 0000000..32dce2e
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Metaclass.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Metaclass</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A class whose instances are also classes.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Metaclass#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getMetaclass()
+ * @model
+ * @generated
+ */
+public interface Metaclass
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Class</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Class</em>' reference.
+	 * @see #setBase_Class(org.eclipse.uml2.uml.Class)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getMetaclass_Base_Class()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Class getBase_Class();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Metaclass#getBase_Class <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Class</em>' reference.
+	 * @see #getBase_Class()
+	 * @generated
+	 */
+	void setBase_Class(org.eclipse.uml2.uml.Class value);
+
+} // Metaclass
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/ModelLibrary.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/ModelLibrary.java
new file mode 100644
index 0000000..9f6335d
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/ModelLibrary.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model Library</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A package that contains model elements that are intended to be reused by other packages. Model libraries are frequently used in conjunction with applied profiles. This is expressed by defining a dependency between a profile and a model library package, or by defining a model library as contained in a profile package. The classes in a model library are not stereotypes and tagged definitions extending the metamodel. A model library is analogous to a class library in some programming languages. When a model library is defined as a part of a profile, it is imported or deleted with the application or removal of the profile. The profile is implicitly applied to its model library. In the other case, when the model library is defined as an external package imported by a profile, the profile requires that the model library be there in the model at the stage of the profile application. The application or the removal of the profile does not affect the presence of the model library elements.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.ModelLibrary#getBase_Package <em>Base Package</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getModelLibrary()
+ * @model
+ * @generated
+ */
+public interface ModelLibrary
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Package</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Package</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Package</em>' reference.
+	 * @see #setBase_Package(org.eclipse.uml2.uml.Package)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getModelLibrary_Base_Package()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Package getBase_Package();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.ModelLibrary#getBase_Package <em>Base Package</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Package</em>' reference.
+	 * @see #getBase_Package()
+	 * @generated
+	 */
+	void setBase_Package(org.eclipse.uml2.uml.Package value);
+
+} // ModelLibrary
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Process.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Process.java
new file mode 100644
index 0000000..5265e2e
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Process.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Component;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Process</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A transaction based component.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Process#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getProcess()
+ * @model
+ * @generated
+ */
+public interface Process
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Component</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Component</em>' reference.
+	 * @see #setBase_Component(Component)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getProcess_Base_Component()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Component getBase_Component();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Process#getBase_Component <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Component</em>' reference.
+	 * @see #getBase_Component()
+	 * @generated
+	 */
+	void setBase_Component(Component value);
+
+} // Process
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Realization.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Realization.java
new file mode 100644
index 0000000..36b51e1
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Realization.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Classifier;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Realization</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A classifier that specifies a domain of objects and that also defines the physical implementation of those objects. For example, a Component stereotyped by «realization» will only have realizing Classifiers that implement behavior specified by a separate «Specification» Component. See «specification». This differs from «ImplementationClass» because an «ImplementationClass» is a realization of a Class that can have features such as attributes and methods that are useful to system designers.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Realization#getBase_Classifier <em>Base Classifier</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getRealization()
+ * @model
+ * @generated
+ */
+public interface Realization
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Classifier</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Classifier</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Classifier</em>' reference.
+	 * @see #setBase_Classifier(Classifier)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getRealization_Base_Classifier()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Classifier getBase_Classifier();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Realization#getBase_Classifier <em>Base Classifier</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Classifier</em>' reference.
+	 * @see #getBase_Classifier()
+	 * @generated
+	 */
+	void setBase_Classifier(Classifier value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Classifier.extension_ImplementationClass->isEmpty()
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateCannotBeImplementationClass(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // Realization
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Refine.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Refine.java
new file mode 100644
index 0000000..1578953
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Refine.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Abstraction;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Refine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * Specifies a refinement relationship between model elements at different semantic levels, such as analysis and design. The mapping specifies the relationship between the two elements or sets of elements. The mapping may or may not be computable, and it may be unidirectional or bidirectional. Refinement can be used to model transformations from analysis to design and other such changes.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Refine#getBase_Abstraction <em>Base Abstraction</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getRefine()
+ * @model
+ * @generated
+ */
+public interface Refine
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Abstraction</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Abstraction</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Abstraction</em>' reference.
+	 * @see #setBase_Abstraction(Abstraction)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getRefine_Base_Abstraction()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Abstraction getBase_Abstraction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Refine#getBase_Abstraction <em>Base Abstraction</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Abstraction</em>' reference.
+	 * @see #getBase_Abstraction()
+	 * @generated
+	 */
+	void setBase_Abstraction(Abstraction value);
+
+} // Refine
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Responsibility.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Responsibility.java
new file mode 100644
index 0000000..a9c45b3
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Responsibility.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Usage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Responsibility</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A contract or an obligation of an element in its relationship to other elements.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Responsibility#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getResponsibility()
+ * @model
+ * @generated
+ */
+public interface Responsibility
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Usage</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Usage</em>' reference.
+	 * @see #setBase_Usage(Usage)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getResponsibility_Base_Usage()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Usage getBase_Usage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Responsibility#getBase_Usage <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Usage</em>' reference.
+	 * @see #getBase_Usage()
+	 * @generated
+	 */
+	void setBase_Usage(Usage value);
+
+} // Responsibility
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Script.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Script.java
new file mode 100644
index 0000000..4c9b0fb
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Script.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Script</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A script file that can be interpreted by a computer system. Subclass of «File».
+ * <!-- end-model-doc -->
+ *
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getScript()
+ * @model
+ * @generated
+ */
+public interface Script
+		extends File {
+} // Script
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Send.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Send.java
new file mode 100644
index 0000000..41d9736
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Send.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Usage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Send</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A usage dependency whose client is an operation and whose supplier is a signal, specifying that the client sends the supplier signal.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Send#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSend()
+ * @model
+ * @generated
+ */
+public interface Send
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Usage</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Usage</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Usage</em>' reference.
+	 * @see #setBase_Usage(Usage)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSend_Base_Usage()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Usage getBase_Usage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Send#getBase_Usage <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Usage</em>' reference.
+	 * @see #getBase_Usage()
+	 * @generated
+	 */
+	void setBase_Usage(Usage value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Signal))
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateClientOperationSendsSupplierSignal(
+			DiagnosticChain diagnostics, Map<Object, Object> context);
+
+} // Send
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Service.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Service.java
new file mode 100644
index 0000000..bbab8ed
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Service.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Component;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Service</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A stateless, functional component (computes a value).
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Service#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getService()
+ * @model
+ * @generated
+ */
+public interface Service
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Component</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Component</em>' reference.
+	 * @see #setBase_Component(Component)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getService_Base_Component()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Component getBase_Component();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Service#getBase_Component <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Component</em>' reference.
+	 * @see #getBase_Component()
+	 * @generated
+	 */
+	void setBase_Component(Component value);
+
+} // Service
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Source.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Source.java
new file mode 100644
index 0000000..d9b0581
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Source.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Source</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A source file that can be compiled into an executable file. Subclass of «File».
+ * <!-- end-model-doc -->
+ *
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSource()
+ * @model
+ * @generated
+ */
+public interface Source
+		extends File {
+} // Source
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Specification.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Specification.java
new file mode 100644
index 0000000..641f6b1
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Specification.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Classifier;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Specification</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A class that specifies a domain of objects together with the operations applicable to the objects, without defining the physical implementation of those objects. However, it may have attributes and associations. Behavioral specifications for type operations may be expressed using, for example, activity diagrams. An object may have at most one implementation class, however it may conform to multiple different types. See also: «ImplementationClass».
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Specification#getBase_Classifier <em>Base Classifier</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSpecification()
+ * @model
+ * @generated
+ */
+public interface Specification
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Classifier</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Classifier</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Classifier</em>' reference.
+	 * @see #setBase_Classifier(Classifier)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSpecification_Base_Classifier()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Classifier getBase_Classifier();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Specification#getBase_Classifier <em>Base Classifier</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Classifier</em>' reference.
+	 * @see #getBase_Classifier()
+	 * @generated
+	 */
+	void setBase_Classifier(Classifier value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Classifier.extension_Type->isEmpty()
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateCannotBeType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // Specification
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Subsystem.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Subsystem.java
new file mode 100644
index 0000000..36437b4
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Subsystem.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Component;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Subsystem</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A unit of hierarchical decomposition for large systems. A subsystem is commonly instantiated indirectly. Definitions of subsystems vary widely among domains and methods, and it is expected that domain and method profiles will specialize this construct. A subsystem may be defined to have specification and realization elements. See also: «Specification» and «Realization».
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Subsystem#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSubsystem()
+ * @model
+ * @generated
+ */
+public interface Subsystem
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Component</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Component</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Component</em>' reference.
+	 * @see #setBase_Component(Component)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getSubsystem_Base_Component()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Component getBase_Component();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Subsystem#getBase_Component <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Component</em>' reference.
+	 * @see #getBase_Component()
+	 * @generated
+	 */
+	void setBase_Component(Component value);
+
+} // Subsystem
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Trace.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Trace.java
new file mode 100644
index 0000000..11b2afb
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Trace.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.uml2.uml.Abstraction;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Trace</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * Specifies a trace relationship between model elements or sets of model elements that represent the same concept in different models. Traces are mainly used for tracking requirements and changes across models. Since model changes can occur in both directions, the directionality of the dependency can often be ignored. The mapping specifies the relationship between the two, but it is rarely computable and is usually informal.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Trace#getBase_Abstraction <em>Base Abstraction</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getTrace()
+ * @model
+ * @generated
+ */
+public interface Trace
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Abstraction</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Abstraction</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Abstraction</em>' reference.
+	 * @see #setBase_Abstraction(Abstraction)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getTrace_Base_Abstraction()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Abstraction getBase_Abstraction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Trace#getBase_Abstraction <em>Base Abstraction</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Abstraction</em>' reference.
+	 * @see #getBase_Abstraction()
+	 * @generated
+	 */
+	void setBase_Abstraction(Abstraction value);
+
+} // Trace
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Type.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Type.java
new file mode 100644
index 0000000..7ab927f
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Type.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A class that specifies a domain of objects together with the operations applicable to the objects, without defining the physical implementation of those objects. However, it may have attributes and associations. Behavioral specifications for type operations may be expressed using, for example, activity diagrams. An object may have at most one implementation class, however it may conform to multiple different types. See also: «ImplementationClass».
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Type#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getType()
+ * @model
+ * @generated
+ */
+public interface Type
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Class</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Class</em>' reference.
+	 * @see #setBase_Class(org.eclipse.uml2.uml.Class)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getType_Base_Class()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Class getBase_Class();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Type#getBase_Class <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Class</em>' reference.
+	 * @see #getBase_Class()
+	 * @generated
+	 */
+	void setBase_Class(org.eclipse.uml2.uml.Class value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Class.extension_Specification->isEmpty()
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateCannotBeSpecification(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // Type
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Utility.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Utility.java
new file mode 100644
index 0000000..618ec79
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/Utility.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Utility</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * A class that has no instances, but rather denotes a named collection of static attributes and static operations, all of which are class-scoped.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Utility#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package#getUtility()
+ * @model
+ * @generated
+ */
+public interface Utility
+		extends EObject {
+
+	/**
+	 * Returns the value of the '<em><b>Base Class</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Class</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Class</em>' reference.
+	 * @see #setBase_Class(org.eclipse.uml2.uml.Class)
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#getUtility_Base_Class()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	org.eclipse.uml2.uml.Class getBase_Class();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.uml2.uml.profile.l2.Utility#getBase_Class <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Class</em>' reference.
+	 * @see #getBase_Class()
+	 * @generated
+	 */
+	void setBase_Class(org.eclipse.uml2.uml.Class value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Class.feature->forAll(isStatic)
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean validateIsUtility(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
+
+} // Utility
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/AuxiliaryImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/AuxiliaryImpl.java
new file mode 100644
index 0000000..f12b64e
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/AuxiliaryImpl.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.Auxiliary;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Auxiliary</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.AuxiliaryImpl#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class AuxiliaryImpl
+		extends EObjectImpl
+		implements Auxiliary {
+
+	/**
+	 * The cached value of the '{@link #getBase_Class() <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Class()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Class base_Class;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AuxiliaryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.AUXILIARY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class getBase_Class() {
+		if (base_Class != null && base_Class.eIsProxy()) {
+			InternalEObject oldBase_Class = (InternalEObject) base_Class;
+			base_Class = (org.eclipse.uml2.uml.Class) eResolveProxy(oldBase_Class);
+			if (base_Class != oldBase_Class) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.AUXILIARY__BASE_CLASS, oldBase_Class,
+						base_Class));
+			}
+		}
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class basicGetBase_Class() {
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Class(org.eclipse.uml2.uml.Class newBase_Class) {
+		org.eclipse.uml2.uml.Class oldBase_Class = base_Class;
+		base_Class = newBase_Class;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.AUXILIARY__BASE_CLASS, oldBase_Class, base_Class));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.AUXILIARY__BASE_CLASS :
+				if (resolve)
+					return getBase_Class();
+				return basicGetBase_Class();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.AUXILIARY__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.AUXILIARY__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.AUXILIARY__BASE_CLASS :
+				return base_Class != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //AuxiliaryImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/CallImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/CallImpl.java
new file mode 100644
index 0000000..b741b34
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/CallImpl.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Usage;
+
+import org.eclipse.uml2.uml.profile.l2.Call;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.CallOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Call</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CallImpl#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class CallImpl
+		extends EObjectImpl
+		implements Call {
+
+	/**
+	 * The cached value of the '{@link #getBase_Usage() <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Usage()
+	 * @generated
+	 * @ordered
+	 */
+	protected Usage base_Usage;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CallImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.CALL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage getBase_Usage() {
+		if (base_Usage != null && base_Usage.eIsProxy()) {
+			InternalEObject oldBase_Usage = (InternalEObject) base_Usage;
+			base_Usage = (Usage) eResolveProxy(oldBase_Usage);
+			if (base_Usage != oldBase_Usage) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.CALL__BASE_USAGE, oldBase_Usage, base_Usage));
+			}
+		}
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage basicGetBase_Usage() {
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Usage(Usage newBase_Usage) {
+		Usage oldBase_Usage = base_Usage;
+		base_Usage = newBase_Usage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.CALL__BASE_USAGE, oldBase_Usage, base_Usage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateClientAndSupplierAreOperations(
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return CallOperations.validateClientAndSupplierAreOperations(this,
+			diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.CALL__BASE_USAGE :
+				if (resolve)
+					return getBase_Usage();
+				return basicGetBase_Usage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.CALL__BASE_USAGE :
+				setBase_Usage((Usage) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.CALL__BASE_USAGE :
+				setBase_Usage((Usage) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.CALL__BASE_USAGE :
+				return base_Usage != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.CALL___VALIDATE_CLIENT_AND_SUPPLIER_ARE_OPERATIONS__DIAGNOSTICCHAIN_MAP :
+				return validateClientAndSupplierAreOperations(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //CallImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/CreateImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/CreateImpl.java
new file mode 100644
index 0000000..3c4c98d
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/CreateImpl.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Usage;
+
+import org.eclipse.uml2.uml.profile.l2.Create;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.CreateOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Create</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CreateImpl#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}</li>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.CreateImpl#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class CreateImpl
+		extends EObjectImpl
+		implements Create {
+
+	/**
+	 * The cached value of the '{@link #getBase_BehavioralFeature() <em>Base Behavioral Feature</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_BehavioralFeature()
+	 * @generated
+	 * @ordered
+	 */
+	protected BehavioralFeature base_BehavioralFeature;
+
+	/**
+	 * The cached value of the '{@link #getBase_Usage() <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Usage()
+	 * @generated
+	 * @ordered
+	 */
+	protected Usage base_Usage;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CreateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.CREATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BehavioralFeature getBase_BehavioralFeature() {
+		if (base_BehavioralFeature != null && base_BehavioralFeature.eIsProxy()) {
+			InternalEObject oldBase_BehavioralFeature = (InternalEObject) base_BehavioralFeature;
+			base_BehavioralFeature = (BehavioralFeature) eResolveProxy(oldBase_BehavioralFeature);
+			if (base_BehavioralFeature != oldBase_BehavioralFeature) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.CREATE__BASE_BEHAVIORAL_FEATURE,
+						oldBase_BehavioralFeature, base_BehavioralFeature));
+			}
+		}
+		return base_BehavioralFeature;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BehavioralFeature basicGetBase_BehavioralFeature() {
+		return base_BehavioralFeature;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_BehavioralFeature(
+			BehavioralFeature newBase_BehavioralFeature) {
+		BehavioralFeature oldBase_BehavioralFeature = base_BehavioralFeature;
+		base_BehavioralFeature = newBase_BehavioralFeature;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.CREATE__BASE_BEHAVIORAL_FEATURE,
+				oldBase_BehavioralFeature, base_BehavioralFeature));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage getBase_Usage() {
+		if (base_Usage != null && base_Usage.eIsProxy()) {
+			InternalEObject oldBase_Usage = (InternalEObject) base_Usage;
+			base_Usage = (Usage) eResolveProxy(oldBase_Usage);
+			if (base_Usage != oldBase_Usage) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.CREATE__BASE_USAGE, oldBase_Usage, base_Usage));
+			}
+		}
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage basicGetBase_Usage() {
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Usage(Usage newBase_Usage) {
+		Usage oldBase_Usage = base_Usage;
+		base_Usage = newBase_Usage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.CREATE__BASE_USAGE, oldBase_Usage, base_Usage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateClientAndSupplierAreClassifiers(
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return CreateOperations.validateClientAndSupplierAreClassifiers(this,
+			diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.CREATE__BASE_BEHAVIORAL_FEATURE :
+				if (resolve)
+					return getBase_BehavioralFeature();
+				return basicGetBase_BehavioralFeature();
+			case L2Package.CREATE__BASE_USAGE :
+				if (resolve)
+					return getBase_Usage();
+				return basicGetBase_Usage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.CREATE__BASE_BEHAVIORAL_FEATURE :
+				setBase_BehavioralFeature((BehavioralFeature) newValue);
+				return;
+			case L2Package.CREATE__BASE_USAGE :
+				setBase_Usage((Usage) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.CREATE__BASE_BEHAVIORAL_FEATURE :
+				setBase_BehavioralFeature((BehavioralFeature) null);
+				return;
+			case L2Package.CREATE__BASE_USAGE :
+				setBase_Usage((Usage) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.CREATE__BASE_BEHAVIORAL_FEATURE :
+				return base_BehavioralFeature != null;
+			case L2Package.CREATE__BASE_USAGE :
+				return base_Usage != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.CREATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP :
+				return validateClientAndSupplierAreClassifiers(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //CreateImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DeriveImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DeriveImpl.java
new file mode 100644
index 0000000..ec9fbb5
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DeriveImpl.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Abstraction;
+import org.eclipse.uml2.uml.ValueSpecification;
+
+import org.eclipse.uml2.uml.profile.l2.Derive;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Derive</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DeriveImpl#getBase_Abstraction <em>Base Abstraction</em>}</li>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DeriveImpl#getComputation <em>Computation</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class DeriveImpl
+		extends EObjectImpl
+		implements Derive {
+
+	/**
+	 * The cached value of the '{@link #getBase_Abstraction() <em>Base Abstraction</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Abstraction()
+	 * @generated
+	 * @ordered
+	 */
+	protected Abstraction base_Abstraction;
+
+	/**
+	 * The cached value of the '{@link #getComputation() <em>Computation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getComputation()
+	 * @generated
+	 * @ordered
+	 */
+	protected ValueSpecification computation;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DeriveImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.DERIVE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Abstraction getBase_Abstraction() {
+		if (base_Abstraction != null && base_Abstraction.eIsProxy()) {
+			InternalEObject oldBase_Abstraction = (InternalEObject) base_Abstraction;
+			base_Abstraction = (Abstraction) eResolveProxy(oldBase_Abstraction);
+			if (base_Abstraction != oldBase_Abstraction) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.DERIVE__BASE_ABSTRACTION,
+						oldBase_Abstraction, base_Abstraction));
+			}
+		}
+		return base_Abstraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Abstraction basicGetBase_Abstraction() {
+		return base_Abstraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Abstraction(Abstraction newBase_Abstraction) {
+		Abstraction oldBase_Abstraction = base_Abstraction;
+		base_Abstraction = newBase_Abstraction;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.DERIVE__BASE_ABSTRACTION, oldBase_Abstraction,
+				base_Abstraction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueSpecification getComputation() {
+		if (computation != null && computation.eIsProxy()) {
+			InternalEObject oldComputation = (InternalEObject) computation;
+			computation = (ValueSpecification) eResolveProxy(oldComputation);
+			if (computation != oldComputation) {
+				InternalEObject newComputation = (InternalEObject) computation;
+				NotificationChain msgs = oldComputation.eInverseRemove(this,
+					EOPPOSITE_FEATURE_BASE - L2Package.DERIVE__COMPUTATION,
+					null, null);
+				if (newComputation.eInternalContainer() == null) {
+					msgs = newComputation.eInverseAdd(this,
+						EOPPOSITE_FEATURE_BASE - L2Package.DERIVE__COMPUTATION,
+						null, msgs);
+				}
+				if (msgs != null)
+					msgs.dispatch();
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.DERIVE__COMPUTATION, oldComputation,
+						computation));
+			}
+		}
+		return computation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueSpecification basicGetComputation() {
+		return computation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetComputation(
+			ValueSpecification newComputation, NotificationChain msgs) {
+		ValueSpecification oldComputation = computation;
+		computation = newComputation;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this,
+				Notification.SET, L2Package.DERIVE__COMPUTATION,
+				oldComputation, newComputation);
+			if (msgs == null)
+				msgs = notification;
+			else
+				msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setComputation(ValueSpecification newComputation) {
+		if (newComputation != computation) {
+			NotificationChain msgs = null;
+			if (computation != null)
+				msgs = ((InternalEObject) computation).eInverseRemove(this,
+					EOPPOSITE_FEATURE_BASE - L2Package.DERIVE__COMPUTATION,
+					null, msgs);
+			if (newComputation != null)
+				msgs = ((InternalEObject) newComputation).eInverseAdd(this,
+					EOPPOSITE_FEATURE_BASE - L2Package.DERIVE__COMPUTATION,
+					null, msgs);
+			msgs = basicSetComputation(newComputation, msgs);
+			if (msgs != null)
+				msgs.dispatch();
+		} else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.DERIVE__COMPUTATION, newComputation, newComputation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd,
+			int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case L2Package.DERIVE__COMPUTATION :
+				return basicSetComputation(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.DERIVE__BASE_ABSTRACTION :
+				if (resolve)
+					return getBase_Abstraction();
+				return basicGetBase_Abstraction();
+			case L2Package.DERIVE__COMPUTATION :
+				if (resolve)
+					return getComputation();
+				return basicGetComputation();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.DERIVE__BASE_ABSTRACTION :
+				setBase_Abstraction((Abstraction) newValue);
+				return;
+			case L2Package.DERIVE__COMPUTATION :
+				setComputation((ValueSpecification) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.DERIVE__BASE_ABSTRACTION :
+				setBase_Abstraction((Abstraction) null);
+				return;
+			case L2Package.DERIVE__COMPUTATION :
+				setComputation((ValueSpecification) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.DERIVE__BASE_ABSTRACTION :
+				return base_Abstraction != null;
+			case L2Package.DERIVE__COMPUTATION :
+				return computation != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DeriveImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DestroyImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DestroyImpl.java
new file mode 100644
index 0000000..52cce77
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DestroyImpl.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.BehavioralFeature;
+
+import org.eclipse.uml2.uml.profile.l2.Destroy;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Destroy</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DestroyImpl#getBase_BehavioralFeature <em>Base Behavioral Feature</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class DestroyImpl
+		extends EObjectImpl
+		implements Destroy {
+
+	/**
+	 * The cached value of the '{@link #getBase_BehavioralFeature() <em>Base Behavioral Feature</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_BehavioralFeature()
+	 * @generated
+	 * @ordered
+	 */
+	protected BehavioralFeature base_BehavioralFeature;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DestroyImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.DESTROY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BehavioralFeature getBase_BehavioralFeature() {
+		if (base_BehavioralFeature != null && base_BehavioralFeature.eIsProxy()) {
+			InternalEObject oldBase_BehavioralFeature = (InternalEObject) base_BehavioralFeature;
+			base_BehavioralFeature = (BehavioralFeature) eResolveProxy(oldBase_BehavioralFeature);
+			if (base_BehavioralFeature != oldBase_BehavioralFeature) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.DESTROY__BASE_BEHAVIORAL_FEATURE,
+						oldBase_BehavioralFeature, base_BehavioralFeature));
+			}
+		}
+		return base_BehavioralFeature;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BehavioralFeature basicGetBase_BehavioralFeature() {
+		return base_BehavioralFeature;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_BehavioralFeature(
+			BehavioralFeature newBase_BehavioralFeature) {
+		BehavioralFeature oldBase_BehavioralFeature = base_BehavioralFeature;
+		base_BehavioralFeature = newBase_BehavioralFeature;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.DESTROY__BASE_BEHAVIORAL_FEATURE,
+				oldBase_BehavioralFeature, base_BehavioralFeature));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.DESTROY__BASE_BEHAVIORAL_FEATURE :
+				if (resolve)
+					return getBase_BehavioralFeature();
+				return basicGetBase_BehavioralFeature();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.DESTROY__BASE_BEHAVIORAL_FEATURE :
+				setBase_BehavioralFeature((BehavioralFeature) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.DESTROY__BASE_BEHAVIORAL_FEATURE :
+				setBase_BehavioralFeature((BehavioralFeature) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.DESTROY__BASE_BEHAVIORAL_FEATURE :
+				return base_BehavioralFeature != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DestroyImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DocumentImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DocumentImpl.java
new file mode 100644
index 0000000..a618593
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/DocumentImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.uml2.uml.Artifact;
+
+import org.eclipse.uml2.uml.profile.l2.Document;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Document</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.DocumentImpl#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class DocumentImpl
+		extends FileImpl
+		implements Document {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DocumentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.DOCUMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact getBase_Artifact() {
+		if (base_Artifact != null && base_Artifact.eIsProxy()) {
+			InternalEObject oldBase_Artifact = (InternalEObject) base_Artifact;
+			base_Artifact = (Artifact) eResolveProxy(oldBase_Artifact);
+			if (base_Artifact != oldBase_Artifact) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.DOCUMENT__BASE_ARTIFACT, oldBase_Artifact,
+						base_Artifact));
+			}
+		}
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact basicGetBase_Artifact() {
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBase_Artifact(Artifact newBase_Artifact) {
+		Artifact oldBase_Artifact = base_Artifact;
+		base_Artifact = newBase_Artifact;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.DOCUMENT__BASE_ARTIFACT, oldBase_Artifact,
+				base_Artifact));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetBase_Artifact() {
+		return base_Artifact != null;
+	}
+
+} //DocumentImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/EntityImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/EntityImpl.java
new file mode 100644
index 0000000..9abc7d4
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/EntityImpl.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Component;
+
+import org.eclipse.uml2.uml.profile.l2.Entity;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Entity</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.EntityImpl#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class EntityImpl
+		extends EObjectImpl
+		implements Entity {
+
+	/**
+	 * The cached value of the '{@link #getBase_Component() <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Component()
+	 * @generated
+	 * @ordered
+	 */
+	protected Component base_Component;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EntityImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.ENTITY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component getBase_Component() {
+		if (base_Component != null && base_Component.eIsProxy()) {
+			InternalEObject oldBase_Component = (InternalEObject) base_Component;
+			base_Component = (Component) eResolveProxy(oldBase_Component);
+			if (base_Component != oldBase_Component) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.ENTITY__BASE_COMPONENT, oldBase_Component,
+						base_Component));
+			}
+		}
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component basicGetBase_Component() {
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Component(Component newBase_Component) {
+		Component oldBase_Component = base_Component;
+		base_Component = newBase_Component;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.ENTITY__BASE_COMPONENT, oldBase_Component,
+				base_Component));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.ENTITY__BASE_COMPONENT :
+				if (resolve)
+					return getBase_Component();
+				return basicGetBase_Component();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.ENTITY__BASE_COMPONENT :
+				setBase_Component((Component) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.ENTITY__BASE_COMPONENT :
+				setBase_Component((Component) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.ENTITY__BASE_COMPONENT :
+				return base_Component != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //EntityImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ExecutableImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ExecutableImpl.java
new file mode 100644
index 0000000..431c666
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ExecutableImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.uml2.uml.Artifact;
+
+import org.eclipse.uml2.uml.profile.l2.Executable;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Executable</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ExecutableImpl#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ExecutableImpl
+		extends FileImpl
+		implements Executable {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExecutableImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.EXECUTABLE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact getBase_Artifact() {
+		if (base_Artifact != null && base_Artifact.eIsProxy()) {
+			InternalEObject oldBase_Artifact = (InternalEObject) base_Artifact;
+			base_Artifact = (Artifact) eResolveProxy(oldBase_Artifact);
+			if (base_Artifact != oldBase_Artifact) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.EXECUTABLE__BASE_ARTIFACT, oldBase_Artifact,
+						base_Artifact));
+			}
+		}
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact basicGetBase_Artifact() {
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBase_Artifact(Artifact newBase_Artifact) {
+		Artifact oldBase_Artifact = base_Artifact;
+		base_Artifact = newBase_Artifact;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.EXECUTABLE__BASE_ARTIFACT, oldBase_Artifact,
+				base_Artifact));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetBase_Artifact() {
+		return base_Artifact != null;
+	}
+
+} //ExecutableImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FileImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FileImpl.java
new file mode 100644
index 0000000..4c908a1
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FileImpl.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Artifact;
+
+import org.eclipse.uml2.uml.profile.l2.File;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>File</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FileImpl#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public abstract class FileImpl
+		extends EObjectImpl
+		implements File {
+
+	/**
+	 * The cached value of the '{@link #getBase_Artifact() <em>Base Artifact</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Artifact()
+	 * @generated
+	 * @ordered
+	 */
+	protected Artifact base_Artifact;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FileImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.FILE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Artifact getBase_Artifact() {
+		if (base_Artifact != null && base_Artifact.eIsProxy()) {
+			InternalEObject oldBase_Artifact = (InternalEObject) base_Artifact;
+			base_Artifact = (Artifact) eResolveProxy(oldBase_Artifact);
+			if (base_Artifact != oldBase_Artifact) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.FILE__BASE_ARTIFACT, oldBase_Artifact,
+						base_Artifact));
+			}
+		}
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Artifact basicGetBase_Artifact() {
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Artifact(Artifact newBase_Artifact) {
+		Artifact oldBase_Artifact = base_Artifact;
+		base_Artifact = newBase_Artifact;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.FILE__BASE_ARTIFACT, oldBase_Artifact, base_Artifact));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.FILE__BASE_ARTIFACT :
+				if (resolve)
+					return getBase_Artifact();
+				return basicGetBase_Artifact();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.FILE__BASE_ARTIFACT :
+				setBase_Artifact((Artifact) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.FILE__BASE_ARTIFACT :
+				setBase_Artifact((Artifact) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.FILE__BASE_ARTIFACT :
+				return base_Artifact != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //FileImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FocusImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FocusImpl.java
new file mode 100644
index 0000000..c3458c6
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FocusImpl.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.Focus;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Focus</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FocusImpl#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FocusImpl
+		extends EObjectImpl
+		implements Focus {
+
+	/**
+	 * The cached value of the '{@link #getBase_Class() <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Class()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Class base_Class;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FocusImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.FOCUS;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class getBase_Class() {
+		if (base_Class != null && base_Class.eIsProxy()) {
+			InternalEObject oldBase_Class = (InternalEObject) base_Class;
+			base_Class = (org.eclipse.uml2.uml.Class) eResolveProxy(oldBase_Class);
+			if (base_Class != oldBase_Class) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.FOCUS__BASE_CLASS, oldBase_Class, base_Class));
+			}
+		}
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class basicGetBase_Class() {
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Class(org.eclipse.uml2.uml.Class newBase_Class) {
+		org.eclipse.uml2.uml.Class oldBase_Class = base_Class;
+		base_Class = newBase_Class;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.FOCUS__BASE_CLASS, oldBase_Class, base_Class));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.FOCUS__BASE_CLASS :
+				if (resolve)
+					return getBase_Class();
+				return basicGetBase_Class();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.FOCUS__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.FOCUS__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.FOCUS__BASE_CLASS :
+				return base_Class != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //FocusImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FrameworkImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FrameworkImpl.java
new file mode 100644
index 0000000..39119c1
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/FrameworkImpl.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.Framework;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Framework</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.FrameworkImpl#getBase_Package <em>Base Package</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FrameworkImpl
+		extends EObjectImpl
+		implements Framework {
+
+	/**
+	 * The cached value of the '{@link #getBase_Package() <em>Base Package</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Package()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Package base_Package;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FrameworkImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.FRAMEWORK;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Package getBase_Package() {
+		if (base_Package != null && base_Package.eIsProxy()) {
+			InternalEObject oldBase_Package = (InternalEObject) base_Package;
+			base_Package = (org.eclipse.uml2.uml.Package) eResolveProxy(oldBase_Package);
+			if (base_Package != oldBase_Package) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.FRAMEWORK__BASE_PACKAGE, oldBase_Package,
+						base_Package));
+			}
+		}
+		return base_Package;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Package basicGetBase_Package() {
+		return base_Package;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Package(org.eclipse.uml2.uml.Package newBase_Package) {
+		org.eclipse.uml2.uml.Package oldBase_Package = base_Package;
+		base_Package = newBase_Package;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.FRAMEWORK__BASE_PACKAGE, oldBase_Package,
+				base_Package));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.FRAMEWORK__BASE_PACKAGE :
+				if (resolve)
+					return getBase_Package();
+				return basicGetBase_Package();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.FRAMEWORK__BASE_PACKAGE :
+				setBase_Package((org.eclipse.uml2.uml.Package) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.FRAMEWORK__BASE_PACKAGE :
+				setBase_Package((org.eclipse.uml2.uml.Package) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.FRAMEWORK__BASE_PACKAGE :
+				return base_Package != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //FrameworkImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ImplementImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ImplementImpl.java
new file mode 100644
index 0000000..119d6f8
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ImplementImpl.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Component;
+
+import org.eclipse.uml2.uml.profile.l2.Implement;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.ImplementOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Implement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementImpl#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ImplementImpl
+		extends EObjectImpl
+		implements Implement {
+
+	/**
+	 * The cached value of the '{@link #getBase_Component() <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Component()
+	 * @generated
+	 * @ordered
+	 */
+	protected Component base_Component;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ImplementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.IMPLEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component getBase_Component() {
+		if (base_Component != null && base_Component.eIsProxy()) {
+			InternalEObject oldBase_Component = (InternalEObject) base_Component;
+			base_Component = (Component) eResolveProxy(oldBase_Component);
+			if (base_Component != oldBase_Component) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.IMPLEMENT__BASE_COMPONENT, oldBase_Component,
+						base_Component));
+			}
+		}
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component basicGetBase_Component() {
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Component(Component newBase_Component) {
+		Component oldBase_Component = base_Component;
+		base_Component = newBase_Component;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.IMPLEMENT__BASE_COMPONENT, oldBase_Component,
+				base_Component));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateImplementsSpecification(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return ImplementOperations.validateImplementsSpecification(this,
+			diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.IMPLEMENT__BASE_COMPONENT :
+				if (resolve)
+					return getBase_Component();
+				return basicGetBase_Component();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.IMPLEMENT__BASE_COMPONENT :
+				setBase_Component((Component) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.IMPLEMENT__BASE_COMPONENT :
+				setBase_Component((Component) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.IMPLEMENT__BASE_COMPONENT :
+				return base_Component != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.IMPLEMENT___VALIDATE_IMPLEMENTS_SPECIFICATION__DIAGNOSTICCHAIN_MAP :
+				return validateImplementsSpecification(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //ImplementImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ImplementationClassImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ImplementationClassImpl.java
new file mode 100644
index 0000000..dfac4b2
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ImplementationClassImpl.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.ImplementationClassOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Implementation Class</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ImplementationClassImpl#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ImplementationClassImpl
+		extends EObjectImpl
+		implements ImplementationClass {
+
+	/**
+	 * The cached value of the '{@link #getBase_Class() <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Class()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Class base_Class;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ImplementationClassImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.IMPLEMENTATION_CLASS;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class getBase_Class() {
+		if (base_Class != null && base_Class.eIsProxy()) {
+			InternalEObject oldBase_Class = (InternalEObject) base_Class;
+			base_Class = (org.eclipse.uml2.uml.Class) eResolveProxy(oldBase_Class);
+			if (base_Class != oldBase_Class) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.IMPLEMENTATION_CLASS__BASE_CLASS,
+						oldBase_Class, base_Class));
+			}
+		}
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class basicGetBase_Class() {
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Class(org.eclipse.uml2.uml.Class newBase_Class) {
+		org.eclipse.uml2.uml.Class oldBase_Class = base_Class;
+		base_Class = newBase_Class;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.IMPLEMENTATION_CLASS__BASE_CLASS, oldBase_Class,
+				base_Class));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCannotBeRealization(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return ImplementationClassOperations.validateCannotBeRealization(this,
+			diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.IMPLEMENTATION_CLASS__BASE_CLASS :
+				if (resolve)
+					return getBase_Class();
+				return basicGetBase_Class();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.IMPLEMENTATION_CLASS__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.IMPLEMENTATION_CLASS__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.IMPLEMENTATION_CLASS__BASE_CLASS :
+				return base_Class != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.IMPLEMENTATION_CLASS___VALIDATE_CANNOT_BE_REALIZATION__DIAGNOSTICCHAIN_MAP :
+				return validateCannotBeRealization(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //ImplementationClassImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/InstantiateImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/InstantiateImpl.java
new file mode 100644
index 0000000..a096d31
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/InstantiateImpl.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Usage;
+
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.InstantiateOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Instantiate</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.InstantiateImpl#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class InstantiateImpl
+		extends EObjectImpl
+		implements Instantiate {
+
+	/**
+	 * The cached value of the '{@link #getBase_Usage() <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Usage()
+	 * @generated
+	 * @ordered
+	 */
+	protected Usage base_Usage;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InstantiateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.INSTANTIATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage getBase_Usage() {
+		if (base_Usage != null && base_Usage.eIsProxy()) {
+			InternalEObject oldBase_Usage = (InternalEObject) base_Usage;
+			base_Usage = (Usage) eResolveProxy(oldBase_Usage);
+			if (base_Usage != oldBase_Usage) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.INSTANTIATE__BASE_USAGE, oldBase_Usage,
+						base_Usage));
+			}
+		}
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage basicGetBase_Usage() {
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Usage(Usage newBase_Usage) {
+		Usage oldBase_Usage = base_Usage;
+		base_Usage = newBase_Usage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.INSTANTIATE__BASE_USAGE, oldBase_Usage, base_Usage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateClientAndSupplierAreClassifiers(
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return InstantiateOperations.validateClientAndSupplierAreClassifiers(
+			this, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.INSTANTIATE__BASE_USAGE :
+				if (resolve)
+					return getBase_Usage();
+				return basicGetBase_Usage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.INSTANTIATE__BASE_USAGE :
+				setBase_Usage((Usage) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.INSTANTIATE__BASE_USAGE :
+				setBase_Usage((Usage) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.INSTANTIATE__BASE_USAGE :
+				return base_Usage != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.INSTANTIATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP :
+				return validateClientAndSupplierAreClassifiers(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //InstantiateImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/L2FactoryImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/L2FactoryImpl.java
new file mode 100644
index 0000000..6347008
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/L2FactoryImpl.java
@@ -0,0 +1,474 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.uml2.uml.profile.l2.Auxiliary;
+import org.eclipse.uml2.uml.profile.l2.Call;
+import org.eclipse.uml2.uml.profile.l2.Create;
+import org.eclipse.uml2.uml.profile.l2.Derive;
+import org.eclipse.uml2.uml.profile.l2.Destroy;
+import org.eclipse.uml2.uml.profile.l2.Document;
+import org.eclipse.uml2.uml.profile.l2.Entity;
+import org.eclipse.uml2.uml.profile.l2.Executable;
+import org.eclipse.uml2.uml.profile.l2.Focus;
+import org.eclipse.uml2.uml.profile.l2.Framework;
+import org.eclipse.uml2.uml.profile.l2.Implement;
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+import org.eclipse.uml2.uml.profile.l2.L2Factory;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Library;
+import org.eclipse.uml2.uml.profile.l2.Metaclass;
+import org.eclipse.uml2.uml.profile.l2.ModelLibrary;
+import org.eclipse.uml2.uml.profile.l2.Realization;
+import org.eclipse.uml2.uml.profile.l2.Refine;
+import org.eclipse.uml2.uml.profile.l2.Responsibility;
+import org.eclipse.uml2.uml.profile.l2.Script;
+import org.eclipse.uml2.uml.profile.l2.Send;
+import org.eclipse.uml2.uml.profile.l2.Service;
+import org.eclipse.uml2.uml.profile.l2.Source;
+import org.eclipse.uml2.uml.profile.l2.Specification;
+import org.eclipse.uml2.uml.profile.l2.Subsystem;
+import org.eclipse.uml2.uml.profile.l2.Trace;
+import org.eclipse.uml2.uml.profile.l2.Type;
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class L2FactoryImpl
+		extends EFactoryImpl
+		implements L2Factory {
+
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static L2Factory init() {
+		try {
+			L2Factory theL2Factory = (L2Factory) EPackage.Registry.INSTANCE
+				.getEFactory("http://www.eclipse.org/uml2/4.0.0/UML/Profile/L2"); //$NON-NLS-1$ 
+			if (theL2Factory != null) {
+				return theL2Factory;
+			}
+		} catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new L2FactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2FactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case L2Package.AUXILIARY :
+				return createAuxiliary();
+			case L2Package.CALL :
+				return createCall();
+			case L2Package.CREATE :
+				return createCreate();
+			case L2Package.DERIVE :
+				return createDerive();
+			case L2Package.DESTROY :
+				return createDestroy();
+			case L2Package.DOCUMENT :
+				return createDocument();
+			case L2Package.ENTITY :
+				return createEntity();
+			case L2Package.EXECUTABLE :
+				return createExecutable();
+			case L2Package.FOCUS :
+				return createFocus();
+			case L2Package.FRAMEWORK :
+				return createFramework();
+			case L2Package.IMPLEMENT :
+				return createImplement();
+			case L2Package.IMPLEMENTATION_CLASS :
+				return createImplementationClass();
+			case L2Package.INSTANTIATE :
+				return createInstantiate();
+			case L2Package.LIBRARY :
+				return createLibrary();
+			case L2Package.METACLASS :
+				return createMetaclass();
+			case L2Package.MODEL_LIBRARY :
+				return createModelLibrary();
+			case L2Package.PROCESS :
+				return createProcess();
+			case L2Package.REALIZATION :
+				return createRealization();
+			case L2Package.REFINE :
+				return createRefine();
+			case L2Package.RESPONSIBILITY :
+				return createResponsibility();
+			case L2Package.SCRIPT :
+				return createScript();
+			case L2Package.SEND :
+				return createSend();
+			case L2Package.SERVICE :
+				return createService();
+			case L2Package.SOURCE :
+				return createSource();
+			case L2Package.SPECIFICATION :
+				return createSpecification();
+			case L2Package.SUBSYSTEM :
+				return createSubsystem();
+			case L2Package.TRACE :
+				return createTrace();
+			case L2Package.TYPE :
+				return createType();
+			case L2Package.UTILITY :
+				return createUtility();
+			default :
+				throw new IllegalArgumentException(
+					"The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Auxiliary createAuxiliary() {
+		AuxiliaryImpl auxiliary = new AuxiliaryImpl();
+		return auxiliary;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Call createCall() {
+		CallImpl call = new CallImpl();
+		return call;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Create createCreate() {
+		CreateImpl create = new CreateImpl();
+		return create;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Derive createDerive() {
+		DeriveImpl derive = new DeriveImpl();
+		return derive;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Destroy createDestroy() {
+		DestroyImpl destroy = new DestroyImpl();
+		return destroy;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Document createDocument() {
+		DocumentImpl document = new DocumentImpl();
+		return document;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Entity createEntity() {
+		EntityImpl entity = new EntityImpl();
+		return entity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Executable createExecutable() {
+		ExecutableImpl executable = new ExecutableImpl();
+		return executable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Focus createFocus() {
+		FocusImpl focus = new FocusImpl();
+		return focus;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Framework createFramework() {
+		FrameworkImpl framework = new FrameworkImpl();
+		return framework;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Implement createImplement() {
+		ImplementImpl implement = new ImplementImpl();
+		return implement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ImplementationClass createImplementationClass() {
+		ImplementationClassImpl implementationClass = new ImplementationClassImpl();
+		return implementationClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Instantiate createInstantiate() {
+		InstantiateImpl instantiate = new InstantiateImpl();
+		return instantiate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Library createLibrary() {
+		LibraryImpl library = new LibraryImpl();
+		return library;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Metaclass createMetaclass() {
+		MetaclassImpl metaclass = new MetaclassImpl();
+		return metaclass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelLibrary createModelLibrary() {
+		ModelLibraryImpl modelLibrary = new ModelLibraryImpl();
+		return modelLibrary;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.profile.l2.Process createProcess() {
+		ProcessImpl process = new ProcessImpl();
+		return process;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Realization createRealization() {
+		RealizationImpl realization = new RealizationImpl();
+		return realization;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Refine createRefine() {
+		RefineImpl refine = new RefineImpl();
+		return refine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Responsibility createResponsibility() {
+		ResponsibilityImpl responsibility = new ResponsibilityImpl();
+		return responsibility;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Script createScript() {
+		ScriptImpl script = new ScriptImpl();
+		return script;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Send createSend() {
+		SendImpl send = new SendImpl();
+		return send;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Service createService() {
+		ServiceImpl service = new ServiceImpl();
+		return service;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Source createSource() {
+		SourceImpl source = new SourceImpl();
+		return source;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Specification createSpecification() {
+		SpecificationImpl specification = new SpecificationImpl();
+		return specification;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Subsystem createSubsystem() {
+		SubsystemImpl subsystem = new SubsystemImpl();
+		return subsystem;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Trace createTrace() {
+		TraceImpl trace = new TraceImpl();
+		return trace;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Type createType() {
+		TypeImpl type = new TypeImpl();
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Utility createUtility() {
+		UtilityImpl utility = new UtilityImpl();
+		return utility;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2Package getL2Package() {
+		return (L2Package) getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static L2Package getPackage() {
+		return L2Package.eINSTANCE;
+	}
+
+} //L2FactoryImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/L2PackageImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/L2PackageImpl.java
new file mode 100644
index 0000000..090ead2
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/L2PackageImpl.java
@@ -0,0 +1,1544 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EValidator;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.uml2.uml.UMLPackage;
+
+import org.eclipse.uml2.uml.profile.l2.Auxiliary;
+import org.eclipse.uml2.uml.profile.l2.Call;
+import org.eclipse.uml2.uml.profile.l2.Create;
+import org.eclipse.uml2.uml.profile.l2.Derive;
+import org.eclipse.uml2.uml.profile.l2.Destroy;
+import org.eclipse.uml2.uml.profile.l2.Document;
+import org.eclipse.uml2.uml.profile.l2.Entity;
+import org.eclipse.uml2.uml.profile.l2.Executable;
+import org.eclipse.uml2.uml.profile.l2.File;
+import org.eclipse.uml2.uml.profile.l2.Focus;
+import org.eclipse.uml2.uml.profile.l2.Framework;
+import org.eclipse.uml2.uml.profile.l2.Implement;
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+import org.eclipse.uml2.uml.profile.l2.L2Factory;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Library;
+import org.eclipse.uml2.uml.profile.l2.Metaclass;
+import org.eclipse.uml2.uml.profile.l2.ModelLibrary;
+import org.eclipse.uml2.uml.profile.l2.Realization;
+import org.eclipse.uml2.uml.profile.l2.Refine;
+import org.eclipse.uml2.uml.profile.l2.Responsibility;
+import org.eclipse.uml2.uml.profile.l2.Script;
+import org.eclipse.uml2.uml.profile.l2.Send;
+import org.eclipse.uml2.uml.profile.l2.Service;
+import org.eclipse.uml2.uml.profile.l2.Source;
+import org.eclipse.uml2.uml.profile.l2.Specification;
+import org.eclipse.uml2.uml.profile.l2.Subsystem;
+import org.eclipse.uml2.uml.profile.l2.Trace;
+import org.eclipse.uml2.uml.profile.l2.Type;
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class L2PackageImpl
+		extends EPackageImpl
+		implements L2Package {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass auxiliaryEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass callEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass createEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass deriveEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass destroyEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass documentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass fileEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass entityEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass executableEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass focusEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass frameworkEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass implementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass implementationClassEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass instantiateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass libraryEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass metaclassEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass modelLibraryEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass processEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass realizationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass refineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass responsibilityEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass scriptEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass sendEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass serviceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass sourceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass specificationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass subsystemEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass traceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass typeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass utilityEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.uml2.uml.profile.l2.L2Package#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private L2PackageImpl() {
+		super(eNS_URI, L2Factory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link L2Package#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static L2Package init() {
+		if (isInited)
+			return (L2Package) EPackage.Registry.INSTANCE
+				.getEPackage(L2Package.eNS_URI);
+
+		// Obtain or create and register package
+		L2PackageImpl theL2Package = (L2PackageImpl) (EPackage.Registry.INSTANCE
+			.get(eNS_URI) instanceof L2PackageImpl
+			? EPackage.Registry.INSTANCE.get(eNS_URI)
+			: new L2PackageImpl());
+
+		isInited = true;
+
+		// Initialize simple dependencies
+		UMLPackage.eINSTANCE.eClass();
+
+		// Create package meta-data objects
+		theL2Package.createPackageContents();
+
+		// Initialize created meta-data
+		theL2Package.initializePackageContents();
+
+		// Register package validator
+		EValidator.Registry.INSTANCE.put(theL2Package,
+			new EValidator.Descriptor() {
+
+				public EValidator getEValidator() {
+					return L2Validator.INSTANCE;
+				}
+			});
+
+		// Mark meta-data to indicate it can't be changed
+		theL2Package.freeze();
+
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(L2Package.eNS_URI, theL2Package);
+		return theL2Package;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAuxiliary() {
+		return auxiliaryEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAuxiliary_Base_Class() {
+		return (EReference) auxiliaryEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getCall() {
+		return callEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getCall_Base_Usage() {
+		return (EReference) callEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getCall__ValidateClientAndSupplierAreOperations__DiagnosticChain_Map() {
+		return callEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getCreate() {
+		return createEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getCreate_Base_BehavioralFeature() {
+		return (EReference) createEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getCreate_Base_Usage() {
+		return (EReference) createEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getCreate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map() {
+		return createEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDerive() {
+		return deriveEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDerive_Base_Abstraction() {
+		return (EReference) deriveEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDerive_Computation() {
+		return (EReference) deriveEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDestroy() {
+		return destroyEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDestroy_Base_BehavioralFeature() {
+		return (EReference) destroyEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDocument() {
+		return documentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFile() {
+		return fileEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getFile_Base_Artifact() {
+		return (EReference) fileEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getEntity() {
+		return entityEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntity_Base_Component() {
+		return (EReference) entityEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExecutable() {
+		return executableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFocus() {
+		return focusEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getFocus_Base_Class() {
+		return (EReference) focusEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFramework() {
+		return frameworkEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getFramework_Base_Package() {
+		return (EReference) frameworkEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getImplement() {
+		return implementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getImplement_Base_Component() {
+		return (EReference) implementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getImplement__ValidateImplementsSpecification__DiagnosticChain_Map() {
+		return implementEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getImplementationClass() {
+		return implementationClassEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getImplementationClass_Base_Class() {
+		return (EReference) implementationClassEClass.getEStructuralFeatures()
+			.get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getImplementationClass__ValidateCannotBeRealization__DiagnosticChain_Map() {
+		return implementationClassEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInstantiate() {
+		return instantiateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInstantiate_Base_Usage() {
+		return (EReference) instantiateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getInstantiate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map() {
+		return instantiateEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLibrary() {
+		return libraryEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getMetaclass() {
+		return metaclassEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMetaclass_Base_Class() {
+		return (EReference) metaclassEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getModelLibrary() {
+		return modelLibraryEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelLibrary_Base_Package() {
+		return (EReference) modelLibraryEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProcess() {
+		return processEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProcess_Base_Component() {
+		return (EReference) processEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRealization() {
+		return realizationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRealization_Base_Classifier() {
+		return (EReference) realizationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getRealization__ValidateCannotBeImplementationClass__DiagnosticChain_Map() {
+		return realizationEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRefine() {
+		return refineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRefine_Base_Abstraction() {
+		return (EReference) refineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getResponsibility() {
+		return responsibilityEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResponsibility_Base_Usage() {
+		return (EReference) responsibilityEClass.getEStructuralFeatures()
+			.get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getScript() {
+		return scriptEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSend() {
+		return sendEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSend_Base_Usage() {
+		return (EReference) sendEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getSend__ValidateClientOperationSendsSupplierSignal__DiagnosticChain_Map() {
+		return sendEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getService() {
+		return serviceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getService_Base_Component() {
+		return (EReference) serviceEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSource() {
+		return sourceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSpecification() {
+		return specificationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSpecification_Base_Classifier() {
+		return (EReference) specificationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getSpecification__ValidateCannotBeType__DiagnosticChain_Map() {
+		return specificationEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSubsystem() {
+		return subsystemEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSubsystem_Base_Component() {
+		return (EReference) subsystemEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTrace() {
+		return traceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTrace_Base_Abstraction() {
+		return (EReference) traceEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getType() {
+		return typeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getType_Base_Class() {
+		return (EReference) typeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getType__ValidateCannotBeSpecification__DiagnosticChain_Map() {
+		return typeEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getUtility() {
+		return utilityEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getUtility_Base_Class() {
+		return (EReference) utilityEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getUtility__ValidateIsUtility__DiagnosticChain_Map() {
+		return utilityEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2Factory getL2Factory() {
+		return (L2Factory) getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated)
+			return;
+		isCreated = true;
+
+		// Create classes and their features
+		auxiliaryEClass = createEClass(AUXILIARY);
+		createEReference(auxiliaryEClass, AUXILIARY__BASE_CLASS);
+
+		callEClass = createEClass(CALL);
+		createEReference(callEClass, CALL__BASE_USAGE);
+		createEOperation(callEClass,
+			CALL___VALIDATE_CLIENT_AND_SUPPLIER_ARE_OPERATIONS__DIAGNOSTICCHAIN_MAP);
+
+		createEClass = createEClass(CREATE);
+		createEReference(createEClass, CREATE__BASE_BEHAVIORAL_FEATURE);
+		createEReference(createEClass, CREATE__BASE_USAGE);
+		createEOperation(createEClass,
+			CREATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP);
+
+		deriveEClass = createEClass(DERIVE);
+		createEReference(deriveEClass, DERIVE__BASE_ABSTRACTION);
+		createEReference(deriveEClass, DERIVE__COMPUTATION);
+
+		destroyEClass = createEClass(DESTROY);
+		createEReference(destroyEClass, DESTROY__BASE_BEHAVIORAL_FEATURE);
+
+		documentEClass = createEClass(DOCUMENT);
+
+		fileEClass = createEClass(FILE);
+		createEReference(fileEClass, FILE__BASE_ARTIFACT);
+
+		entityEClass = createEClass(ENTITY);
+		createEReference(entityEClass, ENTITY__BASE_COMPONENT);
+
+		executableEClass = createEClass(EXECUTABLE);
+
+		focusEClass = createEClass(FOCUS);
+		createEReference(focusEClass, FOCUS__BASE_CLASS);
+
+		frameworkEClass = createEClass(FRAMEWORK);
+		createEReference(frameworkEClass, FRAMEWORK__BASE_PACKAGE);
+
+		implementEClass = createEClass(IMPLEMENT);
+		createEReference(implementEClass, IMPLEMENT__BASE_COMPONENT);
+		createEOperation(implementEClass,
+			IMPLEMENT___VALIDATE_IMPLEMENTS_SPECIFICATION__DIAGNOSTICCHAIN_MAP);
+
+		implementationClassEClass = createEClass(IMPLEMENTATION_CLASS);
+		createEReference(implementationClassEClass,
+			IMPLEMENTATION_CLASS__BASE_CLASS);
+		createEOperation(implementationClassEClass,
+			IMPLEMENTATION_CLASS___VALIDATE_CANNOT_BE_REALIZATION__DIAGNOSTICCHAIN_MAP);
+
+		instantiateEClass = createEClass(INSTANTIATE);
+		createEReference(instantiateEClass, INSTANTIATE__BASE_USAGE);
+		createEOperation(instantiateEClass,
+			INSTANTIATE___VALIDATE_CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS__DIAGNOSTICCHAIN_MAP);
+
+		libraryEClass = createEClass(LIBRARY);
+
+		metaclassEClass = createEClass(METACLASS);
+		createEReference(metaclassEClass, METACLASS__BASE_CLASS);
+
+		modelLibraryEClass = createEClass(MODEL_LIBRARY);
+		createEReference(modelLibraryEClass, MODEL_LIBRARY__BASE_PACKAGE);
+
+		processEClass = createEClass(PROCESS);
+		createEReference(processEClass, PROCESS__BASE_COMPONENT);
+
+		realizationEClass = createEClass(REALIZATION);
+		createEReference(realizationEClass, REALIZATION__BASE_CLASSIFIER);
+		createEOperation(realizationEClass,
+			REALIZATION___VALIDATE_CANNOT_BE_IMPLEMENTATION_CLASS__DIAGNOSTICCHAIN_MAP);
+
+		refineEClass = createEClass(REFINE);
+		createEReference(refineEClass, REFINE__BASE_ABSTRACTION);
+
+		responsibilityEClass = createEClass(RESPONSIBILITY);
+		createEReference(responsibilityEClass, RESPONSIBILITY__BASE_USAGE);
+
+		scriptEClass = createEClass(SCRIPT);
+
+		sendEClass = createEClass(SEND);
+		createEReference(sendEClass, SEND__BASE_USAGE);
+		createEOperation(sendEClass,
+			SEND___VALIDATE_CLIENT_OPERATION_SENDS_SUPPLIER_SIGNAL__DIAGNOSTICCHAIN_MAP);
+
+		serviceEClass = createEClass(SERVICE);
+		createEReference(serviceEClass, SERVICE__BASE_COMPONENT);
+
+		sourceEClass = createEClass(SOURCE);
+
+		specificationEClass = createEClass(SPECIFICATION);
+		createEReference(specificationEClass, SPECIFICATION__BASE_CLASSIFIER);
+		createEOperation(specificationEClass,
+			SPECIFICATION___VALIDATE_CANNOT_BE_TYPE__DIAGNOSTICCHAIN_MAP);
+
+		subsystemEClass = createEClass(SUBSYSTEM);
+		createEReference(subsystemEClass, SUBSYSTEM__BASE_COMPONENT);
+
+		traceEClass = createEClass(TRACE);
+		createEReference(traceEClass, TRACE__BASE_ABSTRACTION);
+
+		typeEClass = createEClass(TYPE);
+		createEReference(typeEClass, TYPE__BASE_CLASS);
+		createEOperation(typeEClass,
+			TYPE___VALIDATE_CANNOT_BE_SPECIFICATION__DIAGNOSTICCHAIN_MAP);
+
+		utilityEClass = createEClass(UTILITY);
+		createEReference(utilityEClass, UTILITY__BASE_CLASS);
+		createEOperation(utilityEClass,
+			UTILITY___VALIDATE_IS_UTILITY__DIAGNOSTICCHAIN_MAP);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized)
+			return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		UMLPackage theUMLPackage = (UMLPackage) EPackage.Registry.INSTANCE
+			.getEPackage(UMLPackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		documentEClass.getESuperTypes().add(this.getFile());
+		executableEClass.getESuperTypes().add(this.getFile());
+		libraryEClass.getESuperTypes().add(this.getFile());
+		scriptEClass.getESuperTypes().add(this.getFile());
+		sourceEClass.getESuperTypes().add(this.getFile());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(
+			auxiliaryEClass,
+			Auxiliary.class,
+			"Auxiliary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getAuxiliary_Base_Class(),
+			theUMLPackage.getClass_(),
+			null,
+			"base_Class", null, 1, 1, Auxiliary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(callEClass, Call.class,
+			"Call", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getCall_Base_Usage(),
+			theUMLPackage.getUsage(),
+			null,
+			"base_Usage", null, 1, 1, Call.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		EOperation op = initEOperation(
+			getCall__ValidateClientAndSupplierAreOperations__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateClientAndSupplierAreOperations", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		EGenericType g1 = createEGenericType(ecorePackage.getEMap());
+		EGenericType g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(createEClass, Create.class,
+			"Create", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getCreate_Base_BehavioralFeature(),
+			theUMLPackage.getBehavioralFeature(),
+			null,
+			"base_BehavioralFeature", null, 1, 1, Create.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+		initEReference(
+			getCreate_Base_Usage(),
+			theUMLPackage.getUsage(),
+			null,
+			"base_Usage", null, 1, 1, Create.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getCreate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateClientAndSupplierAreClassifiers", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(deriveEClass, Derive.class,
+			"Derive", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getDerive_Base_Abstraction(),
+			theUMLPackage.getAbstraction(),
+			null,
+			"base_Abstraction", null, 1, 1, Derive.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+		initEReference(
+			getDerive_Computation(),
+			theUMLPackage.getValueSpecification(),
+			null,
+			"computation", null, 1, 1, Derive.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(destroyEClass, Destroy.class,
+			"Destroy", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getDestroy_Base_BehavioralFeature(),
+			theUMLPackage.getBehavioralFeature(),
+			null,
+			"base_BehavioralFeature", null, 1, 1, Destroy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			documentEClass,
+			Document.class,
+			"Document", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
+		initEClass(fileEClass, File.class,
+			"File", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getFile_Base_Artifact(),
+			theUMLPackage.getArtifact(),
+			null,
+			"base_Artifact", null, 1, 1, File.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(entityEClass, Entity.class,
+			"Entity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getEntity_Base_Component(),
+			theUMLPackage.getComponent(),
+			null,
+			"base_Component", null, 1, 1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			executableEClass,
+			Executable.class,
+			"Executable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
+		initEClass(focusEClass, Focus.class,
+			"Focus", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getFocus_Base_Class(),
+			theUMLPackage.getClass_(),
+			null,
+			"base_Class", null, 1, 1, Focus.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			frameworkEClass,
+			Framework.class,
+			"Framework", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getFramework_Base_Package(),
+			theUMLPackage.getPackage(),
+			null,
+			"base_Package", null, 1, 1, Framework.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			implementEClass,
+			Implement.class,
+			"Implement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getImplement_Base_Component(),
+			theUMLPackage.getComponent(),
+			null,
+			"base_Component", null, 1, 1, Implement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getImplement__ValidateImplementsSpecification__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateImplementsSpecification", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			implementationClassEClass,
+			ImplementationClass.class,
+			"ImplementationClass", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getImplementationClass_Base_Class(),
+			theUMLPackage.getClass_(),
+			null,
+			"base_Class", null, 1, 1, ImplementationClass.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getImplementationClass__ValidateCannotBeRealization__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateCannotBeRealization", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			instantiateEClass,
+			Instantiate.class,
+			"Instantiate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getInstantiate_Base_Usage(),
+			theUMLPackage.getUsage(),
+			null,
+			"base_Usage", null, 1, 1, Instantiate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getInstantiate__ValidateClientAndSupplierAreClassifiers__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateClientAndSupplierAreClassifiers", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(libraryEClass, Library.class,
+			"Library", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
+		initEClass(
+			metaclassEClass,
+			Metaclass.class,
+			"Metaclass", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getMetaclass_Base_Class(),
+			theUMLPackage.getClass_(),
+			null,
+			"base_Class", null, 1, 1, Metaclass.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			modelLibraryEClass,
+			ModelLibrary.class,
+			"ModelLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getModelLibrary_Base_Package(),
+			theUMLPackage.getPackage(),
+			null,
+			"base_Package", null, 1, 1, ModelLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(processEClass,
+			org.eclipse.uml2.uml.profile.l2.Process.class,
+			"Process", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getProcess_Base_Component(),
+			theUMLPackage.getComponent(),
+			null,
+			"base_Component", null, 1, 1, org.eclipse.uml2.uml.profile.l2.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			realizationEClass,
+			Realization.class,
+			"Realization", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getRealization_Base_Classifier(),
+			theUMLPackage.getClassifier(),
+			null,
+			"base_Classifier", null, 1, 1, Realization.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getRealization__ValidateCannotBeImplementationClass__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateCannotBeImplementationClass", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(refineEClass, Refine.class,
+			"Refine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getRefine_Base_Abstraction(),
+			theUMLPackage.getAbstraction(),
+			null,
+			"base_Abstraction", null, 1, 1, Refine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			responsibilityEClass,
+			Responsibility.class,
+			"Responsibility", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getResponsibility_Base_Usage(),
+			theUMLPackage.getUsage(),
+			null,
+			"base_Usage", null, 1, 1, Responsibility.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(scriptEClass, Script.class,
+			"Script", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
+		initEClass(sendEClass, Send.class,
+			"Send", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getSend_Base_Usage(),
+			theUMLPackage.getUsage(),
+			null,
+			"base_Usage", null, 1, 1, Send.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getSend__ValidateClientOperationSendsSupplierSignal__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateClientOperationSendsSupplierSignal", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(serviceEClass, Service.class,
+			"Service", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getService_Base_Component(),
+			theUMLPackage.getComponent(),
+			null,
+			"base_Component", null, 1, 1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(sourceEClass, Source.class,
+			"Source", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+
+		initEClass(
+			specificationEClass,
+			Specification.class,
+			"Specification", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getSpecification_Base_Classifier(),
+			theUMLPackage.getClassifier(),
+			null,
+			"base_Classifier", null, 1, 1, Specification.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getSpecification__ValidateCannotBeType__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateCannotBeType", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(
+			subsystemEClass,
+			Subsystem.class,
+			"Subsystem", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getSubsystem_Base_Component(),
+			theUMLPackage.getComponent(),
+			null,
+			"base_Component", null, 1, 1, Subsystem.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(traceEClass, Trace.class,
+			"Trace", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getTrace_Base_Abstraction(),
+			theUMLPackage.getAbstraction(),
+			null,
+			"base_Abstraction", null, 1, 1, Trace.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(typeEClass, Type.class,
+			"Type", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getType_Base_Class(),
+			theUMLPackage.getClass_(),
+			null,
+			"base_Class", null, 1, 1, Type.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getType__ValidateCannotBeSpecification__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateCannotBeSpecification", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(utilityEClass, Utility.class,
+			"Utility", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(
+			getUtility_Base_Class(),
+			theUMLPackage.getClass_(),
+			null,
+			"base_Class", null, 1, 1, Utility.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(
+			getUtility__ValidateIsUtility__DiagnosticChain_Map(),
+			ecorePackage.getEBoolean(),
+			"validateIsUtility", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, ecorePackage.getEDiagnosticChain(),
+			"diagnostics", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(ecorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		// Create resource
+		createResource(eNS_URI);
+
+		// Create annotations
+		// duplicates
+		createDuplicatesAnnotations();
+	}
+
+	/**
+	 * Initializes the annotations for <b>duplicates</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void createDuplicatesAnnotations() {
+		String source = "duplicates"; //$NON-NLS-1$															
+		addAnnotation(documentEClass, source, new String[]{});
+		addAnnotation(executableEClass, source, new String[]{});
+		addAnnotation(libraryEClass, source, new String[]{});
+		addAnnotation(scriptEClass, source, new String[]{});
+		addAnnotation(sourceEClass, source, new String[]{});
+	}
+
+} //L2PackageImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/LibraryImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/LibraryImpl.java
new file mode 100644
index 0000000..6853d14
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/LibraryImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.uml2.uml.Artifact;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Library;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Library</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.LibraryImpl#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class LibraryImpl
+		extends FileImpl
+		implements Library {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LibraryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.LIBRARY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact getBase_Artifact() {
+		if (base_Artifact != null && base_Artifact.eIsProxy()) {
+			InternalEObject oldBase_Artifact = (InternalEObject) base_Artifact;
+			base_Artifact = (Artifact) eResolveProxy(oldBase_Artifact);
+			if (base_Artifact != oldBase_Artifact) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.LIBRARY__BASE_ARTIFACT, oldBase_Artifact,
+						base_Artifact));
+			}
+		}
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact basicGetBase_Artifact() {
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBase_Artifact(Artifact newBase_Artifact) {
+		Artifact oldBase_Artifact = base_Artifact;
+		base_Artifact = newBase_Artifact;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.LIBRARY__BASE_ARTIFACT, oldBase_Artifact,
+				base_Artifact));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetBase_Artifact() {
+		return base_Artifact != null;
+	}
+
+} //LibraryImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/MetaclassImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/MetaclassImpl.java
new file mode 100644
index 0000000..a0d3fbb
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/MetaclassImpl.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Metaclass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Metaclass</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.MetaclassImpl#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class MetaclassImpl
+		extends EObjectImpl
+		implements Metaclass {
+
+	/**
+	 * The cached value of the '{@link #getBase_Class() <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Class()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Class base_Class;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MetaclassImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.METACLASS;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class getBase_Class() {
+		if (base_Class != null && base_Class.eIsProxy()) {
+			InternalEObject oldBase_Class = (InternalEObject) base_Class;
+			base_Class = (org.eclipse.uml2.uml.Class) eResolveProxy(oldBase_Class);
+			if (base_Class != oldBase_Class) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.METACLASS__BASE_CLASS, oldBase_Class,
+						base_Class));
+			}
+		}
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class basicGetBase_Class() {
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Class(org.eclipse.uml2.uml.Class newBase_Class) {
+		org.eclipse.uml2.uml.Class oldBase_Class = base_Class;
+		base_Class = newBase_Class;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.METACLASS__BASE_CLASS, oldBase_Class, base_Class));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.METACLASS__BASE_CLASS :
+				if (resolve)
+					return getBase_Class();
+				return basicGetBase_Class();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.METACLASS__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.METACLASS__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.METACLASS__BASE_CLASS :
+				return base_Class != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //MetaclassImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ModelLibraryImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ModelLibraryImpl.java
new file mode 100644
index 0000000..1e8a603
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ModelLibraryImpl.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.ModelLibrary;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model Library</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ModelLibraryImpl#getBase_Package <em>Base Package</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ModelLibraryImpl
+		extends EObjectImpl
+		implements ModelLibrary {
+
+	/**
+	 * The cached value of the '{@link #getBase_Package() <em>Base Package</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Package()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Package base_Package;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ModelLibraryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.MODEL_LIBRARY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Package getBase_Package() {
+		if (base_Package != null && base_Package.eIsProxy()) {
+			InternalEObject oldBase_Package = (InternalEObject) base_Package;
+			base_Package = (org.eclipse.uml2.uml.Package) eResolveProxy(oldBase_Package);
+			if (base_Package != oldBase_Package) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.MODEL_LIBRARY__BASE_PACKAGE, oldBase_Package,
+						base_Package));
+			}
+		}
+		return base_Package;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Package basicGetBase_Package() {
+		return base_Package;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Package(org.eclipse.uml2.uml.Package newBase_Package) {
+		org.eclipse.uml2.uml.Package oldBase_Package = base_Package;
+		base_Package = newBase_Package;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.MODEL_LIBRARY__BASE_PACKAGE, oldBase_Package,
+				base_Package));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.MODEL_LIBRARY__BASE_PACKAGE :
+				if (resolve)
+					return getBase_Package();
+				return basicGetBase_Package();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.MODEL_LIBRARY__BASE_PACKAGE :
+				setBase_Package((org.eclipse.uml2.uml.Package) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.MODEL_LIBRARY__BASE_PACKAGE :
+				setBase_Package((org.eclipse.uml2.uml.Package) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.MODEL_LIBRARY__BASE_PACKAGE :
+				return base_Package != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ModelLibraryImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ProcessImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ProcessImpl.java
new file mode 100644
index 0000000..374358e
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ProcessImpl.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Component;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Process</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ProcessImpl#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ProcessImpl
+		extends EObjectImpl
+		implements org.eclipse.uml2.uml.profile.l2.Process {
+
+	/**
+	 * The cached value of the '{@link #getBase_Component() <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Component()
+	 * @generated
+	 * @ordered
+	 */
+	protected Component base_Component;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProcessImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.PROCESS;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component getBase_Component() {
+		if (base_Component != null && base_Component.eIsProxy()) {
+			InternalEObject oldBase_Component = (InternalEObject) base_Component;
+			base_Component = (Component) eResolveProxy(oldBase_Component);
+			if (base_Component != oldBase_Component) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.PROCESS__BASE_COMPONENT, oldBase_Component,
+						base_Component));
+			}
+		}
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component basicGetBase_Component() {
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Component(Component newBase_Component) {
+		Component oldBase_Component = base_Component;
+		base_Component = newBase_Component;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.PROCESS__BASE_COMPONENT, oldBase_Component,
+				base_Component));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.PROCESS__BASE_COMPONENT :
+				if (resolve)
+					return getBase_Component();
+				return basicGetBase_Component();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.PROCESS__BASE_COMPONENT :
+				setBase_Component((Component) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.PROCESS__BASE_COMPONENT :
+				setBase_Component((Component) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.PROCESS__BASE_COMPONENT :
+				return base_Component != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ProcessImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/RealizationImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/RealizationImpl.java
new file mode 100644
index 0000000..586c641
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/RealizationImpl.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Classifier;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Realization;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.RealizationOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Realization</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.RealizationImpl#getBase_Classifier <em>Base Classifier</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class RealizationImpl
+		extends EObjectImpl
+		implements Realization {
+
+	/**
+	 * The cached value of the '{@link #getBase_Classifier() <em>Base Classifier</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Classifier()
+	 * @generated
+	 * @ordered
+	 */
+	protected Classifier base_Classifier;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RealizationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.REALIZATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Classifier getBase_Classifier() {
+		if (base_Classifier != null && base_Classifier.eIsProxy()) {
+			InternalEObject oldBase_Classifier = (InternalEObject) base_Classifier;
+			base_Classifier = (Classifier) eResolveProxy(oldBase_Classifier);
+			if (base_Classifier != oldBase_Classifier) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.REALIZATION__BASE_CLASSIFIER,
+						oldBase_Classifier, base_Classifier));
+			}
+		}
+		return base_Classifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Classifier basicGetBase_Classifier() {
+		return base_Classifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Classifier(Classifier newBase_Classifier) {
+		Classifier oldBase_Classifier = base_Classifier;
+		base_Classifier = newBase_Classifier;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.REALIZATION__BASE_CLASSIFIER, oldBase_Classifier,
+				base_Classifier));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCannotBeImplementationClass(
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return RealizationOperations.validateCannotBeImplementationClass(this,
+			diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.REALIZATION__BASE_CLASSIFIER :
+				if (resolve)
+					return getBase_Classifier();
+				return basicGetBase_Classifier();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.REALIZATION__BASE_CLASSIFIER :
+				setBase_Classifier((Classifier) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.REALIZATION__BASE_CLASSIFIER :
+				setBase_Classifier((Classifier) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.REALIZATION__BASE_CLASSIFIER :
+				return base_Classifier != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.REALIZATION___VALIDATE_CANNOT_BE_IMPLEMENTATION_CLASS__DIAGNOSTICCHAIN_MAP :
+				return validateCannotBeImplementationClass(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //RealizationImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/RefineImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/RefineImpl.java
new file mode 100644
index 0000000..da190b2
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/RefineImpl.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Abstraction;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Refine;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Refine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.RefineImpl#getBase_Abstraction <em>Base Abstraction</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class RefineImpl
+		extends EObjectImpl
+		implements Refine {
+
+	/**
+	 * The cached value of the '{@link #getBase_Abstraction() <em>Base Abstraction</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Abstraction()
+	 * @generated
+	 * @ordered
+	 */
+	protected Abstraction base_Abstraction;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RefineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.REFINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Abstraction getBase_Abstraction() {
+		if (base_Abstraction != null && base_Abstraction.eIsProxy()) {
+			InternalEObject oldBase_Abstraction = (InternalEObject) base_Abstraction;
+			base_Abstraction = (Abstraction) eResolveProxy(oldBase_Abstraction);
+			if (base_Abstraction != oldBase_Abstraction) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.REFINE__BASE_ABSTRACTION,
+						oldBase_Abstraction, base_Abstraction));
+			}
+		}
+		return base_Abstraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Abstraction basicGetBase_Abstraction() {
+		return base_Abstraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Abstraction(Abstraction newBase_Abstraction) {
+		Abstraction oldBase_Abstraction = base_Abstraction;
+		base_Abstraction = newBase_Abstraction;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.REFINE__BASE_ABSTRACTION, oldBase_Abstraction,
+				base_Abstraction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.REFINE__BASE_ABSTRACTION :
+				if (resolve)
+					return getBase_Abstraction();
+				return basicGetBase_Abstraction();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.REFINE__BASE_ABSTRACTION :
+				setBase_Abstraction((Abstraction) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.REFINE__BASE_ABSTRACTION :
+				setBase_Abstraction((Abstraction) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.REFINE__BASE_ABSTRACTION :
+				return base_Abstraction != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //RefineImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ResponsibilityImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ResponsibilityImpl.java
new file mode 100644
index 0000000..86fd16c
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ResponsibilityImpl.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Usage;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Responsibility;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Responsibility</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ResponsibilityImpl#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ResponsibilityImpl
+		extends EObjectImpl
+		implements Responsibility {
+
+	/**
+	 * The cached value of the '{@link #getBase_Usage() <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Usage()
+	 * @generated
+	 * @ordered
+	 */
+	protected Usage base_Usage;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ResponsibilityImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.RESPONSIBILITY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage getBase_Usage() {
+		if (base_Usage != null && base_Usage.eIsProxy()) {
+			InternalEObject oldBase_Usage = (InternalEObject) base_Usage;
+			base_Usage = (Usage) eResolveProxy(oldBase_Usage);
+			if (base_Usage != oldBase_Usage) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.RESPONSIBILITY__BASE_USAGE, oldBase_Usage,
+						base_Usage));
+			}
+		}
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage basicGetBase_Usage() {
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Usage(Usage newBase_Usage) {
+		Usage oldBase_Usage = base_Usage;
+		base_Usage = newBase_Usage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.RESPONSIBILITY__BASE_USAGE, oldBase_Usage, base_Usage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.RESPONSIBILITY__BASE_USAGE :
+				if (resolve)
+					return getBase_Usage();
+				return basicGetBase_Usage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.RESPONSIBILITY__BASE_USAGE :
+				setBase_Usage((Usage) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.RESPONSIBILITY__BASE_USAGE :
+				setBase_Usage((Usage) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.RESPONSIBILITY__BASE_USAGE :
+				return base_Usage != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ResponsibilityImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ScriptImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ScriptImpl.java
new file mode 100644
index 0000000..1a730da
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ScriptImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.uml2.uml.Artifact;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Script;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Script</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ScriptImpl#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ScriptImpl
+		extends FileImpl
+		implements Script {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ScriptImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.SCRIPT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact getBase_Artifact() {
+		if (base_Artifact != null && base_Artifact.eIsProxy()) {
+			InternalEObject oldBase_Artifact = (InternalEObject) base_Artifact;
+			base_Artifact = (Artifact) eResolveProxy(oldBase_Artifact);
+			if (base_Artifact != oldBase_Artifact) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.SCRIPT__BASE_ARTIFACT, oldBase_Artifact,
+						base_Artifact));
+			}
+		}
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact basicGetBase_Artifact() {
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBase_Artifact(Artifact newBase_Artifact) {
+		Artifact oldBase_Artifact = base_Artifact;
+		base_Artifact = newBase_Artifact;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.SCRIPT__BASE_ARTIFACT, oldBase_Artifact,
+				base_Artifact));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetBase_Artifact() {
+		return base_Artifact != null;
+	}
+
+} //ScriptImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SendImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SendImpl.java
new file mode 100644
index 0000000..3be9131
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SendImpl.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Usage;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Send;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.SendOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Send</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SendImpl#getBase_Usage <em>Base Usage</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SendImpl
+		extends EObjectImpl
+		implements Send {
+
+	/**
+	 * The cached value of the '{@link #getBase_Usage() <em>Base Usage</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Usage()
+	 * @generated
+	 * @ordered
+	 */
+	protected Usage base_Usage;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SendImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.SEND;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage getBase_Usage() {
+		if (base_Usage != null && base_Usage.eIsProxy()) {
+			InternalEObject oldBase_Usage = (InternalEObject) base_Usage;
+			base_Usage = (Usage) eResolveProxy(oldBase_Usage);
+			if (base_Usage != oldBase_Usage) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.SEND__BASE_USAGE, oldBase_Usage, base_Usage));
+			}
+		}
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Usage basicGetBase_Usage() {
+		return base_Usage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Usage(Usage newBase_Usage) {
+		Usage oldBase_Usage = base_Usage;
+		base_Usage = newBase_Usage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.SEND__BASE_USAGE, oldBase_Usage, base_Usage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateClientOperationSendsSupplierSignal(
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return SendOperations.validateClientOperationSendsSupplierSignal(this,
+			diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.SEND__BASE_USAGE :
+				if (resolve)
+					return getBase_Usage();
+				return basicGetBase_Usage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.SEND__BASE_USAGE :
+				setBase_Usage((Usage) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.SEND__BASE_USAGE :
+				setBase_Usage((Usage) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.SEND__BASE_USAGE :
+				return base_Usage != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.SEND___VALIDATE_CLIENT_OPERATION_SENDS_SUPPLIER_SIGNAL__DIAGNOSTICCHAIN_MAP :
+				return validateClientOperationSendsSupplierSignal(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //SendImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ServiceImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ServiceImpl.java
new file mode 100644
index 0000000..9278eed
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/ServiceImpl.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Component;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Service;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Service</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.ServiceImpl#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ServiceImpl
+		extends EObjectImpl
+		implements Service {
+
+	/**
+	 * The cached value of the '{@link #getBase_Component() <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Component()
+	 * @generated
+	 * @ordered
+	 */
+	protected Component base_Component;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ServiceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.SERVICE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component getBase_Component() {
+		if (base_Component != null && base_Component.eIsProxy()) {
+			InternalEObject oldBase_Component = (InternalEObject) base_Component;
+			base_Component = (Component) eResolveProxy(oldBase_Component);
+			if (base_Component != oldBase_Component) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.SERVICE__BASE_COMPONENT, oldBase_Component,
+						base_Component));
+			}
+		}
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component basicGetBase_Component() {
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Component(Component newBase_Component) {
+		Component oldBase_Component = base_Component;
+		base_Component = newBase_Component;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.SERVICE__BASE_COMPONENT, oldBase_Component,
+				base_Component));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.SERVICE__BASE_COMPONENT :
+				if (resolve)
+					return getBase_Component();
+				return basicGetBase_Component();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.SERVICE__BASE_COMPONENT :
+				setBase_Component((Component) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.SERVICE__BASE_COMPONENT :
+				setBase_Component((Component) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.SERVICE__BASE_COMPONENT :
+				return base_Component != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ServiceImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SourceImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SourceImpl.java
new file mode 100644
index 0000000..8af23e6
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SourceImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.uml2.uml.Artifact;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Source;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Source</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SourceImpl#getBase_Artifact <em>Base Artifact</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SourceImpl
+		extends FileImpl
+		implements Source {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SourceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.SOURCE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact getBase_Artifact() {
+		if (base_Artifact != null && base_Artifact.eIsProxy()) {
+			InternalEObject oldBase_Artifact = (InternalEObject) base_Artifact;
+			base_Artifact = (Artifact) eResolveProxy(oldBase_Artifact);
+			if (base_Artifact != oldBase_Artifact) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.SOURCE__BASE_ARTIFACT, oldBase_Artifact,
+						base_Artifact));
+			}
+		}
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Artifact basicGetBase_Artifact() {
+		return base_Artifact;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBase_Artifact(Artifact newBase_Artifact) {
+		Artifact oldBase_Artifact = base_Artifact;
+		base_Artifact = newBase_Artifact;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.SOURCE__BASE_ARTIFACT, oldBase_Artifact,
+				base_Artifact));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetBase_Artifact() {
+		return base_Artifact != null;
+	}
+
+} //SourceImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SpecificationImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SpecificationImpl.java
new file mode 100644
index 0000000..36ac918
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SpecificationImpl.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Classifier;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Specification;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.SpecificationOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Specification</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SpecificationImpl#getBase_Classifier <em>Base Classifier</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SpecificationImpl
+		extends EObjectImpl
+		implements Specification {
+
+	/**
+	 * The cached value of the '{@link #getBase_Classifier() <em>Base Classifier</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Classifier()
+	 * @generated
+	 * @ordered
+	 */
+	protected Classifier base_Classifier;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SpecificationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.SPECIFICATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Classifier getBase_Classifier() {
+		if (base_Classifier != null && base_Classifier.eIsProxy()) {
+			InternalEObject oldBase_Classifier = (InternalEObject) base_Classifier;
+			base_Classifier = (Classifier) eResolveProxy(oldBase_Classifier);
+			if (base_Classifier != oldBase_Classifier) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.SPECIFICATION__BASE_CLASSIFIER,
+						oldBase_Classifier, base_Classifier));
+			}
+		}
+		return base_Classifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Classifier basicGetBase_Classifier() {
+		return base_Classifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Classifier(Classifier newBase_Classifier) {
+		Classifier oldBase_Classifier = base_Classifier;
+		base_Classifier = newBase_Classifier;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.SPECIFICATION__BASE_CLASSIFIER, oldBase_Classifier,
+				base_Classifier));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCannotBeType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return SpecificationOperations.validateCannotBeType(this, diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.SPECIFICATION__BASE_CLASSIFIER :
+				if (resolve)
+					return getBase_Classifier();
+				return basicGetBase_Classifier();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.SPECIFICATION__BASE_CLASSIFIER :
+				setBase_Classifier((Classifier) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.SPECIFICATION__BASE_CLASSIFIER :
+				setBase_Classifier((Classifier) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.SPECIFICATION__BASE_CLASSIFIER :
+				return base_Classifier != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.SPECIFICATION___VALIDATE_CANNOT_BE_TYPE__DIAGNOSTICCHAIN_MAP :
+				return validateCannotBeType((DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //SpecificationImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SubsystemImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SubsystemImpl.java
new file mode 100644
index 0000000..185d2e8
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/SubsystemImpl.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Component;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Subsystem;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Subsystem</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.SubsystemImpl#getBase_Component <em>Base Component</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SubsystemImpl
+		extends EObjectImpl
+		implements Subsystem {
+
+	/**
+	 * The cached value of the '{@link #getBase_Component() <em>Base Component</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Component()
+	 * @generated
+	 * @ordered
+	 */
+	protected Component base_Component;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SubsystemImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.SUBSYSTEM;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component getBase_Component() {
+		if (base_Component != null && base_Component.eIsProxy()) {
+			InternalEObject oldBase_Component = (InternalEObject) base_Component;
+			base_Component = (Component) eResolveProxy(oldBase_Component);
+			if (base_Component != oldBase_Component) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.SUBSYSTEM__BASE_COMPONENT, oldBase_Component,
+						base_Component));
+			}
+		}
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Component basicGetBase_Component() {
+		return base_Component;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Component(Component newBase_Component) {
+		Component oldBase_Component = base_Component;
+		base_Component = newBase_Component;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.SUBSYSTEM__BASE_COMPONENT, oldBase_Component,
+				base_Component));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.SUBSYSTEM__BASE_COMPONENT :
+				if (resolve)
+					return getBase_Component();
+				return basicGetBase_Component();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.SUBSYSTEM__BASE_COMPONENT :
+				setBase_Component((Component) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.SUBSYSTEM__BASE_COMPONENT :
+				setBase_Component((Component) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.SUBSYSTEM__BASE_COMPONENT :
+				return base_Component != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //SubsystemImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/TraceImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/TraceImpl.java
new file mode 100644
index 0000000..85d9322
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/TraceImpl.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.Abstraction;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Trace;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Trace</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.TraceImpl#getBase_Abstraction <em>Base Abstraction</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class TraceImpl
+		extends EObjectImpl
+		implements Trace {
+
+	/**
+	 * The cached value of the '{@link #getBase_Abstraction() <em>Base Abstraction</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Abstraction()
+	 * @generated
+	 * @ordered
+	 */
+	protected Abstraction base_Abstraction;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TraceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.TRACE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Abstraction getBase_Abstraction() {
+		if (base_Abstraction != null && base_Abstraction.eIsProxy()) {
+			InternalEObject oldBase_Abstraction = (InternalEObject) base_Abstraction;
+			base_Abstraction = (Abstraction) eResolveProxy(oldBase_Abstraction);
+			if (base_Abstraction != oldBase_Abstraction) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.TRACE__BASE_ABSTRACTION, oldBase_Abstraction,
+						base_Abstraction));
+			}
+		}
+		return base_Abstraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Abstraction basicGetBase_Abstraction() {
+		return base_Abstraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Abstraction(Abstraction newBase_Abstraction) {
+		Abstraction oldBase_Abstraction = base_Abstraction;
+		base_Abstraction = newBase_Abstraction;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.TRACE__BASE_ABSTRACTION, oldBase_Abstraction,
+				base_Abstraction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.TRACE__BASE_ABSTRACTION :
+				if (resolve)
+					return getBase_Abstraction();
+				return basicGetBase_Abstraction();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.TRACE__BASE_ABSTRACTION :
+				setBase_Abstraction((Abstraction) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.TRACE__BASE_ABSTRACTION :
+				setBase_Abstraction((Abstraction) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.TRACE__BASE_ABSTRACTION :
+				return base_Abstraction != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //TraceImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/TypeImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/TypeImpl.java
new file mode 100644
index 0000000..e318b85
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/TypeImpl.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Type;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.TypeOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.TypeImpl#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class TypeImpl
+		extends EObjectImpl
+		implements Type {
+
+	/**
+	 * The cached value of the '{@link #getBase_Class() <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Class()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Class base_Class;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class getBase_Class() {
+		if (base_Class != null && base_Class.eIsProxy()) {
+			InternalEObject oldBase_Class = (InternalEObject) base_Class;
+			base_Class = (org.eclipse.uml2.uml.Class) eResolveProxy(oldBase_Class);
+			if (base_Class != oldBase_Class) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.TYPE__BASE_CLASS, oldBase_Class, base_Class));
+			}
+		}
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class basicGetBase_Class() {
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Class(org.eclipse.uml2.uml.Class newBase_Class) {
+		org.eclipse.uml2.uml.Class oldBase_Class = base_Class;
+		base_Class = newBase_Class;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.TYPE__BASE_CLASS, oldBase_Class, base_Class));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCannotBeSpecification(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return TypeOperations.validateCannotBeSpecification(this, diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.TYPE__BASE_CLASS :
+				if (resolve)
+					return getBase_Class();
+				return basicGetBase_Class();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.TYPE__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.TYPE__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.TYPE__BASE_CLASS :
+				return base_Class != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.TYPE___VALIDATE_CANNOT_BE_SPECIFICATION__DIAGNOSTICCHAIN_MAP :
+				return validateCannotBeSpecification(
+					(DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //TypeImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/UtilityImpl.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/UtilityImpl.java
new file mode 100644
index 0000000..2162b04
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/impl/UtilityImpl.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+import org.eclipse.uml2.uml.profile.l2.internal.operations.UtilityOperations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Utility</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.internal.impl.UtilityImpl#getBase_Class <em>Base Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class UtilityImpl
+		extends EObjectImpl
+		implements Utility {
+
+	/**
+	 * The cached value of the '{@link #getBase_Class() <em>Base Class</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Class()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.uml2.uml.Class base_Class;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UtilityImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return L2Package.Literals.UTILITY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class getBase_Class() {
+		if (base_Class != null && base_Class.eIsProxy()) {
+			InternalEObject oldBase_Class = (InternalEObject) base_Class;
+			base_Class = (org.eclipse.uml2.uml.Class) eResolveProxy(oldBase_Class);
+			if (base_Class != oldBase_Class) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+						L2Package.UTILITY__BASE_CLASS, oldBase_Class,
+						base_Class));
+			}
+		}
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.uml2.uml.Class basicGetBase_Class() {
+		return base_Class;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBase_Class(org.eclipse.uml2.uml.Class newBase_Class) {
+		org.eclipse.uml2.uml.Class oldBase_Class = base_Class;
+		base_Class = newBase_Class;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+				L2Package.UTILITY__BASE_CLASS, oldBase_Class, base_Class));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateIsUtility(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return UtilityOperations.validateIsUtility(this, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case L2Package.UTILITY__BASE_CLASS :
+				if (resolve)
+					return getBase_Class();
+				return basicGetBase_Class();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case L2Package.UTILITY__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case L2Package.UTILITY__BASE_CLASS :
+				setBase_Class((org.eclipse.uml2.uml.Class) null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case L2Package.UTILITY__BASE_CLASS :
+				return base_Class != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments)
+			throws InvocationTargetException {
+		switch (operationID) {
+			case L2Package.UTILITY___VALIDATE_IS_UTILITY__DIAGNOSTICCHAIN_MAP :
+				return validateIsUtility((DiagnosticChain) arguments.get(0),
+					(Map<Object, Object>) arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+} //UtilityImpl
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/CallOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/CallOperations.java
new file mode 100644
index 0000000..f93ec57
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/CallOperations.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Call;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Call</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Call#validateClientAndSupplierAreOperations(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client And Supplier Are Operations</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class CallOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CallOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Operation))
+	 * @param call The receiving '<em><b>Call</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateClientAndSupplierAreOperations(Call call,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.CALL__CLIENT_AND_SUPPLIER_ARE_OPERATIONS,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateClientAndSupplierAreOperations", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(call, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{call}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // CallOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/CreateOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/CreateOperations.java
new file mode 100644
index 0000000..11245d8
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/CreateOperations.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Create;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Create</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Create#validateClientAndSupplierAreClassifiers(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client And Supplier Are Classifiers</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class CreateOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CreateOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage->notEmpty() implies (self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier)))
+	 * @param create The receiving '<em><b>Create</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateClientAndSupplierAreClassifiers(
+			Create create, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.CREATE__CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateClientAndSupplierAreClassifiers", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(create, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{create}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // CreateOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/ImplementOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/ImplementOperations.java
new file mode 100644
index 0000000..6b91dbd
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/ImplementOperations.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Implement;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Implement</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Implement#validateImplementsSpecification(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Implements Specification</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ImplementOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ImplementOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Component.clientDependency.supplier->select(oclIsKindOf(Classifier)).oclAsType(Classifier).extension_Specificaiton->notEmpty()
+	 * @param implement The receiving '<em><b>Implement</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateImplementsSpecification(Implement implement,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.IMPLEMENT__IMPLEMENTS_SPECIFICATION,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateImplementsSpecification", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(implement, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{implement}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // ImplementOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/ImplementationClassOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/ImplementationClassOperations.java
new file mode 100644
index 0000000..abaa0f7
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/ImplementationClassOperations.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Implementation Class</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass#validateCannotBeRealization(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Realization</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ImplementationClassOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ImplementationClassOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Class.extension_Realization->isEmpty()
+	 * @param implementationClass The receiving '<em><b>Implementation Class</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateCannotBeRealization(
+			ImplementationClass implementationClass,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.IMPLEMENTATION_CLASS__CANNOT_BE_REALIZATION,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateCannotBeRealization", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(implementationClass, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{implementationClass}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // ImplementationClassOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/InstantiateOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/InstantiateOperations.java
new file mode 100644
index 0000000..785f91a
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/InstantiateOperations.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Instantiate</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Instantiate#validateClientAndSupplierAreClassifiers(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client And Supplier Are Classifiers</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class InstantiateOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InstantiateOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage.client->forAll(oclIsKindOf(Classifier)) and self.base_Usage.supplier->forAll(oclIsKindOf(Classifier))
+	 * @param instantiate The receiving '<em><b>Instantiate</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateClientAndSupplierAreClassifiers(
+			Instantiate instantiate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.INSTANTIATE__CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateClientAndSupplierAreClassifiers", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(instantiate, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{instantiate}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // InstantiateOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/RealizationOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/RealizationOperations.java
new file mode 100644
index 0000000..b958337
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/RealizationOperations.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Realization;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Realization</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Realization#validateCannotBeImplementationClass(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Implementation Class</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class RealizationOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RealizationOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Classifier.extension_ImplementationClass->isEmpty()
+	 * @param realization The receiving '<em><b>Realization</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateCannotBeImplementationClass(
+			Realization realization, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.REALIZATION__CANNOT_BE_IMPLEMENTATION_CLASS,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateCannotBeImplementationClass", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(realization, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{realization}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // RealizationOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/SendOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/SendOperations.java
new file mode 100644
index 0000000..dafbbad
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/SendOperations.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Send;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Send</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Send#validateClientOperationSendsSupplierSignal(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Client Operation Sends Supplier Signal</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SendOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SendOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Usage.client->forAll(oclIsKindOf(Operation)) and self.base_Usage.supplier->forAll(oclIsKindOf(Signal))
+	 * @param send The receiving '<em><b>Send</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateClientOperationSendsSupplierSignal(Send send,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.SEND__CLIENT_OPERATION_SENDS_SUPPLIER_SIGNAL,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateClientOperationSendsSupplierSignal", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(send, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{send}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // SendOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/SpecificationOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/SpecificationOperations.java
new file mode 100644
index 0000000..4c38a26
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/SpecificationOperations.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Specification;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Specification</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Specification#validateCannotBeType(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Type</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SpecificationOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SpecificationOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Classifier.extension_Type->isEmpty()
+	 * @param specification The receiving '<em><b>Specification</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateCannotBeType(Specification specification,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.SPECIFICATION__CANNOT_BE_TYPE,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateCannotBeType", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(specification, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{specification}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // SpecificationOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/TypeOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/TypeOperations.java
new file mode 100644
index 0000000..fd7a552
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/TypeOperations.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Type;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Type</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Type#validateCannotBeSpecification(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Cannot Be Specification</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class TypeOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TypeOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Class.extension_Specification->isEmpty()
+	 * @param type The receiving '<em><b>Type</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateCannotBeSpecification(Type type,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.TYPE__CANNOT_BE_SPECIFICATION,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateCannotBeSpecification", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(type, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{type}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // TypeOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/UtilityOperations.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/UtilityOperations.java
new file mode 100644
index 0000000..6061b2a
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/internal/operations/UtilityOperations.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.internal.operations;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+import org.eclipse.uml2.uml.profile.l2.util.L2Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Utility</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.uml2.uml.profile.l2.Utility#validateIsUtility(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Is Utility</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class UtilityOperations {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UtilityOperations() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * self.base_Class.feature->forAll(isStatic)
+	 * @param utility The receiving '<em><b>Utility</b></em>' model object.
+	 * @param diagnostics The chain of diagnostics to which problems are to be appended.
+	 * @param context The cache of context-specific information.
+	 * <!-- end-model-doc -->
+	 * @generated
+	 */
+	public static boolean validateIsUtility(Utility utility,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		// TODO: implement this method
+		// -> specify the condition that violates the invariant
+		// -> verify the details of the diagnostic, including severity and message
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (false) {
+			if (diagnostics != null) {
+				diagnostics
+					.add(new BasicDiagnostic(
+						Diagnostic.ERROR,
+						L2Validator.DIAGNOSTIC_SOURCE,
+						L2Validator.UTILITY__IS_UTILITY,
+						org.eclipse.emf.ecore.plugin.EcorePlugin.INSTANCE
+							.getString(
+								"_UI_GenericInvariant_diagnostic", new Object[]{"validateIsUtility", org.eclipse.emf.ecore.util.EObjectValidator.getObjectLabel(utility, context)}), //$NON-NLS-1$ //$NON-NLS-2$
+						new Object[]{utility}));
+			}
+			return false;
+		}
+		return true;
+	}
+
+} // UtilityOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2AdapterFactory.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2AdapterFactory.java
new file mode 100644
index 0000000..89878f2
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2AdapterFactory.java
@@ -0,0 +1,712 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.uml2.uml.profile.l2.Auxiliary;
+import org.eclipse.uml2.uml.profile.l2.Call;
+import org.eclipse.uml2.uml.profile.l2.Create;
+import org.eclipse.uml2.uml.profile.l2.Derive;
+import org.eclipse.uml2.uml.profile.l2.Destroy;
+import org.eclipse.uml2.uml.profile.l2.Document;
+import org.eclipse.uml2.uml.profile.l2.Entity;
+import org.eclipse.uml2.uml.profile.l2.Executable;
+import org.eclipse.uml2.uml.profile.l2.File;
+import org.eclipse.uml2.uml.profile.l2.Focus;
+import org.eclipse.uml2.uml.profile.l2.Framework;
+import org.eclipse.uml2.uml.profile.l2.Implement;
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Library;
+import org.eclipse.uml2.uml.profile.l2.Metaclass;
+import org.eclipse.uml2.uml.profile.l2.ModelLibrary;
+import org.eclipse.uml2.uml.profile.l2.Realization;
+import org.eclipse.uml2.uml.profile.l2.Refine;
+import org.eclipse.uml2.uml.profile.l2.Responsibility;
+import org.eclipse.uml2.uml.profile.l2.Script;
+import org.eclipse.uml2.uml.profile.l2.Send;
+import org.eclipse.uml2.uml.profile.l2.Service;
+import org.eclipse.uml2.uml.profile.l2.Source;
+import org.eclipse.uml2.uml.profile.l2.Specification;
+import org.eclipse.uml2.uml.profile.l2.Subsystem;
+import org.eclipse.uml2.uml.profile.l2.Trace;
+import org.eclipse.uml2.uml.profile.l2.Type;
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package
+ * @generated
+ */
+public class L2AdapterFactory
+		extends AdapterFactoryImpl {
+
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static L2Package modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2AdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = L2Package.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject) object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected L2Switch<Adapter> modelSwitch = new L2Switch<Adapter>() {
+
+		@Override
+		public Adapter caseAuxiliary(Auxiliary object) {
+			return createAuxiliaryAdapter();
+		}
+
+		@Override
+		public Adapter caseCall(Call object) {
+			return createCallAdapter();
+		}
+
+		@Override
+		public Adapter caseCreate(Create object) {
+			return createCreateAdapter();
+		}
+
+		@Override
+		public Adapter caseDerive(Derive object) {
+			return createDeriveAdapter();
+		}
+
+		@Override
+		public Adapter caseDestroy(Destroy object) {
+			return createDestroyAdapter();
+		}
+
+		@Override
+		public Adapter caseDocument(Document object) {
+			return createDocumentAdapter();
+		}
+
+		@Override
+		public Adapter caseFile(File object) {
+			return createFileAdapter();
+		}
+
+		@Override
+		public Adapter caseEntity(Entity object) {
+			return createEntityAdapter();
+		}
+
+		@Override
+		public Adapter caseExecutable(Executable object) {
+			return createExecutableAdapter();
+		}
+
+		@Override
+		public Adapter caseFocus(Focus object) {
+			return createFocusAdapter();
+		}
+
+		@Override
+		public Adapter caseFramework(Framework object) {
+			return createFrameworkAdapter();
+		}
+
+		@Override
+		public Adapter caseImplement(Implement object) {
+			return createImplementAdapter();
+		}
+
+		@Override
+		public Adapter caseImplementationClass(ImplementationClass object) {
+			return createImplementationClassAdapter();
+		}
+
+		@Override
+		public Adapter caseInstantiate(Instantiate object) {
+			return createInstantiateAdapter();
+		}
+
+		@Override
+		public Adapter caseLibrary(Library object) {
+			return createLibraryAdapter();
+		}
+
+		@Override
+		public Adapter caseMetaclass(Metaclass object) {
+			return createMetaclassAdapter();
+		}
+
+		@Override
+		public Adapter caseModelLibrary(ModelLibrary object) {
+			return createModelLibraryAdapter();
+		}
+
+		@Override
+		public Adapter caseProcess(
+				org.eclipse.uml2.uml.profile.l2.Process object) {
+			return createProcessAdapter();
+		}
+
+		@Override
+		public Adapter caseRealization(Realization object) {
+			return createRealizationAdapter();
+		}
+
+		@Override
+		public Adapter caseRefine(Refine object) {
+			return createRefineAdapter();
+		}
+
+		@Override
+		public Adapter caseResponsibility(Responsibility object) {
+			return createResponsibilityAdapter();
+		}
+
+		@Override
+		public Adapter caseScript(Script object) {
+			return createScriptAdapter();
+		}
+
+		@Override
+		public Adapter caseSend(Send object) {
+			return createSendAdapter();
+		}
+
+		@Override
+		public Adapter caseService(Service object) {
+			return createServiceAdapter();
+		}
+
+		@Override
+		public Adapter caseSource(Source object) {
+			return createSourceAdapter();
+		}
+
+		@Override
+		public Adapter caseSpecification(Specification object) {
+			return createSpecificationAdapter();
+		}
+
+		@Override
+		public Adapter caseSubsystem(Subsystem object) {
+			return createSubsystemAdapter();
+		}
+
+		@Override
+		public Adapter caseTrace(Trace object) {
+			return createTraceAdapter();
+		}
+
+		@Override
+		public Adapter caseType(Type object) {
+			return createTypeAdapter();
+		}
+
+		@Override
+		public Adapter caseUtility(Utility object) {
+			return createUtilityAdapter();
+		}
+
+		@Override
+		public Adapter defaultCase(EObject object) {
+			return createEObjectAdapter();
+		}
+	};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject) target);
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Auxiliary <em>Auxiliary</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Auxiliary
+	 * @generated
+	 */
+	public Adapter createAuxiliaryAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Call <em>Call</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Call
+	 * @generated
+	 */
+	public Adapter createCallAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Create <em>Create</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Create
+	 * @generated
+	 */
+	public Adapter createCreateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Derive <em>Derive</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Derive
+	 * @generated
+	 */
+	public Adapter createDeriveAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Destroy <em>Destroy</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Destroy
+	 * @generated
+	 */
+	public Adapter createDestroyAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Document <em>Document</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Document
+	 * @generated
+	 */
+	public Adapter createDocumentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.File <em>File</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.File
+	 * @generated
+	 */
+	public Adapter createFileAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Entity <em>Entity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Entity
+	 * @generated
+	 */
+	public Adapter createEntityAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Executable <em>Executable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Executable
+	 * @generated
+	 */
+	public Adapter createExecutableAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Focus <em>Focus</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Focus
+	 * @generated
+	 */
+	public Adapter createFocusAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Framework <em>Framework</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Framework
+	 * @generated
+	 */
+	public Adapter createFrameworkAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Implement <em>Implement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Implement
+	 * @generated
+	 */
+	public Adapter createImplementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.ImplementationClass <em>Implementation Class</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.ImplementationClass
+	 * @generated
+	 */
+	public Adapter createImplementationClassAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Instantiate <em>Instantiate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Instantiate
+	 * @generated
+	 */
+	public Adapter createInstantiateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Library <em>Library</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Library
+	 * @generated
+	 */
+	public Adapter createLibraryAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Metaclass <em>Metaclass</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Metaclass
+	 * @generated
+	 */
+	public Adapter createMetaclassAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.ModelLibrary <em>Model Library</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.ModelLibrary
+	 * @generated
+	 */
+	public Adapter createModelLibraryAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Process <em>Process</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Process
+	 * @generated
+	 */
+	public Adapter createProcessAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Realization <em>Realization</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Realization
+	 * @generated
+	 */
+	public Adapter createRealizationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Refine <em>Refine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Refine
+	 * @generated
+	 */
+	public Adapter createRefineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Responsibility <em>Responsibility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Responsibility
+	 * @generated
+	 */
+	public Adapter createResponsibilityAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Script <em>Script</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Script
+	 * @generated
+	 */
+	public Adapter createScriptAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Send <em>Send</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Send
+	 * @generated
+	 */
+	public Adapter createSendAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Service <em>Service</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Service
+	 * @generated
+	 */
+	public Adapter createServiceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Source <em>Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Source
+	 * @generated
+	 */
+	public Adapter createSourceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Specification <em>Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Specification
+	 * @generated
+	 */
+	public Adapter createSpecificationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Subsystem <em>Subsystem</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Subsystem
+	 * @generated
+	 */
+	public Adapter createSubsystemAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Trace <em>Trace</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Trace
+	 * @generated
+	 */
+	public Adapter createTraceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Type
+	 * @generated
+	 */
+	public Adapter createTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.uml2.uml.profile.l2.Utility <em>Utility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.uml2.uml.profile.l2.Utility
+	 * @generated
+	 */
+	public Adapter createUtilityAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //L2AdapterFactory
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2Switch.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2Switch.java
new file mode 100644
index 0000000..81a7cb8
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2Switch.java
@@ -0,0 +1,800 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.uml2.uml.profile.l2.Auxiliary;
+import org.eclipse.uml2.uml.profile.l2.Call;
+import org.eclipse.uml2.uml.profile.l2.Create;
+import org.eclipse.uml2.uml.profile.l2.Derive;
+import org.eclipse.uml2.uml.profile.l2.Destroy;
+import org.eclipse.uml2.uml.profile.l2.Document;
+import org.eclipse.uml2.uml.profile.l2.Entity;
+import org.eclipse.uml2.uml.profile.l2.Executable;
+import org.eclipse.uml2.uml.profile.l2.File;
+import org.eclipse.uml2.uml.profile.l2.Focus;
+import org.eclipse.uml2.uml.profile.l2.Framework;
+import org.eclipse.uml2.uml.profile.l2.Implement;
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.Library;
+import org.eclipse.uml2.uml.profile.l2.Metaclass;
+import org.eclipse.uml2.uml.profile.l2.ModelLibrary;
+import org.eclipse.uml2.uml.profile.l2.Realization;
+import org.eclipse.uml2.uml.profile.l2.Refine;
+import org.eclipse.uml2.uml.profile.l2.Responsibility;
+import org.eclipse.uml2.uml.profile.l2.Script;
+import org.eclipse.uml2.uml.profile.l2.Send;
+import org.eclipse.uml2.uml.profile.l2.Service;
+import org.eclipse.uml2.uml.profile.l2.Source;
+import org.eclipse.uml2.uml.profile.l2.Specification;
+import org.eclipse.uml2.uml.profile.l2.Subsystem;
+import org.eclipse.uml2.uml.profile.l2.Trace;
+import org.eclipse.uml2.uml.profile.l2.Type;
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package
+ * @generated
+ */
+public class L2Switch<T>
+		extends Switch<T> {
+
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static L2Package modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2Switch() {
+		if (modelPackage == null) {
+			modelPackage = L2Package.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @parameter ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case L2Package.AUXILIARY : {
+				Auxiliary auxiliary = (Auxiliary) theEObject;
+				T result = caseAuxiliary(auxiliary);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.CALL : {
+				Call call = (Call) theEObject;
+				T result = caseCall(call);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.CREATE : {
+				Create create = (Create) theEObject;
+				T result = caseCreate(create);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.DERIVE : {
+				Derive derive = (Derive) theEObject;
+				T result = caseDerive(derive);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.DESTROY : {
+				Destroy destroy = (Destroy) theEObject;
+				T result = caseDestroy(destroy);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.DOCUMENT : {
+				Document document = (Document) theEObject;
+				T result = caseDocument(document);
+				if (result == null)
+					result = caseFile(document);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.FILE : {
+				File file = (File) theEObject;
+				T result = caseFile(file);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.ENTITY : {
+				Entity entity = (Entity) theEObject;
+				T result = caseEntity(entity);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.EXECUTABLE : {
+				Executable executable = (Executable) theEObject;
+				T result = caseExecutable(executable);
+				if (result == null)
+					result = caseFile(executable);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.FOCUS : {
+				Focus focus = (Focus) theEObject;
+				T result = caseFocus(focus);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.FRAMEWORK : {
+				Framework framework = (Framework) theEObject;
+				T result = caseFramework(framework);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.IMPLEMENT : {
+				Implement implement = (Implement) theEObject;
+				T result = caseImplement(implement);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.IMPLEMENTATION_CLASS : {
+				ImplementationClass implementationClass = (ImplementationClass) theEObject;
+				T result = caseImplementationClass(implementationClass);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.INSTANTIATE : {
+				Instantiate instantiate = (Instantiate) theEObject;
+				T result = caseInstantiate(instantiate);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.LIBRARY : {
+				Library library = (Library) theEObject;
+				T result = caseLibrary(library);
+				if (result == null)
+					result = caseFile(library);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.METACLASS : {
+				Metaclass metaclass = (Metaclass) theEObject;
+				T result = caseMetaclass(metaclass);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.MODEL_LIBRARY : {
+				ModelLibrary modelLibrary = (ModelLibrary) theEObject;
+				T result = caseModelLibrary(modelLibrary);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.PROCESS : {
+				org.eclipse.uml2.uml.profile.l2.Process process = (org.eclipse.uml2.uml.profile.l2.Process) theEObject;
+				T result = caseProcess(process);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.REALIZATION : {
+				Realization realization = (Realization) theEObject;
+				T result = caseRealization(realization);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.REFINE : {
+				Refine refine = (Refine) theEObject;
+				T result = caseRefine(refine);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.RESPONSIBILITY : {
+				Responsibility responsibility = (Responsibility) theEObject;
+				T result = caseResponsibility(responsibility);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.SCRIPT : {
+				Script script = (Script) theEObject;
+				T result = caseScript(script);
+				if (result == null)
+					result = caseFile(script);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.SEND : {
+				Send send = (Send) theEObject;
+				T result = caseSend(send);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.SERVICE : {
+				Service service = (Service) theEObject;
+				T result = caseService(service);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.SOURCE : {
+				Source source = (Source) theEObject;
+				T result = caseSource(source);
+				if (result == null)
+					result = caseFile(source);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.SPECIFICATION : {
+				Specification specification = (Specification) theEObject;
+				T result = caseSpecification(specification);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.SUBSYSTEM : {
+				Subsystem subsystem = (Subsystem) theEObject;
+				T result = caseSubsystem(subsystem);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.TRACE : {
+				Trace trace = (Trace) theEObject;
+				T result = caseTrace(trace);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.TYPE : {
+				Type type = (Type) theEObject;
+				T result = caseType(type);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			case L2Package.UTILITY : {
+				Utility utility = (Utility) theEObject;
+				T result = caseUtility(utility);
+				if (result == null)
+					result = defaultCase(theEObject);
+				return result;
+			}
+			default :
+				return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Auxiliary</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Auxiliary</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAuxiliary(Auxiliary object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Call</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Call</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCall(Call object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Create</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Create</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCreate(Create object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Derive</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Derive</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDerive(Derive object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Destroy</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Destroy</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDestroy(Destroy object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Document</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Document</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDocument(Document object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>File</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>File</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFile(File object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Entity</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Entity</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEntity(Entity object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Executable</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Executable</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExecutable(Executable object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Focus</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Focus</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFocus(Focus object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Framework</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Framework</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFramework(Framework object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Implement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Implement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseImplement(Implement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Implementation Class</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Implementation Class</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseImplementationClass(ImplementationClass object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Instantiate</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Instantiate</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInstantiate(Instantiate object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Library</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Library</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLibrary(Library object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Metaclass</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Metaclass</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseMetaclass(Metaclass object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Model Library</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Model Library</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseModelLibrary(ModelLibrary object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Process</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Process</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProcess(org.eclipse.uml2.uml.profile.l2.Process object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Realization</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Realization</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRealization(Realization object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Refine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Refine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRefine(Refine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Responsibility</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Responsibility</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseResponsibility(Responsibility object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Script</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Script</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseScript(Script object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Send</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Send</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSend(Send object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Service</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Service</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseService(Service object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Source</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Source</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSource(Source object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Specification</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSpecification(Specification object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Subsystem</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Subsystem</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSubsystem(Subsystem object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Trace</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Trace</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTrace(Trace object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseType(Type object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Utility</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Utility</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseUtility(Utility object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //L2Switch
diff --git a/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2Validator.java b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2Validator.java
new file mode 100644
index 0000000..6675529
--- /dev/null
+++ b/plugins/org.eclipse.uml2.uml.profile.l2/src/org/eclipse/uml2/uml/profile/l2/util/L2Validator.java
@@ -0,0 +1,981 @@
+/*
+ * Copyright (c) 2011 CEA and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   CEA - initial API and implementation
+ *
+ */
+package org.eclipse.uml2.uml.profile.l2.util;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.EObjectValidator;
+
+import org.eclipse.uml2.uml.profile.l2.Auxiliary;
+import org.eclipse.uml2.uml.profile.l2.Call;
+import org.eclipse.uml2.uml.profile.l2.Create;
+import org.eclipse.uml2.uml.profile.l2.Derive;
+import org.eclipse.uml2.uml.profile.l2.Destroy;
+import org.eclipse.uml2.uml.profile.l2.Document;
+import org.eclipse.uml2.uml.profile.l2.Entity;
+import org.eclipse.uml2.uml.profile.l2.Executable;
+import org.eclipse.uml2.uml.profile.l2.File;
+import org.eclipse.uml2.uml.profile.l2.Focus;
+import org.eclipse.uml2.uml.profile.l2.Framework;
+import org.eclipse.uml2.uml.profile.l2.Implement;
+import org.eclipse.uml2.uml.profile.l2.ImplementationClass;
+import org.eclipse.uml2.uml.profile.l2.Instantiate;
+import org.eclipse.uml2.uml.profile.l2.L2Package;
+import org.eclipse.uml2.uml.profile.l2.L2Plugin;
+import org.eclipse.uml2.uml.profile.l2.Library;
+import org.eclipse.uml2.uml.profile.l2.Metaclass;
+import org.eclipse.uml2.uml.profile.l2.ModelLibrary;
+import org.eclipse.uml2.uml.profile.l2.Realization;
+import org.eclipse.uml2.uml.profile.l2.Refine;
+import org.eclipse.uml2.uml.profile.l2.Responsibility;
+import org.eclipse.uml2.uml.profile.l2.Script;
+import org.eclipse.uml2.uml.profile.l2.Send;
+import org.eclipse.uml2.uml.profile.l2.Service;
+import org.eclipse.uml2.uml.profile.l2.Source;
+import org.eclipse.uml2.uml.profile.l2.Specification;
+import org.eclipse.uml2.uml.profile.l2.Subsystem;
+import org.eclipse.uml2.uml.profile.l2.Trace;
+import org.eclipse.uml2.uml.profile.l2.Type;
+import org.eclipse.uml2.uml.profile.l2.Utility;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Validator</b> for the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.uml2.uml.profile.l2.L2Package
+ * @generated
+ */
+public class L2Validator
+		extends EObjectValidator {
+
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final L2Validator INSTANCE = new L2Validator();
+
+	/**
+	 * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.common.util.Diagnostic#getSource()
+	 * @see org.eclipse.emf.common.util.Diagnostic#getCode()
+	 * @generated
+	 */
+	public static final String DIAGNOSTIC_SOURCE = "org.eclipse.uml2.uml.profile.l2"; //$NON-NLS-1$
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Client And Supplier Are Operations' of 'Call'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int CALL__CLIENT_AND_SUPPLIER_ARE_OPERATIONS = 1;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Client And Supplier Are Classifiers' of 'Create'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int CREATE__CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS = 2;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Implements Specification' of 'Implement'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int IMPLEMENT__IMPLEMENTS_SPECIFICATION = 3;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Cannot Be Realization' of 'Implementation Class'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int IMPLEMENTATION_CLASS__CANNOT_BE_REALIZATION = 4;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Client And Supplier Are Classifiers' of 'Instantiate'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int INSTANTIATE__CLIENT_AND_SUPPLIER_ARE_CLASSIFIERS = 5;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Cannot Be Implementation Class' of 'Realization'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int REALIZATION__CANNOT_BE_IMPLEMENTATION_CLASS = 6;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Client Operation Sends Supplier Signal' of 'Send'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int SEND__CLIENT_OPERATION_SENDS_SUPPLIER_SIGNAL = 7;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Cannot Be Type' of 'Specification'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int SPECIFICATION__CANNOT_BE_TYPE = 8;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Cannot Be Specification' of 'Type'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int TYPE__CANNOT_BE_SPECIFICATION = 9;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Is Utility' of 'Utility'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int UTILITY__IS_UTILITY = 10;
+
+	/**
+	 * A constant with a fixed name that can be used as the base value for additional hand written constants.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 10;
+
+	/**
+	 * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public L2Validator() {
+		super();
+	}
+
+	/**
+	 * Returns the package of this validator switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EPackage getEPackage() {
+		return L2Package.eINSTANCE;
+	}
+
+	/**
+	 * Calls <code>validateXXX</code> for the corresponding classifier of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected boolean validate(int classifierID, Object value,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		switch (classifierID) {
+			case L2Package.AUXILIARY :
+				return validateAuxiliary((Auxiliary) value, diagnostics,
+					context);
+			case L2Package.CALL :
+				return validateCall((Call) value, diagnostics, context);
+			case L2Package.CREATE :
+				return validateCreate((Create) value, diagnostics, context);
+			case L2Package.DERIVE :
+				return validateDerive((Derive) value, diagnostics, context);
+			case L2Package.DESTROY :
+				return validateDestroy((Destroy) value, diagnostics, context);
+			case L2Package.DOCUMENT :
+				return validateDocument((Document) value, diagnostics, context);
+			case L2Package.FILE :
+				return validateFile((File) value, diagnostics, context);
+			case L2Package.ENTITY :
+				return validateEntity((Entity) value, diagnostics, context);
+			case L2Package.EXECUTABLE :
+				return validateExecutable((Executable) value, diagnostics,
+					context);
+			case L2Package.FOCUS :
+				return validateFocus((Focus) value, diagnostics, context);
+			case L2Package.FRAMEWORK :
+				return validateFramework((Framework) value, diagnostics,
+					context);
+			case L2Package.IMPLEMENT :
+				return validateImplement((Implement) value, diagnostics,
+					context);
+			case L2Package.IMPLEMENTATION_CLASS :
+				return validateImplementationClass((ImplementationClass) value,
+					diagnostics, context);
+			case L2Package.INSTANTIATE :
+				return validateInstantiate((Instantiate) value, diagnostics,
+					context);
+			case L2Package.LIBRARY :
+				return validateLibrary((Library) value, diagnostics, context);
+			case L2Package.METACLASS :
+				return validateMetaclass((Metaclass) value, diagnostics,
+					context);
+			case L2Package.MODEL_LIBRARY :
+				return validateModelLibrary((ModelLibrary) value, diagnostics,
+					context);
+			case L2Package.PROCESS :
+				return validateProcess(
+					(org.eclipse.uml2.uml.profile.l2.Process) value,
+					diagnostics, context);
+			case L2Package.REALIZATION :
+				return validateRealization((Realization) value, diagnostics,
+					context);
+			case L2Package.REFINE :
+				return validateRefine((Refine) value, diagnostics, context);
+			case L2Package.RESPONSIBILITY :
+				return validateResponsibility((Responsibility) value,
+					diagnostics, context);
+			case L2Package.SCRIPT :
+				return validateScript((Script) value, diagnostics, context);
+			case L2Package.SEND :
+				return validateSend((Send) value, diagnostics, context);
+			case L2Package.SERVICE :
+				return validateService((Service) value, diagnostics, context);
+			case L2Package.SOURCE :
+				return validateSource((Source) value, diagnostics, context);
+			case L2Package.SPECIFICATION :
+				return validateSpecification((Specification) value,
+					diagnostics, context);
+			case L2Package.SUBSYSTEM :
+				return validateSubsystem((Subsystem) value, diagnostics,
+					context);
+			case L2Package.TRACE :
+				return validateTrace((Trace) value, diagnostics, context);
+			case L2Package.TYPE :
+				return validateType((Type) value, diagnostics, context);
+			case L2Package.UTILITY :
+				return validateUtility((Utility) value, diagnostics, context);
+			default :
+				return true;
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateAuxiliary(Auxiliary auxiliary,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(auxiliary, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCall(Call call, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(call, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(call, diagnostics,
+			context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(call, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(call, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(call,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(call, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(call, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(call, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(call, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateCall_validateClientAndSupplierAreOperations(call,
+				diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateClientAndSupplierAreOperations constraint of '<em>Call</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCall_validateClientAndSupplierAreOperations(
+			Call call, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return call
+			.validateClientAndSupplierAreOperations(diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCreate(Create create, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(create, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(create,
+			diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(create, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(create, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(create,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(create, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(create, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(create, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(create, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateCreate_validateClientAndSupplierAreClassifiers(
+				create, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateClientAndSupplierAreClassifiers constraint of '<em>Create</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateCreate_validateClientAndSupplierAreClassifiers(
+			Create create, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return create.validateClientAndSupplierAreClassifiers(diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateDerive(Derive derive, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(derive, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateDestroy(Destroy destroy,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(destroy, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateDocument(Document document,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(document, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateFile(File file, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(file, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateEntity(Entity entity, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(entity, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateExecutable(Executable executable,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(executable, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateFocus(Focus focus, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(focus, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateFramework(Framework framework,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(framework, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateImplement(Implement implement,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(implement, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(implement,
+			diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(implement, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(implement,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(implement,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(implement, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(implement, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(implement, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(implement, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validateImplement_validateImplementsSpecification(
+				implement, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateImplementsSpecification constraint of '<em>Implement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateImplement_validateImplementsSpecification(
+			Implement implement, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return implement.validateImplementsSpecification(diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateImplementationClass(
+			ImplementationClass implementationClass,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(implementationClass, diagnostics,
+			context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(
+			implementationClass, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(implementationClass,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(implementationClass,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(
+				implementationClass, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(implementationClass,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(implementationClass, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(implementationClass, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(implementationClass,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateImplementationClass_validateCannotBeRealization(
+				implementationClass, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateCannotBeRealization constraint of '<em>Implementation Class</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateImplementationClass_validateCannotBeRealization(
+			ImplementationClass implementationClass,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return implementationClass.validateCannotBeRealization(diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateInstantiate(Instantiate instantiate,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(instantiate, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(instantiate,
+			diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(instantiate, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(instantiate,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(instantiate,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(instantiate, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(instantiate, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(instantiate, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(instantiate, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validateInstantiate_validateClientAndSupplierAreClassifiers(
+				instantiate, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateClientAndSupplierAreClassifiers constraint of '<em>Instantiate</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateInstantiate_validateClientAndSupplierAreClassifiers(
+			Instantiate instantiate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return instantiate.validateClientAndSupplierAreClassifiers(diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateLibrary(Library library,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(library, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateMetaclass(Metaclass metaclass,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(metaclass, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateModelLibrary(ModelLibrary modelLibrary,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(modelLibrary, diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateProcess(
+			org.eclipse.uml2.uml.profile.l2.Process process,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(process, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateRealization(Realization realization,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(realization, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(realization,
+			diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(realization, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(realization,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(realization,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(realization, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(realization, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(realization, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(realization, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validateRealization_validateCannotBeImplementationClass(
+				realization, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateCannotBeImplementationClass constraint of '<em>Realization</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateRealization_validateCannotBeImplementationClass(
+			Realization realization, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return realization.validateCannotBeImplementationClass(diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateRefine(Refine refine, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(refine, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateResponsibility(Responsibility responsibility,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(responsibility, diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateScript(Script script, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(script, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateSend(Send send, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(send, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(send, diagnostics,
+			context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(send, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(send, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(send,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(send, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(send, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(send, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(send, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateSend_validateClientOperationSendsSupplierSignal(
+				send, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateClientOperationSendsSupplierSignal constraint of '<em>Send</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateSend_validateClientOperationSendsSupplierSignal(
+			Send send, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return send.validateClientOperationSendsSupplierSignal(diagnostics,
+			context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateService(Service service,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(service, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateSource(Source source, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(source, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateSpecification(Specification specification,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(specification, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(specification,
+			diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(specification,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(specification,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(
+				specification, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(specification, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(specification, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(specification, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(specification, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validateSpecification_validateCannotBeType(specification,
+				diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateCannotBeType constraint of '<em>Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateSpecification_validateCannotBeType(
+			Specification specification, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return specification.validateCannotBeType(diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateSubsystem(Subsystem subsystem,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(subsystem, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateTrace(Trace trace, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return validate_EveryDefaultConstraint(trace, diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateType(Type type, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(type, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(type, diagnostics,
+			context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(type, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(type, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(type,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(type, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(type, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(type, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(type, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateType_validateCannotBeSpecification(type,
+				diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateCannotBeSpecification constraint of '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateType_validateCannotBeSpecification(Type type,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return type.validateCannotBeSpecification(diagnostics, context);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateUtility(Utility utility,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (!validate_NoCircularContainment(utility, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(utility,
+			diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(utility, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(utility, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(utility,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(utility, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(utility, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(utility, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(utility, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validateUtility_validateIsUtility(utility, diagnostics,
+				context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateIsUtility constraint of '<em>Utility</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateUtility_validateIsUtility(Utility utility,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return utility.validateIsUtility(diagnostics, context);
+	}
+
+	/**
+	 * Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return L2Plugin.INSTANCE;
+	}
+
+} //L2Validator
